Mini HOWTO Clock
Ron Bean, Dec. 1996
[email protected] (Adaptation francaise
par Gacquer frederic
[email protected])
Dec. 1996
Jeudi 2 avril 1998 V 1.0.
11.. IInnttrroodduuccttiioonn
Les puces d'horloge temps-reel sur les cartes meres des PC (et meme
des stations de travail plus onereuses) sont de notoriete publique
inexactes. Linux fourni une maniere simple pour corriger cela de
maniere logicielle, rendant virtuellement l'horloge *tres* precise
meme sans horloge externe. Mais la plupart des personnes ne semblent
pas etre au courant, pour plusieurs raisons :
1. Ce n'est pas indique dans la plupart des documentations "Comment
installer linux", et cela serait difficile de le mettre en place
automatiquement au moment de l'installation du systeme (bien que
pas impossible en theorie, si vous avez un modem).
2. Si vous essayez "man clock" vous obtiendrez clock(3), ce qui n'est
pas ce que vous souhaitez. (Essayez "man 8 clock").
3. La plupart des gens ne semblent pas tenir compte de l'heure qu'il
est de toute facon.
4. Le peu qui y font attention regulierement veulent utiliser le
logiciel xntpd de louie.udel.edu pour se synchroniser a une horloge
externe, comme un serveur reseau de temps ou une horloge radio.
Ce mini-howto decrit une approche de bas-niveau. Si vous etes vraiment
interesse par ce genre de chose, je vous recommende vivement de passer
du temps a <
http://www.eecis.udel.edu/~ntp/> qui inclus toutes sortes
de choses interessantes, incluant une documentation complete sur xntpd
et des liens sur NIST et USNO (j'ai quelques commentaires
supplementaires sur xntpd a la fin.)
_N_o_t_e si vous avez plus d'un systeme d'exploitation sur votre machine,
vous devez en laisser seulement un remettre a jour l'horloge CMOS,
ainsi ils n'interfererons pas l'un envers l'autre. Si vous executez
regulierement a la fois linux et windows sur la meme machine, vous
pourriez eventuellement preferer quelques uns des programmes
sharewares de gestion de l'horloge disponible pour windows (suivre les
liens a partir de l'URL ci-dessus).
22.. UUttiilliisseerr llee pprrooggrraammmmee ''cclloocckk''
Tout ce que vous devez savoir est dans la page de manuel clock(8),
mais ce mini-HOWTO va vous guider pas a pas.
_N_o_t_e Vous devez etre root pour executer 'clock', ou n'importe quel
autre programme qui modifie soit le temps systeme soit l'horloge CMOS.
22..11..
VVeerriiffiieerr vvoottrree iinnssttaallllaattiioonn
Cherchez dans vos fichiers de demarrage une commande du style peut
etre dans /etc/rc.local, /etc/rc.d/rc.sysinit, ou dans un endroit
similaire.
Si c'est 'clock -s' ou 'clock -us', changez le 's' en 'a', puis
regardez si vous avez un fichier /etc/adjtime, ne contenant qu'une
ligne ressemblant a quelque chose comme cela :
0.000000 842214901 0.000000
Ces nombres sont le facteur de correction (en secondes par jour), le
moment ou l'horloge a ete reajustee la derniere fois (en secondes
depuis le 1er janvier 1970), et les secondes partielles qui ont ete
arrondies la derniere fois. Si vous n'avez pas ce fichier, connectez
vous en tant que root et creez le, avec une seule ligne qui ressemble
a (que des zeros) :
0.0 0 0.0
Ensuite executez 'clock -a' ou 'clock -ua' manuellement a partir du
shell pour mettre a jour le deuxieme nombre (utiliser le 'u' si votre
horloge est configuree en Universel plutot que temps local).
22..22..
MMeessuurreerr llee ttaauuxx ddee ddeerriivvee tteemmppoorreellllee ddee vvoottrree hhoorrllooggee
Pour commencer, vous devez connaitre l'heure qu'il est :-). Votre
temps local du jour peut ou peut ne pas etre exact. Ma methode
preferee est d'appeler l'horloge parlante au 3699 (c'est un appel
gratuit). Si vous avez acces a un serveur reseau de temps, vous pouvez
utiliser le programme ntpdate du progiciel xntpd (utiliser le
parametre -b pour empecher le noyau de cafouiller l'horloge CMOS).
Sinon utiliser systeme. Vous devrez vous rappeler la derniere fois que
vous avez change l'heure, donc ecrivez la date quelque part ou vous ne
la perdrez pas. Si vous avez utilise ntpdate, faire 'date +%s' et
ecrire le nombre de secondes depuis le 1er janvier 1970.
Puis revenez quelques jours ou semaines apres et regardez de combien
l'horloge a derive. Si vous mettez l'horloge a jour a la main, je vous
recommanderais d'attendre au moins deux semaines, et de seulement
calculer le taux de derive le plus proche d'un dixieme de secondes par
jour. Apres plusieurs mois vous pourrez obtenir le plus proche d'un
centieme de secondes par jour (quelques personnes affirment etre
encore plus precis mais je resterais prudent dans ce cas). Si vous
utilisez ntpdate, vous n'aurez pas a attendre si longtemps, mais dans
tous les cas vous pourrez toujours affiner plus tard.
Vous pouvez avoir cron qui execute 'clock -a' a des moments reguliers
pour garder le temps systeme en accord avec le temps (corrige) CMOS.
Cette commande sera aussi executee a partir de vos fichiers de
demarrage a chaque fois que vous relancerez le systeme, ainsi si vous
le faites souvent (comme quelques uns d'entre nous le font), cela peut
suffire a vos besoins.
Remarquez que certains programmes peuvent se plaindrent si le systeme
saute plus d'une seconde a la fois, ou s'il retranche du temps. Si
vous avez ce probleme, vous pouvez utiliser xntpd ou ntpdate pour
corriger le temps plus graduellement.
22..33..
EExxeemmppllee
22..33..11..
MMeettttrree aa jjoouurr llee tteemmppss
Se connecter root. Appeler le 3699 (vocal), ecouter l'annonce de
l'heure. Puis taper:
date -s hh:mm:ss
Mais ne tapez Entree que lorsque vous entendez le bip. (vous pouvez
utiliser 'ntpdate' ici plutot que 'date', et eviter l'appel
telephonique). Cela met a jour le 'temps noyau'. Puis taper :
clock -w
Cela met a jour l'horloge CMOS pour correspondre au temps noyau. Puis
taper:
date +%j
(ou 'date +%s' si vous utilisez 'ntpdate', plutot que 'date' ci-
dessus) et ecrire le nombre qu'il vous donne pour la prochaine fois.
22..33..22..
PPoouurr rreemmeettttrree aa jjoouurr llee tteemmppss eett vveerriiffiieerr llee ttaauuxx ddee ddeerriivvee
Trouver la date que vous avez ecrit la derniere fois. Se connecter
root puis taper:
clock -a
Cela met a jour le temps noyau qui correspond ainsi au temps CMOS.
Appeler le 3699 (vocal), ecouter l'annonce. Puis taper :
date
et appuyer sur Entree quand vous entendez le signal sonore, mais alors
que vous attendez, notez le temps annonce, et ne raccrochez pas de
suite. Cela vous dit a quel temps votre machine pensait etre, quand
cela aurait du etre exact a la minute. Maintenant entrez :
date hh:mm:00
utilisant la minute *apres* celle qui vient juste d'etre annoncee, et
appuyez sur entree quand vous entendez le signal sonore a nouveau
(maintenant vous pouvez raccrocher). Pour hh utiliser le temps local.
Cela met a jour le 'temps noyau'.
Puis taper :
clock -w
qui ecrit le nouveau (correct) temps dans l'horloge CMOS. Maintenant
tapez :
date +%j
(ou 'date +%s' si c'est ce que vous avez utilise avant).
Vous avez maintenant trois nombres (deux dates et une heure) qui vont
vous permettre de calculer la derive de temps.
22..33..33..
CCaallccuulleerr llee ffaacctteeuurr ddee ccoorrrreeccttiioonn
quand vous executez 'date' a l'instant, est-ce que votre machine etait
en avance ou en retard ? Si elle avancait, vous aurez a retrancher
quelques secondes, alors ecrivez le comme un nombre negatif. Si elle
retardait, vous aurez a ajouter quelques secondes, alors ecrivez le
comme positif.
Maintenant soustrayez les deux dates. Si vous avez utilise 'date +%j',
les nombres representent le jour de l'annee (1-365, ou 1-366 pour les
annees bissextiles). Si vous avez passe le 1er janvier depuis votre
derniere modification horaire vous aurez a ajouter 365 (ou 366) au
deuxieme nombre. Si vous avez utilise 'date +%s' alors votre nombre
est en secondes, et vous aurez a le diviser par 86400 pour obtenir des
jours.
Si vous avez deja un facteur de correction dans /etc/adjtime, vous
aurez a tenir compte du nombre de secondes que vous avez deja corrige.
Si vous avez trop corrige, ce nombre aura le signe oppose a celui que
vous venez juste de mesurer; si vous n'avez pas assez corrige il aura
le meme signe. Multipliez l'ancien facteur de correction par le
nombre de jour, et ensuite ajouter le nouveau nombre de secondes
(addition signee -- si les deux nombres ont le meme signe, vous
obtiendrez un nombre plus grand, s'ils ont des signes opposes vous
aurez un nombre plus petit).
Puis divisez le nombre total de secondes par le nombre de jours pour
obtenir le nouveau facteur de correction, et le mettre dans
/etc/adjtime a la place de l'ancien. Conservez la nouvelle date (en
secondes par jour) pour la prochaine fois.
Voici a quoi ressemble mon /etc/adjtime :
-9.600000 845082716 -0.250655
_N_o_t_e (on remarque que 9.6 secondes par jour c'est presque 5 minutes
par mois !)
22..44..
QQuueellqquueess mmoottss aa pprrooppooss ddee xxnnttppdd
Votre systeme a en fait deux horloges -- l'horloge temps reel sur
batterie qui garde trace du temps quand le systeme est eteint (aussi
connue comme "l'horloge CMOS", "horloge materielle" ou "RTC") et le
'temps noyau' (parfois appellee "horloge logicielle" ou "horloge
systeme") qui est base sur l'interruption timer et qui est initialisee
a partir de l'horloge CMOS au demarrage du systeme. Les deux vont
deriver a des rythmes differents, ainsi elles vont graduellement
s'ecarter l'une de l'autre, tout en s'ecartant du temps 'reel'.
Toutes les references a "l'horloge" dans la documentation de xntpd se
referent a "l'horloge noyau". Quand vous executez xntpd ou timed (ou
n'importe quel autre programme qui utilise l'appel systeme adjtimex),
le noyau linux suppose que l'horloge du noyau est plus precise que
l'horloge CMOS, et remets a jour le temps CMOS toutes les 11 minutes a
partir de ce moment (jusqu'a ce que l'on relance l'ordinateur). Cela
signifie que 'clock' ne sais plus quand l'horloge CMOS a ete modifie
la derniere fois, ainsi vous ne pouvez plus utiliser le facteur de
correction dans /etc/adjtime. Vous pouvez utiliser ntpdate dans votre
fichier de demarrage pour mettre a jour initialement l'horloge a
partir d'un serveur de temps avant de lancer xntpd. Si vous n'avez pas
toujours acces a une source fiable de temps lors de l'allumage de
l'ordinateur, cela peut etre un peu genant -- xntpd n'est pas vraiment
concu pour etre utilise dans des situations comme celles la.
Xntpd inclue des drivers pour plusieurs horloges radio, et peut etre
configure pour appeler le service de temps telephonique de NIST a des
temps reguliers (soyez sur de calculer l'incidence sur votre facture
telephonique lors du parametrage de l'intervalle entre deux appels).
Il peut aussi appliquer un facteur de correction a l'horloge noyau
s'il perd contact avec les autres sources pour une periode de temps
assez longue.
La plupart des horloges radio coutent 3-4000$, mais vous pouvez
obtenir des plans pour une 'boite gadget' peu chere (en fait un modem
300 baud) qui se met entre votre ordinateur et n'importe quelle radio
onde courte reglee sur la station de temps canadienne CHU (voir
<
ftp://ftp.udel.edu/pub/ntp/gadget.tar.Z>). Le recepteur Heathkit WWV
("l'Horloge la Plus Precise") est aussi encore disponible (bien que
n'etant pas en kit), et coute aux environs de 4-500 $. Les signaux GPS
contiennent aussi des informations de temps, et quelques recepteurs
GPS peuvent se connecter sur le port serie. Cela peut etre la solution
la moins onereuse dans un futur proche.
En theorie, on peut ecrire un programme pour utiliser le service de
temps telephonique NIST pour calculer automatiquement le taux de
derive de l'horloge CMOS et de l'horloge noyau. Je ne suis pas au
courant d'un quelconque programme demon qui ferait cela, mais la
plupart du code peut etre emprunte a xntpd.