Mini HOWTO Clock

Ron Bean, Dec. 1996 rbean@execpc.com (Adaptation fran�aise par Gacquer fr�d�ric gacquer@neuronnexion.fr)

Dec. 1996
Jeudi 2 avril 1998 V 1.0.

1. Introduction

Les puces d'horloge temps-r�el sur les cartes m�res des PC (et m�me des stations de travail plus on�reuses) sont de notori�t� publique inexactes. Linux fourni une mani�re simple pour corriger cela de mani�re logicielle, rendant virtuellement l'horloge *tr�s* pr�cise m�me sans horloge externe. Mais la plupart des personnes ne semblent pas �tre au courant, pour plusieurs raisons :

  1. Ce n'est pas indiqu� dans la plupart des documentations "Comment installer linux", et cela serait difficile de le mettre en place automatiquement au moment de l'installation du syst�me (bien que pas impossible en th�orie, 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 fa�on.
  4. Le peu qui y font attention r�guli�rement veulent utiliser le logiciel xntpd de louie.udel.edu pour se synchroniser � une horloge externe, comme un serveur r�seau de temps ou une horloge radio.

Ce mini-howto d�crit une approche de bas-niveau. Si vous �tes vraiment int�ress� par ce genre de chose, je vous recommende vivement de passer du temps � http://www.eecis.udel.edu/~ntp/ qui inclus toutes sortes de choses int�ressantes, incluant une documentation compl�te sur xntpd et des liens sur NIST et USNO (j'ai quelques commentaires suppl�mentaires sur xntpd � la fin.)

Note si vous avez plus d'un syst�me d'exploitation sur votre machine, vous devez en laisser seulement un remettre � jour l'horloge CMOS, ainsi ils n'interf�rerons pas l'un envers l'autre. Si vous ex�cutez r�guli�rement � la fois linux et windows sur la m�me machine, vous pourriez �ventuellement pr�f�rer quelques uns des programmes sharewares de gestion de l'horloge disponible pour windows (suivre les liens � partir de l'URL ci-dessus).

2. Utiliser le programme 'clock'

Tout ce que vous devez savoir est dans la page de manuel clock(8), mais ce mini-HOWTO va vous guider pas � pas.

Note Vous devez �tre root pour ex�cuter 'clock', ou n'importe quel autre programme qui modifie soit le temps syst�me soit l'horloge CMOS.

2.1 V�rifier votre installation

Cherchez dans vos fichiers de d�marrage une commande du style 'clock -a' ou 'clock -ua'. Selon la distribution que vous utilisez, cela peut �tre 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 � quelque chose comme cela :

       0.000000 842214901 0.000000
      

Ces nombres sont le facteur de correction (en secondes par jour), le moment o� l'horloge a �t� r�ajust�e la derni�re fois (en secondes depuis le 1er janvier 1970), et les secondes partielles qui ont �t� arrondies la derni�re fois. Si vous n'avez pas ce fichier, connectez vous en tant que root et cr�ez le, avec une seule ligne qui ressemble � (que des z�ros) :

         0.0 0 0.0
      

Ensuite ex�cutez 'clock -a' ou 'clock -ua' manuellement � partir du shell pour mettre � jour le deuxi�me nombre (utiliser le 'u' si votre horloge est configur�e en Universel plut�t que temps local).

2.2 Mesurer le taux de d�rive temporelle de votre horloge

Pour commencer, vous devez connaitre l'heure qu'il est :-). Votre temps local du jour peut ou peut ne pas �tre exact. Ma m�thode pr�f�r�e est d'appeler l'horloge parlante au 3699 (c'est un appel gratuit). Si vous avez acc�s � un serveur r�seau de temps, vous pouvez utiliser le programme ntpdate du progiciel xntpd (utiliser le param�tre -b pour emp�cher le noyau de cafouiller l'horloge CMOS). Sinon utiliser 'date -s hh:mm:ss' pour mettre l'heure syst�me � la main, puis 'clock -w' pour mettre � jour l'horloge CMOS � partir de l'heure du syst�me. Vous devrez vous rappeler la derni�re fois que vous avez chang� l'heure, donc �crivez la date quelque part o� vous ne la perdrez pas. Si vous avez utilis� ntpdate, faire 'date +%s' et �crire le nombre de secondes depuis le 1er janvier 1970.

Puis revenez quelques jours ou semaines apr�s et regardez de combien l'horloge a d�riv�. Si vous mettez l'horloge � jour � la main, je vous recommanderais d'attendre au moins deux semaines, et de seulement calculer le taux de d�rive le plus proche d'un dixi�me de secondes par jour. Apr�s plusieurs mois vous pourrez obtenir le plus proche d'un centi�me de secondes par jour (quelques personnes affirment �tre encore plus pr�cis mais je resterais prudent dans ce cas). Si vous utilisez ntpdate, vous n'aurez pas � attendre si longtemps, mais dans tous les cas vous pourrez toujours affiner plus tard.

Vous pouvez avoir cron qui ex�cute 'clock -a' � des moments r�guliers pour garder le temps syst�me en accord avec le temps (corrig�) CMOS. Cette commande sera aussi ex�cut�e � partir de vos fichiers de d�marrage � chaque fois que vous relancerez le syst�me, ainsi si vous le faites souvent (comme quelques uns d'entre nous le font), cela peut suffire � vos besoins.

Remarquez que certains programmes peuvent se plaindrent si le syst�me saute plus d'une seconde � la fois, ou s'il retranche du temps. Si vous avez ce probl�me, vous pouvez utiliser xntpd ou ntpdate pour corriger le temps plus graduellement.

2.3 Exemple

Mettre � jour le temps

Se connecter root. Appeler le 3699 (vocal), �couter l'annonce de l'heure. Puis taper:

         date -s hh:mm:ss
      

Mais ne tapez Entr�e que lorsque vous entendez le bip. (vous pouvez utiliser 'ntpdate' ici plut�t que 'date', et �viter l'appel t�l�phonique). Cela met � jour le 'temps noyau'. Puis taper :

       clock -w
      

Cela met � jour l'horloge CMOS pour correspondre au temps noyau. Puis taper:

       date +%j
      

(ou 'date +%s' si vous utilisez 'ntpdate', plut�t que 'date' ci-dessus) et �crire le nombre qu'il vous donne pour la prochaine fois.

Pour remettre � jour le temps et v�rifier le taux de d�rive

Trouver la date que vous avez �crit la derni�re fois. Se connecter root puis taper:

           clock -a
      

Cela met � jour le temps noyau qui correspond ainsi au temps CMOS. Appeler le 3699 (vocal), �couter l'annonce. Puis taper :

           date
      

et appuyer sur Entr�e quand vous entendez le signal sonore, mais alors que vous attendez, notez le temps annonc�, et ne raccrochez pas de suite. Cela vous dit � quel temps votre machine pensait �tre, quand cela aurait du �tre exact � la minute. Maintenant entrez :

           date hh:mm:00
      

utilisant la minute *apr�s* celle qui vient juste d'�tre annonc�e, et appuyez sur entr�e quand vous entendez le signal sonore � nouveau (maintenant vous pouvez raccrocher). Pour hh utiliser le temps local. Cela met � jour le 'temps noyau'.

Puis taper :

            clock -w
      

qui �crit le nouveau (correct) temps dans l'horloge CMOS. Maintenant tapez :

            date +%j
      

(ou 'date +%s' si c'est ce que vous avez utilis� avant).

Vous avez maintenant trois nombres (deux dates et une heure) qui vont vous permettre de calculer la d�rive de temps.

Calculer le facteur de correction

quand vous ex�cutez 'date' � l'instant, est-ce que votre machine �tait en avance ou en retard ? Si elle avan�ait, vous aurez � retrancher quelques secondes, alors �crivez le comme un nombre n�gatif. Si elle retardait, vous aurez � ajouter quelques secondes, alors �crivez le comme positif.

Maintenant soustrayez les deux dates. Si vous avez utilis� 'date +%j', les nombres repr�sentent le jour de l'ann�e (1-365, ou 1-366 pour les ann�es bissextiles). Si vous avez pass� le 1er janvier depuis votre derni�re modification horaire vous aurez � ajouter 365 (ou 366) au deuxi�me nombre. Si vous avez utilis� 'date +%s' alors votre nombre est en secondes, et vous aurez � le diviser par 86400 pour obtenir des jours.

Si vous avez d�j� un facteur de correction dans /etc/adjtime, vous aurez � tenir compte du nombre de secondes que vous avez d�j� corrig�. Si vous avez trop corrig�, ce nombre aura le signe oppos� � celui que vous venez juste de mesurer; si vous n'avez pas assez corrig� il aura le m�me signe. Multipliez l'ancien facteur de correction par le nombre de jour, et ensuite ajouter le nouveau nombre de secondes (addition sign�e -- si les deux nombres ont le m�me signe, vous obtiendrez un nombre plus grand, s'ils ont des signes oppos�s 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 � la place de l'ancien. Conservez la nouvelle date (en secondes par jour) pour la prochaine fois.

Voici � quoi ressemble mon /etc/adjtime :

            -9.600000 845082716 -0.250655
      

Note (on remarque que 9.6 secondes par jour c'est presque 5 minutes par mois !)

2.4 Quelques mots � propos de xntpd

Votre syst�me a en fait deux horloges -- l'horloge temps r�el sur batterie qui garde trace du temps quand le syst�me est �teint (aussi connue comme "l'horloge CMOS", "horloge mat�rielle" ou "RTC") et le 'temps noyau' (parfois appell�e "horloge logicielle" ou "horloge syst�me") qui est bas� sur l'interruption timer et qui est initialis�e � partir de l'horloge CMOS au d�marrage du syst�me. Les deux vont d�river � des rythmes diff�rents, ainsi elles vont graduellement s'�carter l'une de l'autre, tout en s'�cartant du temps 'r�el'.

Toutes les r�f�rences � "l'horloge" dans la documentation de xntpd se r�f�rent � "l'horloge noyau". Quand vous ex�cutez xntpd ou timed (ou n'importe quel autre programme qui utilise l'appel syst�me adjtimex), le noyau linux suppose que l'horloge du noyau est plus pr�cise que l'horloge CMOS, et remets � jour le temps CMOS toutes les 11 minutes � partir de ce moment (jusqu'� ce que l'on relance l'ordinateur). Cela signifie que 'clock' ne sais plus quand l'horloge CMOS a �t� modifi� la derni�re fois, ainsi vous ne pouvez plus utiliser le facteur de correction dans /etc/adjtime. Vous pouvez utiliser ntpdate dans votre fichier de d�marrage pour mettre � jour initialement l'horloge � partir d'un serveur de temps avant de lancer xntpd. Si vous n'avez pas toujours acc�s � une source fiable de temps lors de l'allumage de l'ordinateur, cela peut �tre un peu g�nant -- xntpd n'est pas vraiment con�u pour �tre utilis� dans des situations comme celles l�.

Xntpd inclue des drivers pour plusieurs horloges radio, et peut �tre configur� pour appeler le service de temps t�l�phonique de NIST � des temps r�guliers (soyez s�r de calculer l'incidence sur votre facture t�l�phonique lors du param�trage de l'intervalle entre deux appels). Il peut aussi appliquer un facteur de correction � l'horloge noyau s'il perd contact avec les autres sources pour une p�riode de temps assez longue.

La plupart des horloges radio co�tent 3-4000$, mais vous pouvez obtenir des plans pour une 'boite gadget' peu ch�re (en fait un modem 300 baud) qui se met entre votre ordinateur et n'importe quelle radio onde courte r�gl�e sur la station de temps canadienne CHU (voir ftp://ftp.udel.edu/pub/ntp/gadget.tar.Z). Le r�cepteur Heathkit WWV ("l'Horloge la Plus Pr�cise") est aussi encore disponible (bien que n'�tant pas en kit), et co�te aux environs de 4-500 $. Les signaux GPS contiennent aussi des informations de temps, et quelques recepteurs GPS peuvent se connecter sur le port s�rie. Cela peut �tre la solution la moins on�reuse dans un futur proche.

En th�orie, on peut �crire un programme pour utiliser le service de temps t�l�phonique NIST pour calculer automatiquement le taux de d�rive de l'horloge CMOS et de l'horloge noyau. Je ne suis pas au courant d'un quelconque programme d�mon qui ferait cela, mais la plupart du code peut �tre emprunt� � xntpd.