
                               Mini HOWTO Clock

Ron Bean, Dec. 1996 rbean@execpc.com (Adaptation franaise par Gacquer frdric
gacquer@neuronnexion.fr)

   Dec. 1996
     _________________________________________________________________

   _Jeudi 2 avril 1998 V 1.0._
     _________________________________________________________________

1. Introduction

   Les puces d'horloge temps-rel sur les cartes mres des PC (et mme
   des stations de travail plus onreuses) sont de notorit publique
   inexactes. Linux fourni une manire simple pour corriger cela de
   manire logicielle, rendant virtuellement l'horloge *trs* prcise
   mme 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 systme (bien que
       pas impossible en thorie, 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 faon.
    4. Le peu qui y font attention rgulirement veulent utiliser le
       logiciel xntpd de louie.udel.edu pour se synchroniser  une
       horloge externe, comme un serveur rseau de temps ou une horloge
       radio.

   Ce mini-howto dcrit une approche de bas-niveau. Si vous tes vraiment
   intress 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 intressantes, incluant une documentation complte sur xntpd et
   des liens sur NIST et USNO (j'ai quelques commentaires supplmentaires
   sur xntpd  la fin.)

   _Note_ si vous avez plus d'un systme d'exploitation sur votre
   machine, vous devez en laisser seulement un remettre  jour l'horloge
   CMOS, ainsi ils n'interfrerons pas l'un envers l'autre. Si vous
   excutez rgulirement  la fois linux et windows sur la mme machine,
   vous pourriez ventuellement prfrer 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 excuter 'clock', ou n'importe quel
   autre programme qui modifie soit le temps systme soit l'horloge CMOS.

2.1 Vrifier votre installation

   Cherchez dans vos fichiers de dmarrage 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 rajuste la dernire fois (en secondes
   depuis le 1er janvier 1970), et les secondes partielles qui ont t
   arrondies la dernire fois. Si vous n'avez pas ce fichier, connectez
   vous en tant que root et crez le, avec une seule ligne qui ressemble
    (que des zros) :

         0.0 0 0.0

   Ensuite excutez 'clock -a' ou 'clock -ua' manuellement  partir du
   shell pour mettre  jour le deuxime nombre (utiliser le 'u' si votre
   horloge est configure en Universel plutt que temps local).

2.2 Mesurer le taux de drive 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 mthode
   prfre est d'appeler l'horloge parlante au 3699 (c'est un appel
   gratuit). Si vous avez accs  un serveur rseau de temps, vous pouvez
   utiliser le programme ntpdate du progiciel xntpd (utiliser le
   paramtre -b pour empcher le noyau de cafouiller l'horloge CMOS).
   Sinon utiliser 'date -s hh:mm:ss' pour mettre l'heure systme  la
   main, puis 'clock -w' pour mettre  jour l'horloge CMOS  partir de
   l'heure du systme. Vous devrez vous rappeler la dernire 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 aprs et regardez de combien
   l'horloge a driv. Si vous mettez l'horloge  jour  la main, je vous
   recommanderais d'attendre au moins deux semaines, et de seulement
   calculer le taux de drive le plus proche d'un dixime de secondes par
   jour. Aprs plusieurs mois vous pourrez obtenir le plus proche d'un
   centime de secondes par jour (quelques personnes affirment tre
   encore plus prcis 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 excute 'clock -a'  des moments rguliers
   pour garder le temps systme en accord avec le temps (corrig) CMOS.
   Cette commande sera aussi excute  partir de vos fichiers de
   dmarrage  chaque fois que vous relancerez le systme, 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 systme
   saute plus d'une seconde  la fois, ou s'il retranche du temps. Si
   vous avez ce problme, 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 Entre que lorsque vous entendez le bip. (vous pouvez
   utiliser 'ntpdate' ici plutt que 'date', et viter l'appel
   tlphonique). 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', plutt que 'date'
   ci-dessus) et crire le nombre qu'il vous donne pour la prochaine
   fois.

  Pour remettre  jour le temps et vrifier le taux de drive

   Trouver la date que vous avez crit la dernire 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 Entre 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 *aprs* celle qui vient juste d'tre annonce, et
   appuyez sur entre 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 drive de temps.

  Calculer le facteur de correction

   quand vous excutez 'date'  l'instant, est-ce que votre machine tait
   en avance ou en retard ? Si elle avanait, vous aurez  retrancher
   quelques secondes, alors crivez le comme un nombre ngatif. 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 reprsentent le jour de l'anne (1-365, ou 1-366 pour les
   annes bissextiles). Si vous avez pass le 1er janvier depuis votre
   dernire modification horaire vous aurez  ajouter 365 (ou 366) au
   deuxime 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 dj un facteur de correction dans /etc/adjtime, vous
   aurez  tenir compte du nombre de secondes que vous avez dj 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 mme signe. Multipliez l'ancien facteur de correction par le nombre
   de jour, et ensuite ajouter le nouveau nombre de secondes (addition
   signe -- si les deux nombres ont le mme signe, vous obtiendrez un
   nombre plus grand, s'ils ont des signes opposs 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 systme a en fait deux horloges -- l'horloge temps rel sur
   batterie qui garde trace du temps quand le systme est teint (aussi
   connue comme "l'horloge CMOS", "horloge matrielle" ou "RTC") et le
   'temps noyau' (parfois appelle "horloge logicielle" ou "horloge
   systme") qui est bas sur l'interruption timer et qui est initialise
    partir de l'horloge CMOS au dmarrage du systme. Les deux vont
   driver  des rythmes diffrents, ainsi elles vont graduellement
   s'carter l'une de l'autre, tout en s'cartant du temps 'rel'.

   Toutes les rfrences  "l'horloge" dans la documentation de xntpd se
   rfrent  "l'horloge noyau". Quand vous excutez xntpd ou timed (ou
   n'importe quel autre programme qui utilise l'appel systme adjtimex),
   le noyau linux suppose que l'horloge du noyau est plus prcise 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 dernire fois, ainsi vous ne pouvez plus utiliser le facteur de
   correction dans /etc/adjtime. Vous pouvez utiliser ntpdate dans votre
   fichier de dmarrage pour mettre  jour initialement l'horloge 
   partir d'un serveur de temps avant de lancer xntpd. Si vous n'avez pas
   toujours accs  une source fiable de temps lors de l'allumage de
   l'ordinateur, cela peut tre un peu gnant -- xntpd n'est pas vraiment
   conu 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 tlphonique de NIST  des
   temps rguliers (soyez sr de calculer l'incidence sur votre facture
   tlphonique lors du paramtrage 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 priode de temps
   assez longue.

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

   En thorie, on peut crire un programme pour utiliser le service de
   temps tlphonique NIST pour calculer automatiquement le taux de
   drive de l'horloge CMOS et de l'horloge noyau. Je ne suis pas au
   courant d'un quelconque programme dmon qui ferait cela, mais la
   plupart du code peut tre emprunt  xntpd.
