Comment forcer une mise à jour d'horloge en utilisant ntp?

J'exécute Ubuntu sur un système embarqué basé sur ARM qui n'a pas de RTC soutenu par une batterie. L'heure du réveil est quelque part en 1970. Ainsi, j'utilise le service NTP pour mettre à jour l'heure à l'heure actuelle.

J'ai ajouté la ligne suivante à /etc/rc.local fichier:

sudo ntpdate -s time.nist.gov

Cependant, après le démarrage, il faut encore quelques minutes pour que l'heure soit mise à jour, période pendant laquelle je ne peux pas travailler efficacement avec tar et make.

Comment puis-je forcer une mise à jour de l'horloge à un moment donné?


MISE À JOUR 1: Ce qui suit (merci à Eric et Stephan) fonctionne bien à partir de la ligne de commande, mais ne parvient pas à mettre à jour l'horloge lorsqu'elle est mise en /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'est-ce que je fais de mal?


MISE À JOUR 2: J'ai essayé de suivre les quelques suggestions qui sont venues en réponse à la 1ère mise à jour, mais rien ne semble réellement faire le travail comme requis. Voici ce que j'ai essayé:

  1. Remplacez le serveur par us.pool.ntp.org
  2. Utiliser des chemins explicites vers les programmes
  3. Retirez le ntp service tout à fait et laisser juste sudo ntpdate ... dans rc.local
  4. Retirez le sudo de la commande ci-dessus dans rc.local

En utilisant ce qui précède, la machine démarre toujours à 1970. Cependant, lorsque vous le faites à partir de la ligne de commande une fois connecté (via ssh), l'horloge est mise à jour dès que j'invoque ntpdate.

La dernière chose que j'ai faite a été de retirer ça de rc.local et passez un appel à ntpdate dans mon .bashrc fichier. Cela met à jour l'horloge comme prévu, et j'obtiens la véritable heure actuelle une fois que l'invite de commande est disponible.

Cependant, cela signifie que si la machine est allumée et qu'aucun utilisateur n'est connecté, l'heure n'est jamais mise à jour. Je peux, bien sûr, réinstaller le ntp service donc au moins l'horloge est mise à jour quelques minutes après le démarrage, mais nous sommes de retour à la case départ.

Alors, y a-t-il une raison pour laquelle placer le ntpdate commande dans rc.local n'effectue pas la tâche requise, tout en le faisant dans .bashrc fonctionne bien?

Au lieu de ntpdate (qui est obsolète), utiliser ntpd:

sudo service ntp stopsudo ntpd -gqsudo service ntp start

Le -gq indique au démon ntp de corriger l'heure quel que soit le décalage (g) et quitter immédiatement (q) après avoir réglé l'heure.

Probablement le ntp le service est en cours d'exécution, c'est pourquoi ntpdate impossible d'ouvrir le socket (port 123 UDP) et de se connecter au serveur ntp.

Essayez à partir de la ligne de commande:

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

Si tu veux mettre ça dedans /etc/rc.local utilisez ce qui suit:

( /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 )&

Utilisez sntp pour régler l'heure immédiatement. Quelques exemples tirés de sa page de manuel:

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.

Il fonctionne avec n'importe quel serveur de temps ntp. Une liste pratique des serveurs peut être trouvée sur ntppool.org.

Vous avez besoin sudo les privilèges, par exemple:

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

Utiliser timedatectl (unité de service systemd) pour régler l'heure. ntp est obsolète.

sudo systemctl restart systemd-timesyncd.service

Vous pouvez vérifier que l'heure a été mise à jour en lisant les journaux avec journalctl -xe | tail.

Statut avec timedatectl status et config dans /etc/systemd/timesyncd.conf.

Référence

Comme d'autres l'ont souligné, la meilleure solution consiste à demander à ntpd d'ignorer le seuil de panique, qui est de 1000 secondes par défaut. Vous pouvez configurer le seuil de panique de deux manières:

  • modifier /etc/default/ntp et assurez-vous que l'option-g est présente.
  • éditez /etc / ntp.conf et lieu tinker panic 0 au sommet

Jusqu'à présent, c'est essentiellement ce que d'autres ont recommandé, mais il y a une étape de plus que je pense que vous devriez franchir. Installez le programme 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.

Avec fake-hwclock installé, votre machine ne démarrera pas en pensant que c'est 1970 à nouveau. Lorsque votre machine démarre, elle règle son horloge sur l'horodatage fake-hwclock écrit lors du dernier redémarrage / arrêt. Cela signifie que vous pouvez avoir une horloge quelque peu correcte au cas où il y aurait des problèmes de réseau lors du démarrage.

ntpdate est un programme différent du net dameon. NTPDate est probablement une erreur au démarrage car ntpd s'exécute sur ce socket.

À partir de la ligne de commande, exécutez

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

Vous pouvez également désinstaller ntpd tous ensemble (apt-get remove ntp) et ajouter un script cron pour utiliser ntpdate toutes les heures environ.

METTRE

le service ntp n'aura probablement pas de valeur significative pour vous sur ce système, alors supprimez-le d'abord.

# sudo apt-get remove ntp

Ajoutez maintenant la commande:

ntpdate -sb time.nist.gov

de /etc/rclocal

Redémarrer. Devrait être bon à ce stade.

rdate -s tick.greyware.com

si tout ce que vous voulez faire est de régler l'horloge une fois, simple

Notez que certains systèmes basés sur Ubuntu actuels n'utilisent même pas le service NTP par défaut maintenant. Sur ma machine Linux Mint 19 (Ubuntu 18.04), le temps est conservé par systemd-timesyncd.

Donc, pour obtenir une heure à jour après la perte de synchronisation, je lance simplement

sudo systemctl restart systemd-timesyncd

Depuis la 15.04 Ubuntu utilise systemd par défaut. Par conséquent, les systèmes critiques comme le temps sont gérés via systemd. Pour trouver le service que votre système utilise, exécutez quelque chose comme

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

Pour TechJS le 16.04, le service était ntp. Pour moi-même sur Ubuntu 18.04 (Mint 19) le service est systemd-timesyncd. Fait intéressant, je me suis connecté à un serveur 16.04 que j'ai et il utilise systemd-timesyncd Aussi.

La bonne façon de le faire sur un système Debian / Mint / Ubuntu (ou un autre dérivé de Debian) est d'avoir la ligne

NTPD_OPTS="-g"

dans le dossier

/etc/default/ntp

Cela garantit que lorsque ntpd est démarré à partir du fichier /etc / init.script d / ntp, il s'exécute avec l'option "- g", à savoir

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

pour permettre à ntpd de corriger l'heure système lorsqu'elle dépasse 1000 s, par exemple lorsque l'heure système est le 1er janvier 1970 au démarrage car il n'y a pas de RTC matériel.

tlsdate définit l'horloge locale en se connectant de manière sécurisée avec TLS aux serveurs distants et en extrayant l'heure distante de la prise de contact sécurisée. Contrairementntpdate, tlsdate utilise TCP, par exemple en se connectant à un service distant compatible HTTPS ou TLS, et offre une certaine protection contre les adversaires qui tentent de vous fournir des informations temporelles malveillantes.

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

de ici:
'ntpdate-s ntp.ubuntu.com`

notez l’indicateur '- b ’ sur ntpdate. Depuis la page de manuel de ntpdate: "Forcez l’heure à être décalée à l’aide de l’appel système settimeofday (), plutôt que pivotée (par défaut) à l’aide de l’appel système adjtime (). Cette option doit être utilisée lorsqu’elle est appelée à partir d’un fichier de démarrage au démarrage."Beaucoup des réponses ci-dessous ne l’incluent pas, et cela fait peut-être partie du problème pour que les choses fonctionnent. Considérez que l’indicateur "- B "mentionne que les décalages de plus de 128 ms peuvent prendre des heures à synchroniser en utilisant le mécanisme de “balayage” par défaut

‘timedatectl’, mais How to update system time behind a proxy? - Ask Ubuntu

Il n’est pas nécessaire d’utiliser sudo dans /etc/rc.fichiers de paramètres régionaux … ils sont déjà tous exécutés en tant que root.