web-dev-qa-db-fra.com

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

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

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

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 tar et make.

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


PDATE 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 placé dans /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?


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

  1. Remplacez le serveur par us.pool.ntp.org
  2. Utiliser des chemins explicites vers les programmes
  3. Supprimez le service ntp et laissez simplement Sudo ntpdate ... dans rc.local
  4. Supprimez 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 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é de supprimer cela de rc.local et de passer un appel à ntpdate dans mon fichier .bashrc. Cela met à jour l'horloge comme prévu et j'obtiens l'heure actuelle réelle une fois que la commande Invite 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 service ntp 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 commande ntpdate dans rc.local n'effectue pas la tâche requise, alors que le faire dans .bashrc fonctionne correctement?

366
ysap

Probablement que le service 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 depuis la ligne de commande:

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

Si vous voulez mettre ceci 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 )&
317
Eric Carvalho

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

Sudo service ntp stop
Sudo ntpd -gq
Sudo service ntp start

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

473
Martin Schröder

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.

59
Guest

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 1000 secondes par défaut. Vous pouvez configurer le seuil de panique de deux manières:

  • éditez /etc/default/ntp et assurez-vous que l'option -g est présente.
  • éditez /etc/ntp.conf et placez tinker panic 0 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.

40
dfc

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.

METTRE À 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émarrez. Devrait être bon à ce point.

12
Stephan
rdate -s tick.greyware.com

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

10
batflaps

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.

7
J G Miller

Utilisez timedatectl (unité de service systemd) pour définir 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

Référence

6
xiaoyifang

tlsdate dé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, tlsdate utilise 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
5
Kokizzu

Essayez d'utiliser l'option -b pour avancer l'heure.

4
Cry Havok

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), l'heure est conservée 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 j'ai et il utilise aussi systemd-timesyncd.

4
Aaron Chamberlain

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.

Commencez par vérifier que vous avez le paquet ntpdate en exécutant

Sudo apt-get update
Sudo apt-get install ntpdate

Vous devez ajouter ce qui suit dans votre /etc/network/interfaces (sûrement eth0, voici juste 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
2
art.shutter

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

1
TechJS

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

1
Jonathzen

ntpd et ntpdate exécuter par défaut en utilisant un port restreint (UDP 123). Si vous êtes derrière un pare-feu, ntpd ne fonctionnera jamais, mais ntpdate peut fonctionner avec l'option -u. Par exemple: ntpdate -u 0.ubuntu.pool.ntp.org ou ntpdate -u time.nist.gov devrait fonctionner correctement.

0
G. N. DeSouza

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

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.
0
Anonymous