Hora do sistema NTP diferente da hora do hardware

Hora do sistema NTP diferente da hora do hardware

em um servidor centos 6.5 acabei de executar o ntp com:

service ntpd start

Ele fixou a hora do sistema, mas a hora do hardware ainda está errada. Isso é normal? Como posso consertar isso?

relatórios ntpstat:

unsynchronized
polling server every 64s

Responder1

Primeiro de tudo: o horário do hardware em um sistema Linux é armazenado em UTC, portanto, é esperado um deslocamento relacionado ao seu fuso horário. E sim, isso causa problemas durante a inicialização dupla.

Além disso, um sistema Linux nem sempre e imediatamente propagará o horário NTP para o RTC ("relógio de hardware"), mas deve fazê-lo pelo menos no desligamento.

Responder2

É possível que o NTP esteja realmente corrigindo a hora, mas lentamente. Normalmente faz isso para evitar que os programas se preocupem por terem passado N segundos em uma fração de segundo. Muitos programas usam o tempo para ordenar seu trabalho internamente.

Portanto, o relógio muda para aumentar ou diminuir os segundos apenas ligeiramente, digamos 0,1 segundo a cada segundo (ou até menos). Pode levar algum tempo para sincronizar os dois relógios.

Verifique a diferença horária e veja se ela diminui com o tempo.

Se a diferença persistir após um desligamento “ordenado” (ou seja, um desligamento, e não um desligamento do hardware), você deverá verificar se o sistema está programado corretamente. No meu sistema, isso é feito em um arquivo de comando executado no desligamento:

/etc/rc.d/rc.0 contém:

# Save the system time to the hardware clock using hwclock --systohc.
if [ -x /sbin/hwclock ]; then
  # Check for a broken motherboard RTC clock (where ioports for rtc are
  # unknown) to prevent hwclock causing a hang:
  if ! grep -q -w rtc /proc/ioports ; then
    CLOCK_OPT="--directisa"
  fi
  if grep -q "^UTC" /etc/hardwareclock 2> /dev/null ; then
    echo "Saving system time to the hardware clock (UTC)."
    /sbin/hwclock $CLOCK_OPT --utc --systohc
  else
    echo "Saving system time to the hardware clock (localtime)."
    /sbin/hwclock  $CLOCK_OPT --localtime --systohc
  fi
fi

Você pode tentar o comando manualmente: sudo hwclock --systohc. Se isso não funcionar, você pode ter um problema de hardware.

A importância de ter os dois relógios sincronizados? Depende de qual software você está executando. O relógio do hardware é usado para definir o sysclock na inicialização. Até que o NTP entre em ação, sua máquina usará esse tempo. Qualquer arquivo usado durante esse lapso é marcado com a hora incorreta. Isso pode ser importante para alguns...

Responder3

Como as respostas existentes ignoram o fato mais importante, estou lhe dizendo: o NTP ajusta orelógio do sistema(relógio de software). No entanto, ajustar o relógio do sistema no Linuxnãoajustar o relógio do hardware(Na verdade, eu escrevi um patch há cerca de 20 anos que corrige esse problema, mas nunca foi aceito).

O que os sistemas atuais normalmente fazem é atualizar o relógio do hardware a partir da hora do sistema durantelimpardesligamento ou em um trabalho periódico.

O problema com a atualização do relógio do hardware é que o kernel não sabe se o relógio do hardware está configurado para a hora local ou UTC, portanto, é necessário aplicar algum deslocamento desconhecido ao atualizar o relógio do hardware. A outra questão é que o Linux tinha algum código quebrado (não verifiquei nos últimos 20 anos) para atualizar os minutos e segundos do relógio do hardware a partir do relógio do sistema se este estiver marcado como "sincronizado".

O código antigo já foi:

     * If we have an externally synchronized Linux clock, then update
     * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
     * called as close as possible to 500 ms before the new second starts.
     */
    if ((time_status & STA_UNSYNC) == 0 &&
        xtime.tv_sec > last_rtc_update + 660 &&
        xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 &&
        xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) {
        if (set_rtc_mmss(xtime.tv_sec) == 0)
            last_rtc_update = xtime.tv_sec;
        else
            last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */

informação relacionada