%--------------------------------------------------------------------
\chapter{Garder la trace du temps} \label{chap:time}
%--------------------------------------------------------------------

        \begin{chapterquote}
Le temps est une illusion. L'heure du déjeuner encore plus.\\
	(Douglas Adams.) \\
        \end{chapterquote}

	\noindent
Ce chapitre explique comment un système Linux gère le temps, et ce qu'il y a besoin de faire pour éviter les problèmes.
Normalement, il n'y a rien à faire, mais il est préférable de comprendre comment tout cela fonctionne.

\section{Zones horaires}

Midi est le moment du jour où le soleil est à sa position la plus haute. Comme la terre est ronde,\footnote{Selon de récentes
recherches.} midi arrive à différents moments en différents lieux. Ceci mène au concept d'\textbf{heure locale}. Les
hommes mesurent le temps à l'aide de nombreuses unités, la plupart liées à des phénomènes naturels comme midi. Tant que
l'on reste au m\^eme endroit, le fait que les heures locales diffèrent ne pose aucun problème.

Dès que l'on a besoin de communiquer avec des endroits différents, on a besoin d'un base de temps commune. Dans nos temps
modernes, la plupart des endroits du monde communiquent avec d'autres endroits et on a donc défini 
un standard pour mesurer le temps. Ce temps est appelé \textbf{heure universelle} (UT ou UTC\footnote{NDT : pour 
\textbf{Universal Time}.}, autrefois connu comme << Greenwich Meridian Time >>, ou GMT, car cette heure est l'heure locale à
Greenwich, qui se trouve en Angleterre). Lorsque des personnes ayant des heures locales différentes désirent 
communiquer, elles peuvent exprimer les temps en heure universelle, ainsi il n'y a plus de confusion sur le moment où les
choses se passent.
	
Chaque heure locale est appelée fuseau horaire. Alors que la géographie pourrait permettre à tous les endroits qui ont  midi 
au m\^eme moment d'avoir la m\^eme zone horaire, la politique rend la chose difficile. Pour diverses raisons, de nombreux
pays utilisent \textbf{heure d'été et heure d'hiver} (DST : Daylight Saving Time), c'est-à-dire qu'ils adaptent leurs horloges pour avoir plus de
lumière naturelle pendant les périodes de travail et les remettent en place en hiver. D'autres pays ne le font pas. 
Ceux qui le font ne sont pas d'accord sur le moment où les horloges doivent \^etre modifiées, et ils changent les
règles d'années en années. Ceci rend les conversions entre zones horaires vraiment peu évidentes.
	
La meilleure façon de nommer les zones horaires est d'indiquer l'endroit,  ou la différence entre l'heure locale et 
l'heure universelle. Aux USA et dans d'autres pays, les zones horaires locales ont un nom et une abréviation sur trois
lettres. Cependant, les abréviations ne sont pas uniques et ne devraient pas \^etre utilisées sauf si le pays est aussi
indiqué. Il est préférable de parler d'heure locale en disant, par exemple, Helsinki plut\^ot qu'en parlant d'heure
de l'Europe de l'est car tous les pays d'Europe de l'est ne suivent pas les m\^emes règles.
	
Linux a un paquetage de zones horaires qui sait tout sur les zones horaires existantes, et qui peut facilement \^etre
modifié lorsque les règles changent. Tout ce que l'administrateur système doit faire est de choisir la zone horaire
appropriée. De plus, chaque utilisateur peut configurer sa propre zone horaire --~c'est important car beaucoup de gens
travaillent sur des ordinateurs dans différents pays sur Internet. Lorsque les règles de changement d'heure évoluent dans
notre zone horaire locale, on doit s'assurer que l'on met à jour au moins cette partie de notre système Linux. A part
configurer la zone horaire du système et mettre à jour les fichiers de données de la zone horaire, il n'y a pas
grand chose d'autre à faire.
	
\section{Les horloges matérielle et logicielle}

Un ordinateur personnel possède une horloge matérielle sauvegardée par une pile. La pile permet à l'horloge de fonctionner
m\^eme si le reste de l'ordinateur est privé d'électricité. L'horloge matérielle peut \^etre configurée à partir de
l'écran de configuration du BIOS ou à partir de n'importe quel système d'exploitation en cours d'utilisation.
	
Le noyau Linux conserve le temps indépendamment de l'horloge matérielle. Au moment du démarrage, Linux met sa
propre horloge au temps indiqué par l'horloge matérielle. Après cela, les deux horloges fonctionnent de façon 
indépendante. Linux gère sa propre horloge car consulter le matériel est lent et compliqué.

L'horloge du noyau donne toujours l'heure universelle. Ainsi, le noyau n'a pas du tout besoin de se soucier des zones 
horaires --~la simplicité donne une fiabilité accrue et facilite la mise à jour des informations des zones horaires. Chaque
processus gère lui-m\^eme les conversions de zone horaire (en utilisant les outils standards qui font partie du paquetage
des zones horaires).
	
L'horloge matérielle peut \^etre en heure locale ou universelle. Habituellement, il est préférable de l'avoir en
heure universelle car, ainsi, on n'a pas besoin de la changer lorsque les changements horaires arrivent (l'UTC n'a pas
de changement horaire).	Malheureusement, certains systèmes d'exploitation des PCs --~dont MS-DOS, Windows et OS/2~-- 
supposent que l'horloge matérielle donne l'heure locale. Linux peut s'en satisfaire, mais si l'horloge matérielle donne
l'heure locale, alors elle doit \^etre modifiée à chaque changement d'heure (sinon, elle ne donnera plus l'heure locale).
	
\section{Conna\^\i tre et configurer l'heure}

Dans le système Debian, la zone horaire du système est déterminée par le lien symbolique \fn{/etc/localtime}. 
Ce lien pointe vers un fichier de données de zone horaire décrivant la zone horaire locale. Ces fichiers de données
de zone horaire se trouvent sous \fn{/usr/lib/zoneinfo}. Les autres distributions Linux peuvent procéder différemment.
	
Un utilisateur peut changer sa zone horaire privée en utilisant la variable d'envi\-ron\-ne\-ment TZ. Si celle-ci n'est 
pas positionnée, la zone horaire du système est supposée. La syntaxe de la variable TZ est décrite dans la page de
\man{tzset}(3) du manuel en ligne.
	
La commande \cmd{date} donne la date et l'heure courante.\footnote{Attention à la commande \cmd{time}, qui
ne donne \emph{pas} l'heure courante.} Par exemple~:
%
\begin{tscreen}
\verb|$| \textsl{date} \\
\verb|Sun Jul 14 21:53:41 EET DST 1996| \\
\verb|$|
\end{tscreen}
%
	On est le dimanche 14 juillet, et il est à peu près dix heures moins dix du soir, dans la zone horaire 
appelée << EET DST >> (ce qui peut signifier East European Daylight Saving Time). 
	\cmd{date} peut aussi donner l'heure universelle~:
%
\begin{tscreen}
\verb|$| \textsl{date -u} \\
\verb|Sun Jul 14 18:53:42 UTC 1996| \\
\verb|$|
\end{tscreen}
%
	\cmd{date} est aussi utilisée pour configurer l'horloge logicielle du noyau~:
%
\begin{tscreen}
\verb|#| \textsl{date 07142157} \\
\verb|Sun Jul 14 21:57:00 EET DST 1996| \\
\verb|#| \textsl{date} \\
\verb|Sun Jul 14 21:57:02 EET DST 1996| \\
\verb|#|
\end{tscreen}
%
Voir la page de \cmd{date} du manuel en ligne pour plus de détails --~la syntaxe est un peu sybilline. Seul 
\texttt{root} peut configurer l'heure. Alors que chaque utilisateur peut avoir sa propre zone horaire, l'horloge est
la m\^eme pour tout le monde.
	
	\cmd{date} montre seulement, ou configure, l'horloge logicielle.
	La commande \cmd{clock} synchronise les horloges matérielle et logicielle.
Elle est utilisée lorsque le système démarre, pour lire l'horloge matérielle et configurer l'horloge logicielle. Si l'on a
besoin de configurer les deux horloges, on doit d'abord configurer l'horloge logicielle avec
\cmd{date}, puis l'horloge matérielle avec \texttt{clock -w}.

L'option \texttt{-u} passée à \cmd{clock} lui indique que l'horloge matérielle est en heure universelle. On
\emph{doit} utiliser l'option \texttt{-u} correctement, sinon l'ordinateur sera plut\^ot embrouillé sur l'heure qu'il
est.

Les horloges doivent \^etre changées avec précaution. De nombreuses parties d'un système Unix ont besoin des horloges
pour fonctionner correctement. Par exemple, le démon \cmd{cron} lance périodiquement des commandes. Si l'on change
l'horloge, il peut \^etre emb\^eté pour savoir s'il doit ou non lancer les commandes. Sur un ancien système Unix, quelqu'un
avait avancé l'horloge de vingt ans, et \cmd{cron} voulait lancer toutes les commandes périodiques sur vingt ans
en une seule fois. Les versions actuelles de \cmd{cron} savent gérer cela correctement, mais on doit quand m\^eme
\^etre prudent. Les grands sauts, ou les sauts en arrière sont plus dangereux que les petits sauts ou les sauts en avant.

\section{Quand l'horloge est incorrecte}

L'horloge logicielle Linux n'est pas toujours précise. Elle est maintenue en fonc\-tion\-ne\-ment par une \textbf{interruption
timer} périodique générée par le PC. Si le système a trop de processus en train de tourner, cela peut prendre trop de
temps pour s'occuper de l'interruption du timer, et l'horloge logicielle commence à dériver. L'horloge matérielle tourne
indépendamment et est, généralement, plus précise. Si l'on démarre souvent son ordinateur (comme c'est le cas pour la 
plupart des systèmes qui ne sont pas des serveurs), il gardera normalement une heure plut\^ot précise.
	
Si on doit ajuster l'horloge matérielle, il est généralement plus simple de redémarrer, d'aller dans la configuration du 
BIOS, et de le faire de là. Ceci évite tous les problèmes qu'un changement d'heure système peut causer. Si on ne peut le
faire à partir du BIOS, on met la nouvelle heure avec \cmd{date} et \cmd{clock} (dans cet ordre), mais on doit \^etre
pr\^et à redémarrer si une partie du système commence à se comporter curieusement.
	
Un ordinateur en réseau (m\^eme si c'est juste à travers un modem) peut vérifier automatiquement sa propre horloge en la
comparant avec l'heure d'un autre ordinateur. Si cet autre ordinateur est connu pour avoir une horloge très précise, les
deux ordinateurs auront une heure précise. Ceci peut \^etre fait en utilisant les commandes \cmd{rdate} et
\cmd{netdate}. Les deux vérifient l'heure d'un ordinateur distant (\cmd{netdate} peut gérer plusieurs ordinateurs
distants), et mettent l'heure de l'ordinateur local à celle-ci.	En lançant régulièrement l'une de ces commandes,
notre ordinateur gardera une heure aussi précise que celle de l'ordinateur distant.
