Mini HOWTO Clock Ron Bean, Dec. 1996 rbean@execpc.com (Adaptation francaise par Gacquer frederic gacquer@neuronnexion.fr) 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 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 ). 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. .