¿Existe un mecanismo existente que sincronice un sistema Linux con NTP mientras está en línea, y con un RTC de deriva predecible mientras está fuera de línea?
Operamos "recopiladores" remotos: sistemas Linux integrados que recopilan y marcan los datos del sensor. Necesitamos que sus errores de reloj se mantengan razonablemente pequeños, digamos por debajo de 5 segundos. Usualmente usamos NTP para sincronizar sus relojes, y eso funciona bien, siempre y cuando el sistema esté en línea.
El problema es que algunos coleccionistas tienen enlaces ascendentes muy malos que pueden fallar durante horas, días o incluso semanas. Eso no detiene la recopilación de datos local, pero sin NTP, el reloj del sistema Linux se mueve mal y de manera bastante impredecible.
OTOH, el RTC del hardware también se desplaza fuertemente, pero a un ritmo constante. La tasa de deriva RTC varía de una placa a otra, pero es constante por placa y puede medirse.
Supongo que lo que necesitamos es un mecanismo que haga lo siguiente:
- Mida la tasa de deriva de RTC de una placa antes de su despliegue
- Ajuste el tiempo del sistema en curso / regularmente a través de NTP cuando sea posible
- Ajuste la hora del sistema regularmente desde RTC cuando NTP no esté disponible. Tenga en cuenta la tasa de deriva RTC conocida.
- Opcional: Mida y registre la tasa de deriva RTC en curso mientras está en línea (1)
Con 'mecanismo' me refiero a una pieza de software y / o configuración bien mantenida y documentada que puede manejar los dos estados "en línea" vs. "fuera de línea", asegúrese de que el reloj del sistema esté sincronizado con la fuente de tiempo correcta (ntp vs. rtc), detecta el cambio de estado y corrige la deriva del RTC. No importa mucho si se implementa como un complemento / configuración ntpd especial, como un demonio separado, como un trabajo cron o de lo contrario.
Eché un vistazo a Chrony , pero de acuerdo con su documentación , trata de predecir la deriva del reloj del sistema , que en nuestro caso deriva mucho más imprevisiblemente que el RTC. Chrony parece usar el RTC solo para mantener el tiempo entre reinicios.
(1) Nota: ntpd activa el 'modo de 11 minutos' del núcleo (actualiza rtc desde el reloj del sistema cada 11 minutos). Parece que no hay formas con los núcleos actuales y ntpd para evitar el modo de 11 minutos. Por lo tanto, cualquier información de deriva rtc se pierde mientras se ejecuta ntpd (thx @billthor).
Actualizaciones / ediciones:
- Estamos considerando agregar un radio reloj externo para la señal MSF o DCF77 (estamos en Europa) a través de USB o serie. Pero preferimos mantener el hardware delgado.
- Nuestros colectores están ubicados en interiores, a menudo en el sótano. Por lo tanto, agregar relojes GPS no ayudará.
- Usamos Debian 7. Eso significa hwclock de util-linux-2.20.1, ntpdate-4.2.6p5, ntpd de ntp-4.2.6.p5, chrony-1.24 (potencialmente 1.30).
- Tenga en cuenta que nuestro problema no es que no sabemos cómo utilizar
ntpdate(8)
,hwclock(8)
,date(1)
, etc Por favor, consulte la sección añadida en cursiva sobre lo que quiero decir con 'mecanismo'. - Se agregó una nota al pie sobre el 'modo de 11 minutos'
- Aquí hay una discusión muy interesante sobre la sincronización fuera de línea y la deriva de RTC