La liste des serveurs NTP français se
trouve à:
http://www.cru.fr/NTP/serveurs_francais.html
Voir le HOWTO Clock
Pour l'utilisation de ntpd sur réseau
non connecté en permanence, il existe aussi chrony
(disponible dans la section OPTIONAL/ADMIN de Debian.
The chrony web page
Une fois les paquets installés, il n'y
a pas de man mais il y a de la bonne doc sous /usr/doc
...
Pour les stations WINDAUBE dans le réseau, il
existe des produits pour se synchroniser sur les serveurs NTP. Il
y a un site qui traite de la synchronisation en général
Time Synchronization Server -- Time Synchronization Software
. Il répertorie un tas de logiciels pour différentes
plate-formes dont WINDAUBE. On y trouve également des tuyaux intéressants
dans une
FAQ NTP.
# installpkg ntp4.tgz (n1)
Essais: # ntptrace -dv canon.inria.fr
pour voir l'écart de temps, # ntpdate canon.inria.fr
pour ajuster l'horloge,
fonctionnent correctement.
antares se synchronisera sur vega quand ce dernier
sera au point: # ntpdate vega.bd.fr
Mise à jour par cron de root chaque heure
à h+0mn: # crontab -e (édite la crontab de root)
ajoute la ligne: 0 * * * * /usr/sbin/ntpdate vega.bd.fr 1> /dev/null 2> /dev/null # ntptrace -dv vega.bd.fr (fait avant et après l'heure
met en évidence qu'on rattrappe 0,6 seconde par heure)
La doc de la version de ntpd distribuée avec
SLACKWARE 8.0 dit que ntptrace n'en a plus pour longtemps!
Il est conseillé de le remplacer par ntpd avec le
paramètre de lancement -q pour qu'il quitte après
synchronisation.
Dans le /etc/ntp.conf livré:
Enlevé: #server 127.127.1.0 # local clock
#fudge 127.127.1.0 stratum 10
#multicastclient # listen on default
224.0.1.1
#broadcastdelay 0.008 Ajouté: server vega.bd.fr iburst Essayé: # /usr/sbin/ntpd -q Il s'écoule quelques temps avant que ntpd quitte mais cela
marche: ntpd: time reset -1.246658 s Attente... On perd 1,3 s en 4 heures. Oui mais...
Quand le serveur ne répond pas, ntpd ne quitte pas sur time-out.
On voit plusieurs copies de ntpd en mémoire et quand il
quitte il reste une copie qui ne termine jamais. Si on lance plusieurs
fois de suite, ça s'accumule...
ntpdate lui, se tire si le serveur ne répond pas
et il vide ses poubelles avant de partir. Retour arrière! crontab pour lancer ntpdate à l'heure et
à la demi: 0,30 * * * * /usr/sbin/ntpdate vega.bd.fr 1> /dev/null 2> /dev/null
Il y a mieux à faire avec le rapport de la
commande ntpdate que de le poubeller: Il y a un paramètre
-s pour rediriger les sorties vers le syslog: # crontab -e 0,30 * * * * /usr/sbin/ntpdate -s vega.bd.fr
En fait, les sorties se font sur /var/log/messages
et non pas syslog. Exemple de rapport: Nov 25 18:00:02 antares ntpdate[413]: adjust time server 192.168.210.5
offset -0.115636 sec
On glisse de -116ms environ par demi-heure. En faisant
des ntptrace on voit l'écart diminuer puis remonter
en l'espace d'une demi-heure. La correction est étalée
sur environ 5mn. En fait la correction est trop forte (c'est
signalé dans la doc de ntpdate), elle dépasse le 0 puis
on constate à nouveau le glissement dans l'autre sens. Satisfaisant...
Essai de réglage du tick:
Mesure du glissement de l'horloge système. Arrêter la
mise à jour par cron, synchroniser l'horloge par ntpdate
, attendre un bon moment, re synchroniser par ntpdate, relever
le glissement entre les 2 synchronisations (les rapports de ntpdate
vont dans /var/log/messages). # crontab -e #15,45 * * * * /usr/sbin/ntpdate -s vega.bd.fr
# ntpdate -b -s -p 4 mesior.obspm.fr
...
# ntpdate -b -s -p 4 mesior.obspm.fr Résultat: Nov 29 15:28:13 antares ntpdate[369]: step time server 145.238.2.24
offset -0.421442 sec
Nov 29 22:30:41 antares ntpdate[404]: step time server 145.238.2.24
offset -2.332787 sec Avance de 2.332787 secondes sur 7h 2mn 28s ou 25348 secondes.
Soit 7.951428 secondes sur un jour ou 86400 secondes.
Valeur du tick actuel: # tickadj
tick = 10000 Il y a 86400000000/10000 ticks par jour, soit 8640000.
Si je mets le tick à 9999 microsecondes au lieu de 10000,
je gratte donc 8640000 microsecondes soit 8.64 secondes.
Cela fait 8.64-7.951428= 0.688572 de trop.
Pour ajouter ou retirer une fraction de tick, on joue sur
frequency .
1 tick (8.64 s/jour) équivaut à 6553600 en frequency
en + ou en -.
Avec tickadj on ne peut apparemment que modifier tick
. En revanche on peut agir sur tick et frequency avec
adjtimex . Cette commande est disponible sous Debian mais pas sous
Slackware. Qu'à cela ne tienne, je la copie carrément sous
/sbin sans rien demander à personne, et ça va...
Calcul de frequency: 6553600*0.688572/8.64= 522295 en +
Réglage: # adjtimex --tick 9999 --frequency 522295
Ajouté à /etc/rc.d/rc.local # ntpdate -b -s -p 4 mesior.obspm.fr
...
# ntpdate -b -s -p 4 mesior.obspm.fr Résultat: Nov 30 09:01:16 antares ntpdate[268]: step time server 145.238.2.24
offset -0.360822 sec
Nov 30 20:43:34 antares ntpdate[382]: step time server 145.238.2.24 offset
0.029448 sec Retard de 0.029448 secondes en 11h 42mn 18s soit 42138 secondes.
Ce qui fait par jour de 86400 secondes, 0.060380 secondes.
Traduit en frequency: +45799
522295+45799= 568094 adjtimex --tick 9999 --frequency 568094
Nouvelle mesure sur une journée de fontionnement:
Résultat: Dec 2 09:22:07 antares ntpdate[272]: step time server 145.238.2.24
offset -0.451624 sec
2 Dec 23:12:51 ntpdate[348]: adjust time server 138.195.130.71 offset
-0.035041 sec Avance de 0.035041 secondes en 13h 50mn soit 49800 secondes.
Ce qui fait par jour, 0.06 secondes.
L'erreur est dans l'autre sens! Des ntptrace successifs montrent
qu'on est dans la fourchette d'incertitude de ntpdate sur ce type
de connexion. Inutile de régler frequency avec une résolution
importante. Comme antares sera asservi à vega, on arrondi frequency
à 530000 et on n'en parle plus.
Ajouté à /etc/rc.d/rc.local /sbin/adjtimex --tick 9999 --frequency 530000
Maintenant que vega est un serveur NTP fiable, on l'utilise pour asservir antares avec ntpdate.
La progression de l'horloge système est déjà réglée au mieux par adjtimex.
Synchronisation initiale brute par le script /etc/rc.d/rc.local: /sbin/adjtimex --tick 9999 --frequency 530000
/usr/sbin/ntpdate -b -s vega.bd.fr Synchronisation périodique douce par cron (à h+15 et h+45): 15,45 * * * * /usr/sbin/ntpdate -s vega.bd.fr
Et l'horloge matérielle
Après une mise hors tension
de la bécane on se retrouve encore avec l'horloge décalée
parce que celle-ci s'initialise à partir de l'horloge matérielle
et que cette dernière n'est pas asservie.
L'horloge système est copiée dans l'horloge matérielle
à la fermeture du système d'exploitation mais l'horloge matérielle
est livrée à elle-même pendant la période de mise
hors tension (maitenue par pile). L'horloge matérielle est contrôlée
par la commande hwclock.
Avec SLACKWARE:
A l'arrêt du système, dans /etc/rc.d/rc.0 alias rc.6, lancement de la commande hwclock --utc --systohc
Au démarrage du système, dans /etc/rc.d/rc.S, lancement de la commande hwclock --utc --hctosys
Chaque fois que l'horloge matérielle est mise à l'heure un fichier /etc/adjtime
est généré contenant entre autre le décalage
de l'horloge. Il est possible de prendre en compte ce décalage enregistré
en mettant à l'heure l'horloge matérielle par la commande hwclock --utc --adjtime
D'après le man hwclock, il est conseillé de lancer cette
commande à l'initialisation du système avant d'initialiser
l'horloge système à partir de l'horloge matérielle (cela
n'est pas fait par défaut)...
Test de la commande hwclock avec les paramètres --debug et --test
pour avoir le détail de ce que fait la commande et pour ne pas vraiment
mettre l'horloge à l'heure (lancement à blanc). # hwclock --utc --systohc --debug --test
# cat /etc/adjtime Le décalage n'est pas enregistré dans /etc/adjtime
si la précédente mise à jour date de moins d'un jour
(le décalage reste à 0). Il faut attendre au moins un jour
après la dernière mise hors tension. # hwclock --systohc --utc --debug --test
hwclock 2.4c/util-linux-2.11f
hwclock: Open of /dev/misc/rtc failed, errno=2: No such file or directory.
Using direct I/O instructions to ISA clock.
Last drift adjustment done at 1007596352 seconds after 1969
Last calibration done at 1007596352 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2001/12/06 23:30:32
Hw clock time : 2001/12/06 23:30:32 = 1007681432 seconds since 1969
Time elapsed since reference time has been 0.194954 seconds.
Delaying further to reach the next full second.
Setting Hardware Clock to 23:30:31 = 1007681431 seconds since 1969
Clock not changed - testing only.
Clock drifted -2 seconds in the past 85080 seconds in spite of a drift factor of 0.000000 seconds/day.
Adjusting drift factor by -2.031030 seconds/day
Not updating adjtime file because of testing mode.
Would have written the following to /etc/adjtime:
-2.031030 1007681430 0.000000
1007681430
UTC
L'horloge matérielle avance d'environ 2 secondes par 24 heures. On enregistre la valeur pour de bon: # hwclock --systohc --utc --debug
hwclock 2.4c/util-linux-2.11f
hwclock: Open of /dev/misc/rtc failed, errno=2: No such file or directory.
Using direct I/O instructions to ISA clock.
Last drift adjustment done at 1007596352 seconds after 1969
Last calibration done at 1007596352 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2001/12/06 23:46:47
Hw clock time : 2001/12/06 23:46:47 = 1007682407 seconds since 1969
Time elapsed since reference time has been 0.180845 seconds.
Delaying further to reach the next full second.
Setting Hardware Clock to 23:46:46 = 1007682406 seconds since 1969
Clock drifted -2 seconds in the past 86055 seconds in spite of a drift factor of 0.000000 seconds/day.
Adjusting drift factor by -2.008018 seconds/day
# cat /etc/adjtime
-2.008018 1007682405 0.000000
1007682405
UTC
On ajoute l'ajustement de l'horloge matérielle dans le startup /etc/rc.d/rc.S avant l'initialisation de l'horloge système: echo "Ajuste l'horloge CMOS." /sbin/hwclock --utc --adjust
/sbin/hwclock --utc --hctosys C'est mieux mais on constate encore des erreurs variables qui peuvent
atteindre plusieurs secondes, au démarrage du système après
une période de mise hors tension...
Essai en configurant Enhanced Real Time Clock:
Comme l'indique le rapport de la commande hwclock, l'horloge matérielle
est lue en faisant une I/O directe. La tentative d'accès au device
RTC échoue parce que le noyau ne le supporte pas. On recompile le
noyau avec l'option: Character devices, Enhanced Real Time Clock Support (CONFIG_RTC) Essai de hwclock pour vérifier: # hwclock --show --debug
hwclock 2.4c/util-linux-2.11f
Using /dev/rtc interface to clock.
Last drift adjustment done at 1010771761 seconds after 1969
Last calibration done at 1010771761 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2002/01/12 00:32:37
Hw clock time : 2002/01/12 00:32:37 = 1010795557 seconds since 1969
Sat Jan 12 01:32:37 2002 -0.616688 seconds
Cela fonctionne mais hwclock n'a pas l'air plus exact pour autant...
vega, DEBIAN 2.2 (prévu pour être le serveur ntp local)
dselect, les paquets suivants:
adjtimex
ntp
ntpdate
ntp-doc
Configuration: Voir ntp.conf et /etc/init.d/ntpdate
Sans qu'on fasse quoi que ce soit ntpd est lancé
avec un ntp.conf par défaut: # /etc/ntp.conf, configuration for xntpd
# ntpd will use syslog() if logfile is not defined
#logfile /var/log/ntpd
driftfile /var/lib/ntp/ntp.drift
statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
#server
Il n'y a pas de serveur NTP configuré.
Essai: # ntpdate canon.inria.fr
Ne fonctionne pas parce que le port NTP est occupé...
D'après la doc, c'est normal: ntpdate
ne touche à rien si ntpd est déjà là...
il faut arrêter ntpd avant: # /etc/init.d/ntp stop
Comme on n'est pas connecté en permanence
à Internet, on va simplifier en synchronisant sur l'horloge
matérielle. La recette est indiquée dans la doc /ntp/README.Debian:
Ajout à /etc/ntp.conf: server 127.127.1.1
fudge 127.127.1.1 stratum 10
canon.inria.fr est un serveur primaire de strate
1 prévu pour synchroniser les serveurs publics de strate
2.
Il est correct d'utiliser des serveurs de strate
2 proches. Exemples:
# ntptrace -dv ntp.obspm.fr (montre qu'on
prend de l'avance: ~2,5 secondes en 12 heures)
On se lance: ajout de 3 serveurs distants dans
ntp.conf server ntp.obspm.fr
server ntp.u-psud.fr
server ntp.via.ecp.fr
Vérification du fonctionnement en suivant
les conseils donnés par la page de doc html debug.html
Quand on coupe Internet, la période de
polling des serveurs passe de 64 secondes à
1024 secondes! Ajouté le paramètre maxpoll 7 (puissance
de 2) pour de pas poller au-delà de 128s
Le processus d'asservissement reste très
lent. Si on charge le modem, les serveurs passent en reject
probablement à cause du jitter qui monte énormément
dans ce cas.
Le fichier /var/lib/ntp/ntp.drift varie
au bout d'un long moment connecté à Internet.
Je laisse le PC allumé pendant + de 24h
pour voir si l'horloge interne se stabilise (internet non connecté
;-)
Il y a des options de ntpd prévue pour améliorer
le fonctionnement dans le cas d'une connexion Internet
non permanente. Voir burst et iburst
dans les options de la directive server. Voir aussi
le paramètre de
lancement -x. Ces paramètres devraient
accélérer le processus... iburst n'est pas reconnu sous Debian. En fait la version ntpd
Debian 2.2 (4.0.99g-2) est antérieure à la version
livrée avec SLACKWARE 8.0 (4.0.99k23)...
Essai avec dans ntp.conf server ntp.obspm.fr burst maxpoll 7
server ntp.u-psud.fr burst maxpoll 7
server ntp.via.ecp.fr burst maxpoll 7 Pour mettre le paramètre de lancement -x dans /etc/init.d/ntp
attention! start, stop et restart sont effectués
par start-stop-daemon
il faut mettre -- -x
sauvegardé le fichier origine dans
ntp.orig
-x n'accélère rien au contaire,
il oblige à ajuster l'horloge lentement. Quand on enlève
l'option, l'horloge se remet à jour d'un bond si le décallage
est suffisamment important. En principe 128ms mais il semble que
ce soit plus...
Dès qu'on est déconnecté d'Internet.
L'horloge se remet à dériver de plusieurs secondes
par jour. Essai sans mettre l'horloge matérielle comme
serveur... #server 127.127.1.1
#fudge 127.127.1.1 stratum 10
Positif! On ne prend plus qu'un peu plus de 300ms
en 10h.
Mesures suivantes (connexions à Internet suivantes):
245ms en 14h. 5mn de connexion sont nécessaires
pour déclencher la synchronisation.
Pas d'écart notable 8h plus tard...
Il semble que tout dépende de l'état dans lequel a été
positionné frequency visualisé par # ntpq -c rv
qui est égal à /var/lib/ntp/ntp.drift
Il semble que cette valeur soit mise à jour environ 1 heure
après que ntpd ait réussi à se synchroniser sur un
serveur ntp (connexion à Internet). Suivant la qualité de
la liaison avec les serveur ntp (accès Internet chargé ou
non) cette valeur est soit correcte, soit dans les choux! Dans le meilleur
des cas on glisse de presque rien pendant l'absence de connexion, dans le
pire des cas on glisse de plusieurs secondes!
Essai avec plus de serveurs et avec une fréquence de polling
plus élevée. Modification de la liste de serveurs dans
ntp.conf : server ntp.obspm.fr burst minpoll 5 maxpoll 7
server ntp0.oleane.net burst minpoll 5 maxpoll 7
server ntp1.oleane.net burst minpoll 5 maxpoll 7
server ntp.via.ecp.fr burst minpoll 5 maxpoll 7
server ntp.internet-fr.net burst minpoll 5 maxpoll 7
server ntp.polytechnique.fr burst minpoll 5 maxpoll 7
# /etc/init.d/ntp restart ntpd nage la dedans comme un poisson dans l'eau. Il change
le statut des serveurs au gré des variations de performances des
échanges. Le serveur élu change régulièrement.
Il semble choisir celui qui a le moins de jitter. La synchronisation
semble plus rapide. Quand on charge la liaison Internet, le jitter
augmente considérablement et ntpd lache tous les serveurs
en statut reject.
Comme le veut l'étiquette, j'envoie un mel aux administrateurs
des serveurs pour dire que j'utilise leur service.
Essai de réglage du tick:
Mesure du glissement de l'horloge système. Arrêter ntpd
, synchroniser l'horloge par ntpdate, attendre un bon moment,
re synchroniser par ntpdate, relever le glissement entre les 2 synchronisations
(les rapports de ntpdate vont dans /var/log/syslog). # /etc/init.d/ntp stop
# ntpdate -b -s -p 4 mesior.obspm.fr
...
# ntpdate -b -s -p 4 mesior.obspm.fr
Résultat: Nov 29 15:10:59 vega ntpdate[986]: step time server 145.238.2.24 offset
-0.118297 sec
Nov 29 22:30:27 vega ntpdate[6442]: step time server 145.238.2.24 offset
-0.432141 sec -0.432141 seconde en 26368 secondes
Attention! tick était bien à 10000 par défaut
mais frequency n'était pas à 0. Il était à
5989884 (ce qui représenterait une correction de presque +8 secondes).
Comme l'indique: # adjtimex --print ou # ntptime
On recommence après: # adjtimex -f 0
Le man de adjtimex explique pas mal. Nov 30 01:32:48 vega ntpdate[7638]: step time server 145.238.2.24 offset
0.453385 sec
Nov 30 09:01:13 vega ntpdate[8969]: step time server 145.238.2.24 offset
2.170551 sec Retarde de 2.170551 secondes en 7h 28mn 25s ou 26905 secondes.
En 1 jour, soit 86400 secondes, le retard serait de 6.97 secondes.
Valeur du tick actuel en microsecondes: # tickadj
tick = 10000
+ ou - 1 µs sur tick vaut + ou - 8.64 secondes par
jour (~100 ppm).
Pour l'ajustement fin on agit sur un autre paramètre de l'horloge
du noyau: frequency.
+ ou - 6553600 sur frequency équivaut à + ou - 1 µs
sur tick soit ~100 ppm (2^16= 65536= 1 ppm).
2 solutions:
On ajoute frequency 5286874 ou
on ajoute 1 à tick et on retire frequency 1266726. # adjtimex --frequency 5286874 # ntpdate -b -s -p 4 mesior.obspm.fr ...
# ntpdate -b -s -p 4 mesior.obspm.fr Résultat: Nov 30 10:27:18 vega ntpdate[10106]: step time server 145.238.2.24
offset 0.387099 sec
Nov 30 20:43:29 vega ntpdate[11506]: step time server 145.238.2.24 offset
-0.014773 sec Avance de 0.014773 secondes en 10h 16mn 11s soit 36971 secondes.
Ce qui donne 0.034524 secondes par jour. 34.5 millisecondes, c'est certainement
inférieur à l'incertitude sur la mesure de ntpdate...
On laisse ou on insiste? 5286874-26187= 5313061
On laisse la bécane en service et on attend plus longtemps pour limiter
l'incertitude...
Résultat: Nov 30 22:23:13 vega ntpdate[13697]: step time server 145.238.2.24 offset
0.002307 sec
2 Dec 23:12:15 ntpdate[3368]: adjust time server 138.195.130.71 offset
-0.130551 sec On décèle une avance de 130 millisecondes sur 48 heures
soit 0.065 par jour. C'est le double du glissement mesuré le coup
précédent parce que j'ai fait une addition au lieu d'une soustraction
dans le calcul du nouveau frequency!
5313061-49304= 5263757 # adjtimex --frequency 5263757
Avec Debian, adjtimex est lancé au démarrage du système par /etc/init.d/adjtimex start
Il faut mettre les valeurs de tick et frequency dans le script. Par défaut: TICK=10000
FREQ=0 Nouvelle mesure: Dec 3 00:17:20 vega ntpdate[4504]: step time server 138.195.130.71 offset 0.060360 sec
# date
Tue Dec 11 23:09:57 CET 2001
# ntptrace ntp.via.ecp.fr
zen.via.ecp.fr: stratum 2, offset -0.255495, synch distance 0.03130
canon.inria.fr: stratum 1, offset -0.262705, synch distance 0.00000, refid 'GPS'
# date
Sat Dec 15 01:25:43 CET 2001
# ntptrace ntp.via.ecp.fr
zen.via.ecp.fr: stratum 2, offset -0.410169, synch distance 0.02661
chronos.cru.fr: stratum 1, offset -0.410675, synch distance 0.00000, refid 'GPS' Avance de 410 ms en 12 jours, soit 34166 µs par jour.
Nouveau frequency: 5263757-25915= 5237842 # adjtimex --frequency 5237842
# ntpdate -b -s -p 4 ntp.via.ecp.fr
On avance encore légèrement. Cette fois j'ajuste au pif en arrondissant la valeur de frequency:
# adjtimex --frequency 5220000
# ntpdate -b -s -p 4 ntp.via.ecp.fr Cette fois je ne dois pas être loin de la valeur optimale. Je mets les valeurs de tick et frequency dans le script /etc/init.d/adjtimex: TICK=10000
FREQ=5220000 Maintenant qu'on sait de combien et comment il faut corriger l'horloge système, si on essayait à nouveau ntpd? Voyons où on en est avec ntptime: # ntptime
ntp_gettime() returns code 5 (ERROR)
time bfcda8e3.ddb9c000 Fri, Dec 21 2001 13:26:11.866, (.866116),
maximum error 16384000 us, estimated error 16384000 us.
ntp_adjtime() returns code 5 (ERROR)
modes 0x0 (),
offset 0.000 us, frequency 79.651 ppm, interval 4 s,
maximum error 16384000 us, estimated error 16384000 us,
status 0x41 (PLL,UNSYNC),
time constant 2, precision 1.000 us, tolerance 512 ppm,
pps frequency 0.000 ppm, stability 512.000 ppm, jitter 200.000 us,
intervals 0, jitter exceeded 0, stability exceeded 0, errors 0.
Le frequency dont on parle ici, c'est le frequency de adjtimex divisé par 2^16 soit 65536.
C'est la valeur qu'on va mettre dans le fichier /var/lib/ntp/ntp.drift avant de relancer ntpd.
# /etc/init.d/ntp start
En lançant périodiquement les commandes suivantes pour surveiller frequency: # ntptime ou # adjtimex --print ou # ntpq -c rv et # cat /var/lib/ntp/ntp.drift
on constate que quand les serveurs ntp de référence sont accessibles, ntpd louvoie d'un côté et d'autre du point de réglage optimal. Quand on se déconnecte du FAI, frequency
reste positionné sur le cap courant... donc on dérive jusqu'à
ce que les serveurs soient de nouveau accessibles suite à quoi un
coup de barre est donné dans l'autre sens. Le fichier ntp.drift est mis à jour après une demi-heure avec le frequency courant. Pas satisfaisant...
Essai de chrony.Un paquet distribué par Debian, susceptible de remplacer avantageusement ntpd dans le cas d'une connexion intermittente aux serveurs ntp de référence.
L'installation de ce paquet implique la suppression des paquets ntpd et ntpdate. Le paquet adjtimex est toléré quoiqu'il suggère ntpdate. man chronid et man chronic ne donnent pas grand chose. La doc détaillée est dans info chrony. Il y a une doc html plus pratique à /usr/doc/chrony/chrony.html chronyd est lancé au démarrage du système. Il est contrôlé par /etc/init.d/chrony (start, stop, restart). Mais le fichier de config /etc/chrony/chrony.conf doit être modifié, au moins pour indiquer les bons serveurs ntp. # cd /etc/chrony
# cp chrony.conf chrony.conf.orig Nouvelle section server: # server 132.163.135.130 offline
server ntp.via.ecp.fr minpoll 5 maxpoll 7 offline
server ntp.obspm.fr minpoll 5 maxpoll 7 offline
server ntp0.oleane.net minpoll 5 maxpoll 7 offline
server ntp1.oleane.net minpoll 5 maxpoll 7 offline
server ntp.polytechnique.fr minpoll 5 maxpoll 7 offline minpoll et maxpoll ont la même signification que dans ntp.conf offline permet de démarrer sans solliciter les serveurs (FAI non connecté).
La communication avec chronyd se fait par chronyc, un
utilitaire qui ne fonctionne qu'en mode interactif. C'est cet utilitaire
qui par exemple, permet de passer de l'état initial offline à l'état online et inversement. Pour ce 2 scripts sont installés à: /etc/ppp/ip-up.d/chrony et /etc/ppp/ip-down.d/chrony
pour être lancés par /etc/ppp/ip-up et ip-down quand la connexion ppp s'établit ou se ferme.
On peut surveiller le fonctionnement de chrony dans syslog: # tail -f /var/log/syslog En lançant chronyc on obtient des renseignements sur l'état de chronyd en entrant les commandes sources, sourcestats et tracking... Après 2 ou 3 sessions sur Internet, chronyd a trouvé le bon frequency
et garde le cap à peu de chose près. L'horloge du noyau est
réglée. Le choix a été de faire +1 sur tick avec un frequency négatif. Le dernier frequency calculé est enregistré dans /var/lib/chrony/chrony.drift # chronyc
chronyc> sources
210 Number of sources = 5
MS Name/IP address
Str Poll LastRx Last sample
========================================================================
^+ zen.via.ecp.fr
2 6 57 -1481us[+1449us] +/-
93ms
^* mesior.obspm.fr
2 5 31 +2407us[+5340us] +/-
72ms
^+ ntp0.oleane.net
2 6 27 -10ms[
-10ms] +/- 95ms
^+ ntp1.oleane.net
2 6 1 -2030us[-2030us] +/-
111ms
^+ milou.polytechnique.fr 2
7 35 +254us[+3187us] +/- 110ms
chronyc> sourcestats
210 Number of sources = 5
Name/IP NP
NR Span Freq
Skew S.D./us
================================================================
zen.via.ecp.fr 17 9 343m
0.252 0.591
5331
mesior.obspm.fr 32 14 503m
0.037 0.325
7334
ntp0.oleane.net 42 20 18h
-0.288 0.098
4650
ntp1.oleane.net 28 16 503m
0.220 0.320
5345
milou.polytechn 64 28 19h
-0.225 0.123
7155
chronyc> tracking
Reference ID : 145.238.2.24 (mesior.obspm.fr)
Stratum : 3
Ref time (UTC) : Sat Dec 22 16:43:16 2001
System time : 0.000000 seconds fast of NTP time
Frequency : 79.595 ppm slow
Residual freq : 0.037 ppm
Skew : 0.392 ppm
Root delay : 0.138275 seconds
Root dispersion : 0.003677 seconds
chronyc> quit
# cat /var/lib/chrony/chrony.drift
-79.5577 0.3457
# adjtimex --print
mode: 0
offset: 0
frequency: -1338400
maxerror: 16384000
esterror: 16384000
status: 64
time_constant: 2
precision: 1
tolerance: 33554432
tick: 10001
raw time: 1009043043s 517854us = 1009043043.517854
return value = 5 chronyd fait office de serveur ntp de strate 3 pour le réseau intérieur. Il remplace avantageusement ntpd! Une seule ombre au tableau:
De temps en temps, /etc/ppp/ip-up.d/chrony ne s'exécute pas, ce qui fait qu'on ne passe pas online quand la liaison ppp est établie. Ceci met sans doute en évidence un problème général d'exécution de /etc/ip-up. Est-ce un pb de compatibilité entre pppd et diald?
OK après avoir résolu un pb d'installation diald. Voir serveur.txt et diald.txt (ipmasq). Encore une ombre! Quand chronyd
est lancé initialement (relance du système) alors que la connexion
avec le FAI n'est pas établie, il cherche à résoudre
les adresses des serveurs NTP, en dépit de l'option offline. Pendant tout ce temps, il est inaccessible (ex: pas de réponse à ntptrace ou ntpdate lancé par une station du réseau local). On voit des messages d'échec dans syslog pour chaque directive server du fichier chrony.conf: Dec 23 00:21:19 vega chronyd[422]: Invalid host/IP address at line 14
Après ça, il ne répond pas aux demandes de mise online. Pour débloquer la situation, il faut faire un restart de chrony après avoir connecté le FAI.
Pour éliminer ce problème il faut remplacer dans les directives server, les noms des serveurs NTP par leurs adresses IP. Il faudra vérifier
de temps en temps si l'un des serveurs NTP n'a pas changé d'adresse
IP. Essai avec la liaison FAI chargée (téléchargement):
Aïe! chrony s'appuie sur des mesures non fiables. Le frequency s'écarte brusquement de la norme. Extrait du fichier /var/log/chrony/tracking.log: ====================================================================
Date (UTC) Time IP Address St
Freq ppm Skew ppm Offset
====================================================================
23Dec01 11:44:50 138.195.130.71 3 -79.829 0.830 -5.271e-02
23Dec01 11:45:57 138.195.130.71 3 -79.840 1.482 -2.250e-03
23Dec01 11:47:02 138.195.130.71 3 -79.872 2.607 -1.399e-03
23Dec01 11:47:35 138.195.130.71 3 -79.977 4.714 -1.041e-03
23Dec01 11:48:10 138.195.130.71 3 -80.292 8.667 -8.503e-04
23Dec01 11:48:44 138.195.130.71 3 -81.259 16.446 -6.800e-04
23Dec01 11:49:18 138.195.130.71 3 -84.524 33.010 -1.339e-03
23Dec01 11:49:50 138.195.130.71 3 -91.450 58.440 4.573e-03
23Dec01 11:50:23 138.195.130.71 3 -97.909 76.891 1.566e-03
23Dec01 11:50:55 138.195.130.71 3 -164.053 120.908 -5.729e-02
23Dec01 11:52:34 138.195.130.71 3 -185.640 95.254 -2.463e-03
23Dec01 11:52:34 138.195.130.71 3 -180.970 87.484 3.946e-03
23Dec01 11:53:04 138.195.130.71 3 -180.068 84.220 3.454e-05
23Dec01 11:53:07 138.195.130.71 3 -175.946 86.309 2.125e-03
23Dec01 12:13:56 138.195.130.71 3 -174.910 85.017 1.701e-03
23Dec01 12:13:59 138.195.130.71 3 -166.007 90.360 1.668e-02
23Dec01 12:14:00 138.195.130.71 3 -163.705 87.688 3.997e-06
23Dec01 12:14:31 138.195.130.71 3 -89.064 47.452 1.078e-01
23Dec01 12:15:03 138.195.130.71 3 -86.032 33.386 7.555e-04
23Dec01 12:15:35 138.195.130.71 3 -85.761 27.172 -1.078e-04
23Dec01 12:16:08 138.195.130.71 3 -83.897 23.749 3.208e-03
23Dec01 12:16:40 138.195.130.71 3 -86.572 26.433 -1.981e-03
Entre 11h53 et 12h13 UTC, période sans connexion au FAI, frequency
est hors norme. Si on ne s'était pas reconnecté rapidement
pour le rétablir, l'horloge système serait partie dans les
choux. Le tick était passé à 10002! Pour tenter
d'éviter de prendre en compte des mesures non fiables on va commencer
par appliquer les paramètres préconisés par la doc dans
le cas d'une connexion FAI peu performante.
Surtout le paramètre maxdelay dans les directives server du fichier /etc/chrony/chrony.conf # ntp.via.ecp.fr
server 138.195.130.71 minpoll 5 maxpoll 8 maxdelay 0.4 offline
# ntp.obspm.fr
server 145.238.2.24 minpoll 5 maxpoll 8 maxdelay 0.4 offline
# ntp0.oleane.net
server 194.2.0.28 minpoll 5 maxpoll 8 maxdelay 0.4 offline
# ntp1.oleane.net
server 194.2.0.58 minpoll 5 maxpoll 8 maxdelay 0.4 offline
# ntp.polytechnique.fr
server 129.104.30.41 minpoll 5 maxpoll 8 maxdelay 0.4 offline Sauvegarde des données courantes de chrony dès la fermeture de la connexion ppp. Ajout des commandes dump et writertc dans le script /etc/ppp/ip-down.d/chrony: PASSWORD=`awk '$1 ~ /^1$/ {print $2; exit}' /etc/chrony/chrony.keys`
cat << EOF | /usr/bin/chronyc
password $PASSWORD
offline
dump
writertc
EOF
exit 0
Ajout des paramètres -r -s dans la commande de lancement de chronyd, /etc/init.d/chrony:
Remplacé FLAGS="defaults" par FLAGS="-r -s"
et ajouté -- $FLAGS dans le cas de --start start-stop-daemon --start --verbose --exec $DAEMON -- $FLAGS Maintenant chronyd ignore bien les mesures prises quand l'accès Internet est trop chargé. Le tracking montre que le frequency se maintient autour du point idéal (79,8 environ dans notre cas).
Reste le problème de la conservation de l'heure exacte entre mise hors tension et sous tension de la machine. Comme hwclock --adjust ne donne pas satisfaction, on fait gérer l'horloge matérielle par chrony (voir la section horloge matérielle).
Malgré cela on constate que le système démarre avec un décalage de plus
d'une seconde après chaque période de mise hors tension de la machine. Ceci
à pour conséquence de faire sauter le frequency à la première re synchronisation
avec un serveur NTP. Il faut plusieurs connexions à Internet pour voir le
frequency se restabiliser autour de la valeur idéale.
La solution est de supprimer la mise à l'heure de l'horloge matérielle
à partir de l'horloge système au shutdown. Dans le cas de Debian, il faut neutraliser la commande: hwclock --systohc $GMT
dans le script /etc/init.d/hwclock.sh
(pour le détail, section horloge matérielle).
En surveillant /var/log/chrony/tracking.log, on constate encore des petits écarts autour du frequency idéal quand le skew augmente, mais le fonctionnement est globalement satisfaisant.
Horloge matérielle
(voir ci-dessus l'explication pour antares sous Slackware)
Dans le cas de vega sous Debian:
A l'arrêt et à la relance du système, est lancé /etc/init.d/hwclock.sh pour soit sauvegarder l'horloge système dans l'horloge matérielle (stop ou restart) ou restaurer l'horloge système à partir de l'horloge matérielle (start). Debian déconseille d'utiliser hwclock --adjust
pour rattraper le décalage de l'horloge matérielle mais on
peut décommenter cette commande dans le script si on sait ce qu'on
fait (Rien d'autre que hwclock ne touche à l'horloge. Si l'horloge est manipulée il faudra supprimer le fichier /etc/adjtime).
Pour enregistrer le glissement de l'horloge matérielle dans /etc/adjtime, il faut attendre au moins un jour entre 2 commandes: # hwclock --utc --systohc
On peut tester à blanc avec les paramètres --debug et --test. Exemple: # hwclock --utc --systohc --debug --test
hwclock 2.4c/util-linux-2.10f
hwclock: Open of /dev/rtc failed, errno=19: No such device.
Using direct I/O instructions to ISA clock.
Last drift adjustment done at 1007591915 seconds after 1969
Last calibration done at 1007591915 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 22:47:55
Hw clock time : 101/12/06 22:47:55 = 1007678875 seconds since 1969
Time elapsed since reference time has been 0.436232 seconds.
Delaying further to reach the next full second.
Setting Hardware Clock to 22:47:54 = 1007678874 seconds since 1969
Clock not changed - testing only.
Clock drifted -2 seconds in the past 86960 seconds in spite of a drift factor of -0.000600 seconds/day.
Adjusting drift factor by -1.987121 seconds/day
Not updating adjtime file because of testing mode.
Would have written the following to /etc/adjtime:
-1.987720 1007678873 0.000000
1007678873
UTC
L'horloge matérielle avance environ de 2 secondes par 24 heures. # hwclock --systohc --utc --debug
hwclock 2.4c/util-linux-2.10f
hwclock: Open of /dev/rtc failed, errno=19: No such device.
Using direct I/O instructions to ISA clock.
Last drift adjustment done at 1007591915 seconds after 1969
Last calibration done at 1007591915 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 22:55:11
Hw clock time : 101/12/06 22:55:11 = 1007679311 seconds since 1969
Time elapsed since reference time has been 0.430922 seconds.
Delaying further to reach the next full second.
Setting Hardware Clock to 22:55:10 = 1007679310 seconds since 1969
Clock drifted -2 seconds in the past 87396 seconds in spite of a drift factor of -0.000600 seconds/day.
Adjusting drift factor by -1.977207 seconds/day # cat /etc/adjtime
-1.977807 1007679309 0.000000
1007679309
UTC
Pour que chrony puisse également s'occuper de l'horloge matérielle, il faut recompiler le noyau avec l'option:
Character devices, Enhanced Real Time Clock Support (CONFIG_RTC)
Modifier /etc/chrony/chrony.conf: décommenter la directive rtcfile et ajouter rtconutc si l'horloge matérielle conserve l'heure universelle. # Specify the file where real-time clock data is stored. To use this you
# must have enhanced real-time clock support compiled into your kernel.
# Uncomment the next line if you do.
rtcfile /var/lib/chrony/chrony.rtc
rtconutc
Pour que chrony gère bien l'horloge matérielle, il ne
faut plus du tout toucher à celle-ci. Dans le cas de Debian, dans
le script qui contrôle l'horloge matérielle /etc/init.d/hwclock.sh, il faut non seulement ne pas valider la commande hwclock --adjust, mais il faut également neutraliser hwclock --systohc normalement exécuté au shutdown. Seul peut subsister hwclock --hctosys exécuté au démarrage du système. L'horloge matérielle peut dériver, chrony
garde le glissement en mémoire et compense automatiquement quand
il démarre. Pour recaler l'horloge matérielle, il faut uniquement
utiliser la commande trimrtc de chronyc. $ chronyc
chronyc> rtcdata
RTC ref time (UTC) : Fri Jan 11 23:47:58 2002
Number of samples : 13
Number of runs : 5
Sample span period : 23m
RTC is fast by : 9.822327 seconds
RTC gains time at : 12.627 ppm
chronyc> password
Password:
200 OK
chronyc> trimrtc
200 OK
chronyc> rtcdata
RTC ref time (UTC) : Fri Jan 11 23:51:22 2002
Number of samples : 6
Number of runs : 5
Sample span period : 110
RTC is fast by : 0.463440 seconds
RTC gains time at : 12.554 ppm
Avec une ancienne version de Debian (2.0), on trouve xntp3 à la place ntpd et on peut utiliser rdate à la place de ntpdate.
Stations WINDAUBE, antoine et remi (W95)
Installation de
NTPTime Client. Version 3.0
Fichiers téléchargés:
ntptime.exe (exécutable)
ntptime.cpl (control panel)
ntptime.txt (alias .reg, modèle base
de registre)
ntptime.html (page de doc)
Copie de ntptime.exe à c:\windows\system
Copie de ntptime.cpl à c:\windows\system
Lancement du panneau de contrôle de NTPTime via le panneau
de configuration pour configurer la petite bête.
Lancement de ntptime.exe
Le panneau ne se lance pas sur la bécane de Rémi
(?). Contourné le problème en éditant le fichier
ntptime.txt avec les valeurs et les paramètres désirés.
Renommé en ntptime.reg et lancé par double clic pour
entrer dans la base de registre. C'est bon quand même. Satisfaisant.