Cómo forzar una actualización de reloj usando NTP?

Estoy ejecutando Ubuntu en un sistema integrado basado en ARM que carece de un RTC con respaldo de batería. La hora de despertar es en algún lugar durante 1970. Por lo tanto, utilizo el servicio NTP para actualizar la hora a la hora actual.

Agregué la siguiente línea a /etc/rc.local file:

sudo ntpdate -s time.nist.gov

Sin embargo, después del inicio, todavía toma un par de minutos hasta que se actualiza la hora, período durante el cual no puedo trabajar de manera efectiva tar y make.

¿Cómo puedo forzar una actualización de reloj en un momento dado?


ACTUALIZACIÓN 1: Lo siguiente (gracias a Eric y Stephan) funciona bien desde la línea de comandos, pero no actualiza el reloj cuando se ingresa /etc/rc.local:

$ date ; sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start ; dateThu Jan  1 00:00:58 UTC 1970 * Stopping NTP server ntpd     [ OK ]  * Starting NTP server          [ OK ] Thu Feb 14 18:52:21 UTC 2013

¿Qué estoy haciendo mal?


ACTUALIZACIÓN 2: Intenté seguir las pocas sugerencias que surgieron en respuesta a la primera actualización, pero nada parece hacer el trabajo según lo requerido. Esto es lo que intenté:

  1. Reemplace el servidor para us.pool.ntp.org
  2. Usar rutas explícitas a los programas
  3. Retire el ntp servicio completo y dejar solo sudo ntpdate ... en rc.local
  4. Retire el sudo desde el comando anterior en rc.local

Usando lo anterior, la máquina aún comienza en 1970. Sin embargo, al hacer esto desde la línea de comandos una vez que haya iniciado sesión (a través de ssh), el reloj se actualiza tan pronto como invoco ntpdate.

Lo último que hice fue quitar eso de rc.local y hacer una llamada a ntpdate en mi .bashrc file. Esto actualiza el reloj como se esperaba, y obtengo la verdadera hora actual una vez que el símbolo del sistema está disponible.

Obstante, esto significa que si la máquina está encendida y ningún usuario ha iniciado sesión, la hora nunca se actualiza. Puedo, por supuesto, reinstalar el ntp servicio, por lo que al menos el reloj se actualiza a los pocos minutos del inicio, pero luego volvemos al cuadrado 1.

Entonces, ¿hay alguna razón por la que colocar el ntpdate comando en rc.local no realiza la tarea requerida, mientras lo hace en .bashrc funciona bien?

En lugar de ntpdate (que es en desuso), utilizar ntpd:

sudo service ntp stopsudo ntpd -gqsudo service ntp start

El -gq indica al demonio ntp que corrija la hora independientemente del desplazamiento (g) y salir inmediatamente (q) después de ajustar la hora.

Probablemente el ntp el servicio se está ejecutando, por eso ntpdate no se puede abrir el socket (puerto 123 UDP) y conectarse al servidor NTP.

Prueba desde la línea de comandos:

sudo service ntp stopsudo ntpdate -s time.nist.govsudo service ntp start

Si quieres poner esto en /etc/rc.local utilice lo siguiente:

( /etc/init.d/ntp stopuntil ping -nq -c3 8.8.8.8; do   echo "Waiting for network..."donentpdate -s time.nist.gov/etc/init.d/ntp start )&

Utilice SNTP para establecer la hora de inmediato. Algunos ejemplos de su página man:

USAGE     sntp ntpserver.somewhere             is the simplest use of this program and can be run as an unprivileged command to check the current time and error in the local clock.     sntp -Ss -M 128 ntpserver.somewhere             With suitable privilege, run as a command or from a cron(8) job, sntp -Ss -M 128 ntpserver.somewhere will request the time from the server, and if that server reports that it is             synchronized then if the offset adjustment is less than 128 milliseconds the correction will be slewed, and if the correction is more than 128 milliseconds the correction  will             be stepped.     sntp -S ntpserver.somewhere             With suitable privilege, run as a command or from a cron(8) job, sntp -S ntpserver.somewhere will set (step) the local clock from a synchronized specified server, like the (dep‐             recated) ntpdate(8), or rdate(8) commands.

Funciona con cualquier servidor de hora NTP. Se puede encontrar una lista conveniente de servidores en ntppool.org.

Usted necesita sudo privilegios, por ejemplo:

sudo sntp -Ss -M 128 0.de.pool.ntp.org

Utilizar timedatectl (unidad de servicio systemd) para establecer la hora. ntp está en desuso.

sudo systemctl restart systemd-timesyncd.service

Puede verificar la hora en que se actualizó leyendo los registros con journalctl -xe | tail.

Estado con timedatectl status y config en /etc/systemd/timesyncd.conf.

Referencia

Como otros han señalado, la mejor solución es indicar a ntpd que ignore el umbral de pánico, que es de 1000 segundos de forma predeterminada. Puede configurar el umbral de pánico de dos maneras:

  • editar /etc/default/ntp y asegúrese de que la opción-g esté presente.
  • edite /etc / ntp.conf y lugar tinker panic 0 en la cima

Hasta ahora, esto es esencialmente lo que otros han recomendado, sin embargo, hay un paso más que creo que debería tomar. Instale el programa fake-hwclock:

# apt-get install fake-hwclockfake-hwclock: Save/restore system clock on machines without working RTC hardware Some machines don't have a working realtime clock (RTC) unit, or no driver for the hardware that does exist. fake-hwclock is a simple set of scripts to save the kernel's current clock periodically (including at shutdown) and restore it at boot so that the system clock keeps at least close to realtime. This will stop some of the problems that may be caused by a system believing it has travelled in time back to 1970, such as needing to perform filesystem checks at every boot. On top of this, use of NTP is still recommended to deal with the fake clock "drifting" while the hardware is halted or rebooting.

Con fake-hwclock instalado, su máquina no se iniciará pensando que es 1970 de nuevo. Cuando su máquina arranque, establecerá su reloj en la marca de tiempo que fake-hwclock escribió durante el último reinicio/apagado. Esto significa que puede tener un reloj algo correcto en caso de que haya problemas de red cuando arranque.

ntpdate es un programa diferente de net dameon. NTPDate probablemente está produciendo un error en el arranque porque ntpd se está ejecutando en ese socket.

Desde la línea de comandos, ejecute

# sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start

También puede desinstalar ntpd todos juntos (apt-get remove ntp) y agregar un script cron para usar ntpdate cada hora aproximadamente.

ACTUALIZAR

el servicio NTP probablemente no tendrá un valor significativo para usted en este sistema, así que elimínelo primero.

# sudo apt-get remove ntp

Ahora agregue el comando:

ntpdate -sb time.nist.gov

a /etc/rclocal

Reiniciar. Debería ser bueno en ese punto.

rdate -s tick.greyware.com

si todo lo que quieres hacer es configurar el reloj una vez, simple

Tenga en cuenta que algunos sistemas actuales basados en Ubuntu ni siquiera usan el servicio NTP de forma predeterminada ahora. En mi máquina Linux Mint 19 (Ubuntu 18.04), el tiempo es guardado por systemd-timesyncd.

Entonces, para obtener una hora actualizada después de que haya perdido la sincronización, simplemente ejecuto

sudo systemctl restart systemd-timesyncd

Desde 15.04 Ubuntu usa systemd por defecto. Por lo tanto, los sistemas críticos como el tiempo se gestionan a través de systemd. Para encontrar qué servicio está utilizando su sistema, ejecute algo como

systemctl list-unit-files | grep -E 'ntp|timesyncd'

Para TechJS en 16.04 el servicio era ntp. Para mí en Ubuntu 18.04 (Mint 19) el servicio es systemd-timesyncd. Curiosamente, inicié sesión en un servidor 16.04 que tengo y usa systemd-timesyncd También.

La forma correcta de hacer esto en un sistema Debian / Mint / Ubuntu (u otro derivado de Debian) es tener la línea

NTPD_OPTS="-g"

en el archivo

/etc/default/ntp

Esto asegura que cuando ntpd se inicia desde /etc/init.d / script ntp, se ejecuta con la opción "- g", a saber

 start-stop-daemon --start --quiet --oknodo --pidfile /var/run/ntpd.pid --startas /usr/sbin/ntpd -- -p /var/run/ntpd.pid -g -u 124:128

para permitir que ntpd corrija la hora del sistema cuando está a más de 1000 s, por ejemplo, cuando la hora del sistema es el 1 de enero de 1970 en el arranque porque no hay RTC de hardware.

tlsdate establece el reloj local conectándose de forma segura con TLS a servidores remotos y extrayendo la hora remota del protocolo de enlace seguro. A diferencia dentpdate, tlsdate utiliza TCP, por ejemplo, para conectarse a un servicio remoto habilitado para HTTPS o TLS, y proporciona cierta protección contra los adversarios que intentan proporcionarle información de tiempo maliciosa.

$ tlsdate -V -n -H encrypted.google.com

desde aquí:
ntpdate-s ntp.ubuntu.com

observe el indicador ‘- b ’ en ntpdate. De la página de manual de ntpdate: "Forzar que el tiempo se escalone usando la llamada al sistema settimeofday (), en lugar de inclinarse (predeterminado) usando la llamada al sistema adjtime (). Esta opción se debe usar cuando se llama desde un archivo de inicio en el momento del arranque."Muchas de las respuestas a continuación no lo incluyen, y eso tal vez sea parte del problema para que las cosas funcionen. Tenga en cuenta que el indicador’ - B ’ menciona que las compensaciones de más de 128 ms pueden tardar horas en sincronizarse utilizando el mecanismo ‘slew’ predeterminado

timedatectl, pero How to update system time behind a proxy? - Ask Ubuntu

No es necesario usar ‘sudo’ en /etc / rc.archivos de configuración regional … ya se ejecutan como root.