434 votes

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

Je fais tourner Ubuntu sur un système embarqué basé sur ARM qui ne dispose pas d'un RTC alimenté par une batterie. L'heure de réveil se situe quelque part en 1970. J'utilise donc 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 les services suivants tar y make .

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


UPDATE 1 : La méthode suivante (merci à Eric et Stephan) fonctionne bien en ligne de commande, mais ne met pas à jour l'horloge lorsqu'elle est utilisée /etc/rc.local :

$ date ; sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start ; date
Thu 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 ?


UPDATE 2 : J'ai essayé de suivre les quelques suggestions qui ont été faites en réponse à la première mise à jour, mais rien ne semble vraiment faire le travail demandé. Voici ce que j'ai essayé :

  1. Remplacer le serveur pour us.pool.ntp.org
  2. Utiliser des chemins explicites vers les programmes
  3. Retirer le ntp service et de ne laisser que sudo ntpdate ... en rc.local
  4. Retirer 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 l'on effectue cette opération à partir de la ligne de commande une fois connecté (par le biais de ssh ), l'horloge est mise à jour dès que j'invoque la fonction ntpdate .

La dernière chose que j'ai faite, c'est de retirer ça de rc.local et passer 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 L'horloge est donc au moins mise à jour quelques minutes après le démarrage, mais nous sommes ensuite de retour à la case départ.

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

5 votes

De [ici][1] : ntpdate -s ntp.ubuntu.com [1] : askubuntu.com/a/81301/130162

5 votes

Remarquez le drapeau '-b' sur ntpdate. De la page de manuel de ntpdate : "Force le temps à être échelonné en utilisant l'appel système settimeofday(), plutôt que d'être pivoté (par défaut) en utilisant l'appel système adjtime(). Cette option doit être utilisée lorsqu'elle est appelée depuis un fichier de démarrage au moment du démarrage." De nombreuses réponses ci-dessous ne l'incluent pas, et cela fait peut-être partie du problème pour faire fonctionner les choses. Considérez que le drapeau '-B' mentionne que les décalages de plus de 128 ms peuvent prendre des heures à synchroniser en utilisant le mécanisme 'slew' par défaut.

0 votes

Il n'est pas nécessaire d'utiliser sudo dans les fichiers /etc/rc.locale ils sont déjà exécutés en tant que root.

559voto

Martin Schröder Points 6325

Au lieu de ntpdate (qui est déprécié ), utilisez ntpd :

sudo service ntp stop
sudo ntpd -gq
sudo service ntp start

El -gq indique au démon ntp de corriger l'heure indépendamment du décalage ( g ) et sortir immédiatement ( q ) après avoir réglé l'heure.

3 votes

Merci. Il y a toujours 1970 après cette commande (avec sudo). Lecture de ntpd manpage, je ne suis pas sûr que cela force une mise à jour ?

12 votes

L'option "-q" demande au démon NTP de démarrer, de régler l'heure et de quitter immédiatement. L'option "-g" lui permet de corriger les différences de temps supérieures à 1000 secondes. A plus long terme, vous devriez simplement configurer le démon NTP pour qu'il tourne en permanence.

40 votes

Cette réponse devrait figurer en tête de liste, car elle est correcte : ntpdate est déprécié et son installation est une mauvaise idée, car il entre en conflit avec ntp. Si l'horloge est très décalée, vous devez faire cette étape manuelle car sinon ntp ne changera pas votre horloge et ne vous dira pas pourquoi.

365voto

Eric Carvalho Points 51571

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

Essayez en ligne de commande :

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

Si vous voulez mettre cela dans /etc/rc.local utilisez ce qui suit :

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

0 votes

Merci. Pouvez-vous expliquer pourquoi vous avez besoin des chemins explicites ?

2 votes

Je ne sais pas vraiment. :-) J'ai eu des problèmes une fois en essayant d'exécuter service de rc.local et cron mais j'ai réussi à le corriger en utilisant /etc/init.d/xxx à la place. En fait, je pense que vous n'avez pas besoin de donner le chemin complet à ntpdate J'aime utiliser les chemins complets dans les scripts pour être sûr que le bon fichier sera trouvé.

0 votes

J'ai essayé de changer rc.local en conséquence, mais alors l'horloge ne sera pas mise à jour du tout, même pas depuis la ligne de commande.

68voto

Guest Points 681

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 de serveurs peut être trouvée sur ntppool.org.

Vous devez sudo les privilèges, par exemple :

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

8 votes

Cela a fonctionné alors que "sudo ntpd -gq" n'a pas fonctionné.

1 votes

Impossible de localiser le paquet sntp ?

1 votes

Apt-get install sntp / yum install sntp (oui cela fonctionne sur CentOS,RedHat,fedore aussi)

54voto

xiaoyifang Points 657

Utilice timedatectl (unité de service systemd) pour définir l'heure. ntp est déprécié.

sudo systemctl restart systemd-timesyncd.service

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

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

Référence

2 votes

Cela a fonctionné sur Ubuntu 19.04. Merci !

3 votes

ntp n'est pas installé sur Ubuntu 18.04 et au-delà et il ne devrait pas être installé

9 votes

Les autres réponses sont très dépréciées et pour la plupart non fonctionnelles. Cette réponse devrait être la nouvelle réponse acceptée, car elle est la plus récente et la plus efficace. Les seuls qui ont besoin d'une autre réponse sont les utilisateurs d'un système d'exploitation sans système.

42voto

dfc Points 1467

Comme d'autres l'ont souligné, la meilleure solution est de 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 :

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

Jusqu'à présent, c'est essentiellement ce que les autres ont recommandé, mais il y a une étape supplémentaire que je pense que vous devriez prendre. Installez le programme fake-hwclock :

# apt-get install fake-hwclock

fake-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 l'année 1970 qui recommence. Lorsque votre machine démarre, elle règle son horloge sur l'horodatage que fake-hwclock a écrit lors du dernier redémarrage/arrêt. Cela signifie que vous pouvez avoir une horloge plus ou moins correcte au cas où il y aurait des problèmes de réseau au démarrage.

1 votes

-g semble ne rien faire pour moi (à la ligne de commande, je n'ai pas de /etc/default/ntp ), mais en ajoutant tinker panic 0 a ntp.conf a travaillé

0 votes

@Sahuagin Je ne sais pas quoi vous dire à part que vous avez un paquet ntp non standard. /etc/default/ntp fait partie du paquetage d'Ubuntu : packages.ubuntu.com/xenial/amd64/ntp/filelist et -g est une option depuis aussi longtemps que je me souvienne.

0 votes

Désolé, je suppose que je ne suis pas vraiment sous Ubuntu et que j'aurais dû réfléchir un peu plus avant de commenter. tinker panic 0 semble avoir fonctionné.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X