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

378

J'utilise Ubuntu sur un système intégré basé sur ARM, dépourvu de RTC sauvegardé sur batterie. L’heure de réveil est quelque part au cours de 1970. Ainsi, j’utilise le service NTP pour mettre à jour l’heure à l’heure actuelle.

J'ai ajouté la ligne suivante au /etc/rc.localfichier:

sudo ntpdate -s time.nist.gov

Cependant, après le démarrage, la mise à jour de l'heure prend encore quelques minutes, période au cours de laquelle je ne peux pas travailler efficacement avec taret make.

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


UPDATE 1: Ce qui suit (merci à Eric et Stephan) fonctionne bien en ligne de commande, mais ne parvient pas à mettre à jour l'horloge lorsqu'il est inséré /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 mal?


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

  1. Remplacez le serveur pour us.pool.ntp.org
  2. Utiliser des chemins explicites vers les programmes
  3. Supprimez le ntpservice complètement et laissez juste sudo ntpdate ...dansrc.local
  4. Supprimer la sudode la commande ci-dessus dansrc.local

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

La dernière chose que j'ai faite a été d'enlever cette information rc.localet de la placer ntpdatedans mon .bashrcdossier. Cela met à jour l'horloge comme prévu et j'obtiens l'heure actuelle réelle 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 ne reçoit jamais de mises à jour. Je peux bien sûr réinstaller le ntpservice afin que l'horloge soit au moins mise à jour dans les minutes qui suivent le démarrage, mais nous revenons à la case 1.

Alors, y a-t-il une raison pour laquelle placer la ntpdatecommande dans rc.localn'exécute pas la tâche requise, alors que cela .bashrcfonctionne correctement?

ysap
la source
2
à partir de [ici] [1]: ntpdate -s ntp.ubuntu.com [1]: askubuntu.com/a/81301/130162
18446744073709551615
4
remarquez le drapeau '-b' sur ntpdate. Extrait de la page de manuel de ntpdate: "Forcer le temps à passer en utilisant l'appel système settimeofday (), plutôt qu'en utilisant l'appel système adjtime () (par défaut). Cette option doit être utilisée lorsqu'elle est appelée à partir d'un fichier de démarrage au moment du démarrage." La plupart des réponses ci-dessous ne l'incluent pas, ce qui constitue peut-être une partie du problème pour que les choses fonctionnent. Considérez que le drapeau '-B' indique que les décalages de plus de 128 ms peuvent prendre des heures pour se synchroniser en utilisant le mécanisme par défaut de '' balayage ''
Matt S.
Il n’est pas nécessaire d’utiliser les sudofichiers /etc/rc.locale .. ils sont déjà exécutés en tant que root.
Soren Un
timedatectl, mais askubuntu.com/questions/832646/…
nobar

Réponses:

326

Le ntpservice est probablement en cours d' exécution, c'est pourquoi il ntpdateest impossible d'ouvrir le socket (port UDP 123) et de se connecter au serveur NTP.

Essayez depuis la ligne de commande:

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

Si vous souhaitez /etc/rc.localutiliser ceci, 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 )&
Eric Carvalho
la source
Merci. Pouvez-vous s'il vous plaît expliquer pourquoi vous avez besoin des chemins explicites?
Ysap
1
Je ne sais pas vraiment. :-) Une fois, j’ai eu du mal à exécuter servicerc.local et cron, mais j’ai réussi à le réparer en utilisant /etc/init.d/xxx. En fait, je pense que vous n’avez pas à donner le chemin complet à ntpdate, j’aime utiliser des chemins complets dans les scripts pour être sûr que le bon fichier sera trouvé.
Eric Carvalho
2
OK, c'était apparemment le problème. Maintenant, l'horloge est mise à jour dès que la connexion réseau est établie. Merci.
Ysap
3
J'ai découvert que le us.pool.ntp.orgest plus sensible.
Ysap
7
Avec l' -uoption, vous n'avez pas besoin d'arrêter le service NTP:sudo ntpdate -u time.nist.gov
Edward Anderson
487

Au lieu de ntpdate (qui est obsolète ), utilisez

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

Le -gqindique au démon ntp de corriger l'heure indépendamment de offset ( g) et de quitter immédiatement ( q) après avoir réglé l'heure.

Martin Schröder
la source
3
Merci. Toujours en 1970 après cette commande (w / sudo). En lisant la ntpdpage de manuel, je ne sais pas comment cela force une mise à jour?
Ysap
12
L'option "-q" indique au démon NTP de démarrer, de définir l'heure et de quitter immédiatement. L'option "-g" lui permet de corriger les différences de temps supérieures à 1000 secondes. À plus long terme, vous devez simplement configurer le démon NTP pour qu'il soit toujours actif.
Tgharold
35
Cette réponse devrait aller en haut, car elle est correcte: ntpdate est obsolète et son installation est une mauvaise idée, car elle est en conflit avec ntp. Si l'horloge est complètement éteinte, vous devez effectuer cette étape manuelle car sinon, NTLP ne modifiera pas votre horloge et ne vous expliquera pas pourquoi.
Liam
31
Pour moi, sudo ntpd -gqne sort pas! Je suis sur 14.10 et je dois CTRL + C pour continuer ... ou combien de temps est-il censé prendre?
Yanick Rochon
5
Pour info, sur mon système (CentOS 6.6), je devais changer les deux instances de sudo service ntp...to sudo service ntpd....
rinogo
63

Utilisez sntp pour régler l'heure immédiatement. Par exemple:

sudo sntp -s 24.56.178.140

Les nombres après -s peuvent être n’importe quel serveur de temps ntp, celui-ci étant NIST en pi. Collins, Colorado.

Client
la source
1
Ça a marché! +1
CappY
7
Cela a fonctionné quand "sudo ntpd -gq" n'a pas fonctionné.
Matt White
Je ne sais pas combien de fois je suis venu chercher cette réponse. Fonctionne à chaque fois.
Chaos
1
incapable de localiser le paquet sntp?
temple
1
apt-get install SNTP / yum install SNTP (oui , il fonctionne sur CentOS, RedHat, Fedore aussi)
ndemou
40

Comme d'autres l'ont fait remarquer, la meilleure solution consiste à indiquer à ntpd de ne pas tenir compte du seuil de panique, qui est de 1 000 secondes par défaut. Vous pouvez configurer le seuil de panique de deux manières:

  • Editez /etc/default/ntpet assurez-vous que l'option -g est présente.
  • éditez /etc/ntp.conf et placez- tinker panic 0le en haut

Jusqu’à présent, c’est essentiellement ce que d’autres ont recommandé, mais il ya encore une étape à franchir. 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, pensant qu’elle est à nouveau en 1970. Lorsque votre ordinateur démarre, il définira son horloge sur l'horodatage écrit par fake-hwclock 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 au démarrage.

dfc
la source
1
-gsemblait ne rien faire pour moi (à la ligne de commande, je n'ai pas /etc/default/ntp), mais en ajoutant tinker panic 0à ntp.conftravaillé
Dave Cousineau
@Sahuagin Je ne sais pas quoi vous dire, à part que vous avez un paquet NTP non standard. / etc / default / ntp fait partie du paquet d'Ubuntu: packages.ubuntu.com/xenial/amd64/ntp/filelist et -g est une option depuis aussi longtemps que je me souvienne.
dfc
désolé, je suppose que je ne suis pas réellement sur Ubuntu et que j'aurais dû réfléchir un peu plus avant de commenter. tinker panic 0semble définitivement avoir travaillé si.
Dave Cousineau
13

ntpdate est un programme différent du net dameon. NTPDate est probablement erroné au démarrage car ntpd est exécuté 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.

MISE À JOUR

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

Maintenant, ajoutez la commande:

ntpdate -sb time.nist.gov

à /etc/rclocal

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

Stephan
la source
réponse mise à jour.
Stephan
1
Ntpdate n'est-il pas éliminé ou quelque chose d'autre? De plus, si je comprends bien, le service exécute et maintient la synchronisation de l'horloge locale sur l'horloge du serveur - la dérive est donc liée. Si vous supprimez ntp et exécutez ntpdate une fois, ne sera-t-il pas affecté par la dérive de l'horloge lorsque la machine est allumée pendant une période prolongée?
Ysap
Stephan, s'il vous plaît voir la mise à jour # 2 à la question.
Ysap
3
Oui, ntpdate est en train de disparaître. L'utilisation de "ntpd -q" est préférable (les deux variantes exigent que ntpd soit arrêté en premier).
Tgharold
11

Utilisez timedatectl(unité de service systemd) pour régler l’heure. ntpest obsolète.

sudo systemctl restart systemd-timesyncd.service

Vous pouvez vérifier l’heure de la mise à jour en lisant les journaux avec journalctl -xe | tail

Référence

xiaoyifang
la source
Cela a fonctionné sur Ubuntu 19.04. Merci!
Krubo
10
rdate -s tick.greyware.com

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

bavettes
la source
Merci. Je n'ai pas actuellement le système pour vérifier cette commande, mais si vous suivez la discussion dans la question et la réponse acceptée, vous verrez que le problème est en réalité une indisponibilité du réseau au moment de l'exécution de la commande update update.
Ysap
Cela corrigeait un problème de synchronisation temporelle sur mon Raspberry Pi. Je vous remercie.
Oliver Spryn
7

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

NTPD_OPTS="-g"

dans le fichier

/etc/default/ntp

Cela garantit que lorsque ntpd est lancé à partir du script /etc/init.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'il y a plus de 1000 secondes, 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.

JG Miller
la source
Je l'ai déjà, mais il est toujours dit 3 heures du matin à New York, alors qu'il devrait être 23 heures.
Chovy
J'ai aussi déjà eu exactement cette ligne /etc/default/ntp, mais le temps n'était pas synchronisé.
Dawid Ferenczy Rogožan
5

tlsdatedéfinit l'horloge locale en se connectant de manière sécurisée avec TLS à des serveurs distants et en extrayant l'heure distante de la négociation sécurisée. Contrairement à ntpdate, tlsdateutilise TCP, par exemple en se connectant à un service distant compatible HTTPS ou TLS, et fournit une protection contre les adversaires qui tentent de vous envoyer des informations de temps malveillantes.

$ tlsdate -V -n -H encrypted.google.com
Kokizzu
la source
5

Notez que certains systèmes actuels basés sur Ubuntu 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 15.04, Ubuntu utilise systemd par défaut. Par conséquent, les systèmes critiques comme le temps sont gérés par systemd. Pour trouver le service utilisé par votre système, exécutez quelque chose comme

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

Pour TechJS le 16.04, le service était ntp. Pour moi sur Ubuntu 18.04 (Mint 19), le service est systemd-timesyncd. Fait intéressant, je me suis connecté à un serveur 16.04 que je possède et qui l’utilise systemd-timesyncdégalement.

Aaron Chamberlain
la source
Merci. Cela fait longtemps que je n'ai pas posté la question et je n'ai pas de système disponible pour les tests, mais pouvez-vous préciser en quoi votre réponse est différente de @TechJS, en particulier la commande que vous avez proposée est légèrement différente.
Ysap
Ha merci. C’était une réponse pour vous, mais aussi pour tous ceux qui, à l’avenir, se retrouvent ici sans plus d’informations à jour (comme moi). J'ai mis à jour ma réponse pour qu'elle soit plus précise sur la manière dont j'atteins ma réponse.
Aaron Chamberlain
4

Essayez d'utiliser l' -boption pour avancer l'heure.

Cry Havok
la source
2
Lorsque vous essayez de la ligne de commande, je reçois la réponse suivante: 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting . Cependant, je pense avoir déjà essayé cela avant rc.localmais cela n’a pas aidé.
Ysap
3
Vous devez arrêter le service ntp avant de pouvoir exécuterntpdate -b <ipaddress>
Wim Deblauwe
2

Bien,

Je cours un Raspbian (Debian Wheezy) sur mon Raspberry Pi, qui n'a pas le hwclock. J'ai trouvé pratique d'écrire un petit script et de l'exécuter après la mise à jour de mon interface Internet, afin d'être sûr que dès que le réseau sera disponible, l'horloge sera mise à jour.

D'abord, vérifiez que vous avez le ntpdatepaquet en cours d'exécution

sudo apt-get update
sudo apt-get install ntpdate

Vous devez ajouter ce qui suit dans votre /etc/network/interfaces(il ne s'agit sûrement eth0que d'un exemple):

auto eth0
    iface eth0 inet dhcp
    post-up /usr/local/sbin/update-time.sh

Et créez le script suivant dans /usr/local/sbin/update-time.sh(n'oubliez pas de le rendre exécutable par chmod):

#!/bin/bash
# This script checks if the ntp process is running, stops it, updates the system time, starts it again

ps cax | grep -c ntpd > /dev/null
onoff=$?
if [ "$onoff" -gt 0 ]; then
    echo "stopping ntpd..."
    service ntp stop
    echo "ntpd stopped"
else
    echo "ntpd not running, ready to update the date"
fi


isinstalled=$(dpkg-query -l | grep -c ntpdate)
if [ "$isinstalled" -gt 0 ]; then
    ntpdate -t 3 -s ntp4.stratum2.ru
    echo "date and time update executed"
else
    echo "ntpdate package not installed, can't update using ntp"
fi

echo "restarting ntpd..."
service ntp start 
echo "ntpd running"
echo "printing current date and time:"
date

exit
art.shutter
la source
1

Les algorithmes ntpd ignorent les décalages d'échantillons supérieurs à 128 ms, à moins que l'intervalle pendant lequel aucun décalage d'échantillon [valeur absolue] ne soit inférieur à 128 ms ne dépasse 900 secondes. Le premier échantillon suivant, quel que soit le décalage, fait avancer l'horloge jusqu'à l'heure indiquée. En pratique, cela réduit le taux de fausse alarme lorsque l'horloge est avancée par erreur jusqu'à une incidence extrêmement basse.

Normalement, ntpd se ferme si le décalage dépasse la limite de sécurité, qui est de 1000 s par défaut. Ceci peut être désactivé avec l'option -g:

-g Normalement, ntpd se ferme si le décalage dépasse la limite de sécurité, qui est de 1000 s par défaut. Si la limite d'intégrité est définie sur zéro, aucune vérification d'intégrité n'est effectuée et tout décalage est acceptable. Cette option annule la limite et permet de définir le temps sur n’importe quelle valeur sans restriction. Cependant, cela ne peut arriver qu'une fois. Après cela, ntpd se fermera si la limite est dépassée. Cette option peut être utilisée avec l'option -q.

tous deux de http://doc.ntp.org/4.1.0/ntpd.htm

-Jonathan Natale

Jonathzen
la source
1

Si vous pouvez vous permettre d'attendre le temps qu'il faudra avant que votre système soit synchronisé, vous pouvez utiliser la ntp-waitcommande suivante:

ntp-wait || exit -1 
# i believe this would exit the script if it fails, but not sure of ntp-wait return codes, learn this first.

echo Time is synced, go ahead with backup
tar
rsync etc.
Anonyme
la source
1

Si vous êtes sur systemd, vous pouvez utiliser cette commande:

sudo systemctl restart ntp
# or
sudo systemctl restart ntp.service

Et puis le temps est mis à jour dans les 10-15 secondes.
Testé sur ubuntu mate 16.04

AmirHossein
la source
0

ntpdet ntpdateexécuté par défaut en utilisant un port restreint (UDP 123). Si vous êtes derrière un pare-feu, ntpdcela ne fonctionnera jamais, mais ntpdatepeut fonctionner avec l' -uoption. Par exemple: ntpdate -u 0.ubuntu.pool.ntp.org ou les ntpdate -u time.nist.govdeux devraient fonctionner correctement.

GN DeSouza
la source