Hora del sistema NTP diferente de la hora del hardware

Hora del sistema NTP diferente de la hora del hardware

en un servidor centos 6.5 acabo de ejecutar ntp con:

service ntpd start

Tiene la hora del sistema fija, pero la hora del hardware sigue siendo incorrecta. ¿Esto es normal? ¿Cómo puedo arreglarlo?

ntpstat informa:

unsynchronized
polling server every 64s

Respuesta1

En primer lugar: la hora del hardware en un sistema Linux se almacena en UTC, por lo que es de esperar un desplazamiento relacionado con su zona horaria. Y sí, esto genera problemas durante el arranque dual.

Además de eso, un sistema Linux no siempre propagará inmediatamente la hora NTP al RTC ("reloj de hardware"), pero debería hacerlo al menos al apagarse.

Respuesta2

Es posible que el NTP esté corrigiendo la hora, pero lentamente. Normalmente lo hace para evitar que los programas se enfaden por haber pasado N segundos en una fracción de segundo. Muchos programas aprovechan el tiempo para ordenar su trabajo internamente.

Entonces, el reloj cambia para aumentar o disminuir los segundos ligeramente, digamos 0,1 segundos cada segundo (o incluso menos). Puede llevar algún tiempo sincronizar ambos relojes.

Verifique la diferencia horaria y vea si disminuye con el tiempo.

Si la diferencia persiste después de un apagado "ordenado" (es decir, un apagado, no un apagado del hardware), debe verificar si el sistema está programado correctamente. En mi sistema, esto se hace en un archivo de comando que se ejecuta al apagar:

/etc/rc.d/rc.0 contiene:

# 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

Puedes probar el comando manualmente: sudo hwclock --systohc. Si eso no funciona, es posible que tengas un problema de hardware.

¿La importancia de tener ambos relojes sincronizados? Depende del software que esté ejecutando. El reloj del hardware se utiliza para configurar sysclock al inicio. Hasta que NTP se active, su máquina usa ese tiempo. Cualquier archivo utilizado durante ese lapso se marca con la hora incorrecta. Esto podría ser importante para algunos...

Respuesta3

Como las respuestas existentes pasan por alto el hecho más importante, les digo: NTP ajusta elreloj del sistema(reloj de software). Sin embargo, ajustar el reloj del sistema en Linuxno esajustar el reloj del hardware(En realidad, escribí un parche hace unos 20 años que soluciona ese problema, pero nunca fue aceptado).

Lo que normalmente hacen los sistemas actuales es actualizar el reloj del hardware desde la hora del sistema, ya sea durantelimpioapagado, o en un trabajo periódico.

El problema con la actualización del reloj del hardware es que el kernel no sabe si el reloj del hardware está configurado en la hora local o en UTC, por lo que tiene que aplicar algún desplazamiento desconocido al actualizar el reloj del hardware. El otro problema es que Linux tenía algún código roto (no revisé los últimos 20 años) para actualizar los minutos y segundos del reloj del hardware desde el reloj del sistema si este último está marcado como "sincronizado".

El código antiguo alguna vez fue:

     * 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 */

información relacionada