Garder son PC à l'heure ou synchroniser plusieurs machines sur la même base de temps n'est pour diverses raisons pas toujours évident. Et pourtant c'est primordiale lorsque l'on est plusieurs à accéder à une même ressource, ou simplement pour éviter de louper un rendez-vous...
Les distributions règlent généralement ce problème en collant un serveur NTP en mémoire mais c'est un peu prendre un marteau pour écraser une mouche et surtout cela manque de souplesse. Voyons donc comment fonctionne le temps sur un PC, et sur GNU/Linux en particulier.
Depuis que le PC est PC, il y a toujours eu deux horloges, l'une logicielle et l'autre matérielle.
L'horloge logicielle des premiers PC et PC/XT, était prise en charge par une puce Intel 8253 relevée avec les PC/AT par la 8254. Ces puces "timer-counter" étaient programmées par le BIOS pour générer une interruption toutes les 54.936 secondes, soit environ 18.206 fois par secondes. A l'époque le manque de précision impliquant que l'horloge se désynchronisait avec la réalité en perdant en gros une minute par jours. Aujourd'hui les sources sont beaucoup plus précise avec des puces comme les PIT (Programmable Interrupt Timer) utilisé notamment par Linux (clock=pit au démarrage du kernel).
La commande pour lire et écrire dans cette horloge est donc :
Mais même si elle sont plus précise, les horloges logicielles gardent une lacune de taille, elle ne savent pas compter le temps lorsque le PC est éteint.
Cette horloge là est dite RTC (Real Time CLock) et prise en charge par un composant spécifique sur la carte mère (dans le temps, la fameuse "Dallas") même si aujourd'hui elle est de plus en plus intégrée au southbridge. Cette horloge est généralement basée sur un quartz qui oscille, comme celui des montres, à une fréquence de 32768Hz, soit 215 fois par secondes, ce qui est pratique pour le comptage binaire. Ce circuit a sa propre alimentation, par une simple pile au lithium ou un
supercondensateur
. Le résultat en est une horloge relativement précise qui tourne tout le temps, même PC éteint. C'est aussi grâce à ce composant que l'on peut, via le BIOS, allumer un PC à une heure précise.
Pour lire et écrire dans l'horloge matérielle la commande est
Vous avez constaté en lançant ces commandes que la réaction n'est pas instantanée, en lecture comme en écriture, ce qui explique sûrement (mais je n'en suis pas bien sur) pourquoi les OS n'utilisent pas uniquement cette horloge.
Maintenant voyons comment synchroniser l'horloge matérielle avec l'horloge logicielle et inversement :
Maintenant nos deux horloges sont bien sympathique mais qu'en est-il du "vrai" temps qui passe ? L'idéal pour être à l'heure est de la demander à un serveur qui sait de quoi il parle. Ce sont les serveurs NTP (Net Time Protocol). Et il y'en a de nombreux de disponible, alors autant en profiter.
Le seul problème est que la majorité des distributions passent par une usine à gaz pour récupérer le temps sur un serveur distant en passant par l'installation locale d'un service ntpd alors que là aussi, il existe une commande faite pour cela.
Cette commande c'est ntpdate du paquet ntp-client et son rôle est simplement de mettre à jour l'horloge système avec un serveur NTP distant. Ce serveur distant peut être sur Internel, mais aussi installé par vos soins.
Une fois que vous votre adresse, ici j'utilise fr.pool.ntp.org, vous pouvez lancer la commande de synchronisation :
Maintenant nous n'avons plus qu'à mettre tout cela dans un script
Ce script peut être lancé à la main en cas de besoin ou mieux, être collé dans le CRON pour être exécuté sur une base journalière. Mais Comme le fait très justement remarquer Axone dans un commentaire un peu plus bas ce n'est pas très sympathique pour les serveurs distant su tout le monde les appelle à heure entière (ex. xx:00). Donc nous allons faire cela plus intelligemment en créant un fichier /etc/cron.d/time-sync :
Ainsi la mise à jour est faite tous les jours à 23:17, ce qui limite bien les risques.
Voilà, pas de grosse artillerie donc pour simplement s'assurer que deux machines fonctionnent sur la même base de temps ou que votre portable ne vous fait pas louper un rendez-vous...
- répondre
Malic , le 20 June, 2007 - 16:55ntpdate est généralement lancé de toute façon au démarrage des machines avec le kit ntpd (fichier /etc/ntp/step-sticker, je crois) car ntpd ne sachant pas compenser (i.e remettre à l'heure) un ecart trop grand, il est nécessaire de faire une première remise à l'heure avant de passer la main à ntpd.
ntpd n'est vraiment nécessaire que lorsque vous avez besoin d'avoir plusieurs machines avec une horloge à l'unisson.
Sinon pour un usage au quotidien, ntpdate suffit largement, voire même avec KDE, il me semble qu'il y a une option dans l'horloge en bas à droit pour cette usage
- répondre
Ulhume, le 20 June, 2007 - 17:44Pour ce qui est de KDE c'est vrai mais je n'utilise généralement cela que sur des serveurs. Et en effet ntpdate est lancé avec ntpd mais cela implique de "soucis". 1/ comme tu le soulignes, ntpd n'a pas d'intérêt si l'on ne souhaite pas donner le LA à un parc entier 2/ J'ai pas mal de serveurs avec une dérive de temps qui implique une remise à l'heure régulière, d'où le script CRON, là pas de soucis.
- répondre
tuxce , le 21 October, 2008 - 16:50Complément d'infos:
debian et compatibles, si je me rappelle bien synchronisent le temps à chaque fois qu'une interface réseau est montée (si le paquet ntpdate est installé)
et des distribs genre archlinux fournissent un "script de démarrage" pour ntpdate qu'il suffit de traiter de la même façon qu'un daemon sauf qu'il ne fait que mettre à jour et quitte.
mais c'est clair que ce n'est pas suffisant pour un serveur avec un uptime élevé et une dérive continue.
- répondre
Ulhume, le 21 October, 2008 - 16:54@tuxce ben sur ce coup là, debian est clairement plus intelligent que Mandriva. Car avec leur système de "service", tu as l'air malin avec un portable qui n'a pas le net, genre en clientelle, qui reste bloqué 10 minutes en cherchant un serveur NTP sur un réseau qui n'existe pas...
- répondre
Yannick , le 21 October, 2008 - 19:17Merci pour ces explications sur l'heure matérielle..etc..
Par contre, attention a ntpdate qui change l'heure "trop brusquement" pour certains démons tournant sur la machine (voir le lien ci dessus)
- répondre
Ulhume, le 21 October, 2008 - 19:34@Yannick intéressant, merci.
- répondre
nicolargo , le 21 October, 2008 - 21:15Super, merci pour le billet.
Pour ceux que cela interesse j'ai écrit il y a quelques jours un tutu pour installer un serveur NTP (basée sur NTPd) sous GNU/Linux.
http://blog.nicolargo.com/2008/10/installation-dun-serveur-ntp.html
A+
- répondre
Ulhume, le 21 October, 2008 - 21:18@nicolargo yep, je l'avais lu et j'ai même voté pour, ce qui est assez rare pour être souligé
Pratique pour éviter de faire appel à un serveur externe sur un grand réseau !
PS: j'ai fusionné les deux commentaires.
- répondre
Ulhume, le 21 October, 2008 - 21:22@nicolargo je l'ai ajouté dans le billet.
- répondre
Axone , le 21 October, 2008 - 21:52Il y a longtemps, j'avais un article dans GLMF il me semble sur NTP, et j'en ai retenu qu'il ne fallait surtout pas lancer une demande de mise à l'heure à l'aide de Cron. Car bien souvent on fait cela à heure fixe (quotidiennement voir toutes les heures pour certains). Et comme tout le monde à la même heure, il en résulte une demande très forte de mise à l'heure au même moment. Par exemple 13h59m59s c'est calme, puis arrive 14h00m00s c'est la saturation.
La bonne utilisation était de laisser Le démon ntpd s'occuper de tout. Il allait de lui même prendre contact avec les serveurs ntp. Il pouvait même corriger la dérive existante (jusqu'à une vingtaine de minutes il me semble) sur plusieurs jours sans perturber aucun service par un saut d'heure. Cette correction se faisait en augmentant ou diminuant légèrement la durée de chaque seconde.
- répondre
Ulhume, le 21 October, 2008 - 22:09@Axone Ah oui c'est pas idiot du tout ça !! J'ai modifié pour utiliser plutôt une crontab qui se déclenche à 23:17 (ou toute heure de votre choix), et comme cela, toujours pas de démon
- répondre
nyquist , le 22 October, 2008 - 14:19Merci pour ton post et spécialement la partie sur hwclock, outil que je ne connaissais pas du tout!!
ça m'a permis de mettre à jour l'heure machine et j'espère qu'au prochain reboot je n'aurait plus l'erreur "adjtime failed: Invalid argument" dû à la trop grande différence de temps!
- répondre
Ulhume, le 22 October, 2008 - 18:36@nyquist ravi que cela puisse t'aide. Ceci dit, tu as normalement un service qui fait très exactement ce travail de sychronisation au moment du shutdown.
- répondre
Dab, le 26 October, 2008 - 23:59Petite remarque, il semble qu'il manque un paragraphe traitant de tzdata, celui qui nous a permis de changer d'heure la nuit dernière sans pourtant disposer de connexion Internet. Sinon comme toujours, un plaisir de te lire ... je me répète là non ?
- répondre
Ulhume, le 28 October, 2008 - 22:10@Dab je ne connais pas tzdata pour être honnête
Poster un nouveau commentaire