108.1 Leçon 1
Certification : |
LPIC-1 (102) |
---|---|
Version : |
5.0 |
Thème : |
108 Services Systèmes Essentiels |
Objectif : |
108.1 Maintenir l’heure du système |
Leçon : |
1 sur 2 |
Introduction
Une gestion précise du temps est un élément fondamental de l’informatique moderne. En revanche, la mise en œuvre de la mesure du temps s’avère d’une complexité surprenante. La pratique de la gestion du temps peut sembler triviale pour un utilisateur final, mais le système doit être capable de gérer intelligemment toute une série d’idiosyncrasies et de cas particuliers. Il faut savoir que les fuseaux horaires ne sont pas statiques, mais qu’ils peuvent être modifiés par une décision administrative ou politique. Un pays peut décider de ne plus observer l’heure d’été. Un système doit être capable de gérer ces changements de manière logique. Heureusement pour les administrateurs système, les solutions de gestion du temps sous Linux sont matures et robustes et fonctionnent généralement sans trop d’interférences.
Lorsqu’un système sous Linux démarre, il commence à garder l’heure. Nous parlons alors d’une horloge système, étant donné qu’elle est mise à jour par le système d’exploitation. Par ailleurs, les ordinateurs modernes disposent également d’une horloge matérielle ou horloge en temps réel. Cette horloge matérielle est souvent intégrée à la carte mère et reste à l’heure, que l’ordinateur soit allumé ou non. Lors du démarrage, l’heure du système est réglée sur l’horloge matérielle, mais la plupart du temps, ces deux horloges fonctionnent indépendamment l’une de l’autre. Dans cette leçon, nous aborderons les méthodes qui permettent d’interagir à la fois avec l’horloge système et l’horloge matérielle.
Sur la plupart des systèmes Linux modernes, l’heure du système et l’heure matérielle sont synchronisées avec l’heure du réseau, qui est mise en œuvre par le Network Time Protocol (NTP). Dans la grande majorité des cas, la seule configuration qu’un utilisateur normal devra faire consistera à définir son fuseau horaire et le protocole NTP s’occupera du reste. Cependant, nous allons aborder certaines façons de gérer l’heure manuellement et les spécificités de la configuration de l’heure du réseau seront abordées dans la prochaine leçon.
Heure locale et heure universelle
L’horloge système est réglée sur le temps universel coordonné (UTC), qui correspond à l’heure locale à Greenwich, au Royaume-Uni. En général, un utilisateur souhaite connaître son heure locale. L’heure locale est calculée en partant de l’heure UTC et en appliquant un décalage en fonction du fuseau horaire et de l’heure d’été. Cette méthode permet d’éviter beaucoup de complexité.
L’horloge système peut être réglée sur l’heure UTC ou sur l’heure locale, mais il est recommandé de la régler également sur l’heure UTC.
La date
La commande date
est un outil de base qui affiche simplement l’heure locale :
$ date Sun Nov 17 12:55:06 EST 2019
Les options de la commande date
permettent de jouer sur le format d’affichage.
Par exemple, un utilisateur peut utiliser date -u
pour afficher l’heure UTC actuelle.
$ date -u Sun Nov 17 18:02:51 UTC 2019
D’autres options couramment utilisées affichent l’heure locale dans un format conforme à un format RFC standard :
-I
-
Date/heure au format ISO 8601. L’ajout de
date
(-Idate
) limitera l’affichage à la seule date. Les autres formats sonthours
,minutes
,seconds
etns
pour les nanosecondes. -R
-
Renvoie la date et l’heure au format RFC 5322.
--rfc-3339
-
Renvoie la date et l’heure au format RFC 3339.
Le format d’affichage de date
peut être personnalisé par l’utilisateur avec des séquences spécifiées dans le manuel. Par exemple, l’heure actuelle peut être formatée en heure Unix de la manière suivante :
$ date +%s 1574014515
La page de manuel de date
montre que %s
fait référence au temps Unix.
Le temps Unix est utilisé en interne sur la plupart des systèmes de type Unix. Il stocke le temps UTC comme le nombre de secondes depuis Epoch, qui a été défini comme étant le 1er janvier 1970.
Note
|
Le nombre de bits requis pour stocker l’heure Unix à l’heure actuelle est de 32 bits. À l’avenir, ces 32 bits ne suffiront plus pour contenir l’heure actuelle au format Unix. Cela va entraîner de graves problèmes pour tous les systèmes Linux 32 bits. Heureusement, cela ne se produira pas avant le 19 janvier 2038. |
En utilisant ces séquences, nous sommes en mesure de formater la date et l’heure dans presque tous les formats requis par n’importe quelle application. Bien entendu, dans la plupart des cas, il est préférable de respecter une norme acceptée.
Par ailleurs, date --date
peut être utilisé pour formater une heure qui n’est pas l’heure actuelle. Dans ce cas de figure, un utilisateur peut spécifier la date à appliquer au système en utilisant l’heure Unix par exemple :
$ date --date='@1564013011' Wed Jul 24 20:03:31 EDT 2019
L’option --debug
peut s’avérer fort utile pour s’assurer qu’une date peut être traitée correctement. Observez ce qui se passe lorsque vous passez une date valide à la commande :
$ date --debug --date="Fri, 03 Jan 2020 14:00:17 -0500" date: parsed day part: Fri (day ordinal=0 number=5) date: parsed date part: (Y-M-D) 2020-01-03 date: parsed time part: 14:00:17 UTC-05 date: input timezone: parsed date/time string (-05) date: using specified time as starting value: '14:00:17' date: warning: day (Fri) ignored when explicit dates are given date: starting date/time: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' date: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' = 1578078017 epoch-seconds date: timezone: system default date: final: 1578078017.000000000 (epoch-seconds) date: final: (Y-M-D) 2020-01-03 19:00:17 (UTC) date: final: (Y-M-D) 2020-01-03 14:00:17 (UTC-05)
Cet outil peut s’avérer pratique pour déboguer une application qui génère une date.
Horloge matérielle
Un utilisateur peut invoquer la commande hwclock
pour voir l’heure telle qu’elle est maintenue sur l’horloge en temps réel. Cette commande nécessite des privilèges élevés, nous utiliserons donc sudo
pour lancer la commande dans ce cas :
$ sudo hwclock 2019-11-20 11:31:29.217627-05:00
L’option --verbose
renverra davantage de résultats, ce qui peut être utile pour le débogage :
$ sudo hwclock --verbose hwclock from util-linux 2.34 System Time: 1578079387.976029 Trying to open: /dev/rtc0 Using the rtc interface to the clock. Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2020/01/03 19:23:08 Hw clock time : 2020/01/03 19:23:08 = 1578079388 seconds since 1969 Time since last adjustment is 1578079388 seconds Calculated Hardware Clock drift is 0.000000 seconds 2020-01-03 14:23:07.948436-05:00
Notez la dérive calculée de l’horloge matérielle (Calculated Hardware Clock drift). Cette donnée peut vous indiquer si l’heure système et l’heure matérielle s’écartent l’une de l’autre.
timedatectl
timedatectl
est une commande qui peut être utilisée pour vérifier l’état général de la date et de l’heure, y compris si l’heure réseau a été synchronisée ou non (le protocole NTP sera abordé dans la prochaine leçon).
Par défaut, timedatectl
renvoie des informations similaires à date
, mais avec en plus l’heure RTC (matérielle) ainsi que l’état du service NTP :
$ timedatectl Local time: Thu 2019-12-05 11:08:05 EST Universal time: Thu 2019-12-05 16:08:05 UTC RTC time: Thu 2019-12-05 16:08:05 Time zone: America/Toronto (EST, -0500) System clock synchronized: yes NTP service: active RTC in local TZ: no
Régler l’heure avec timedatectl
Si NTP n’est pas disponible, il est recommandé d’utiliser timedatectl
plutôt que date
ou hwclock
pour régler l’heure :
# timedatectl set-time '2011-11-25 14:00:00'
La procédure est similaire à celle de date
. L’utilisateur peut également définir l’heure indépendamment de la date en utilisant le format HH:MM:SS.
Régler le fuseau horaire avec timedatectl
timedatectl
est la méthode préférée pour régler le fuseau horaire local sur les systèmes Linux basés sur systemd
en l’absence d’interface graphique. timedatectl
va afficher la liste des fuseaux horaires disponibles, et ensuite le fuseau horaire pourra être défini avec l’un de ces derniers en argument.
Dans un premier temps, nous établissons la liste des fuseaux horaires disponibles :
$ timedatectl list-timezones Africa/Abidjan Africa/Accra Africa/Algiers Africa/Bissau Africa/Cairo ...
La liste des fuseaux horaires disponibles est longue, et il vaut mieux utiliser la commande grep
dans ce contexte.
Ensuite, nous pouvons définir le fuseau horaire en utilisant l’un des éléments de la liste obtenue :
$ timedatectl set-timezone Africa/Cairo $ timedatectl Local time: Thu 2019-12-05 18:18:10 EET Universal time: Thu 2019-12-05 16:18:10 UTC RTC time: Thu 2019-12-05 16:18:10 Time zone: Africa/Cairo (EET, +0200) System clock synchronized: yes NTP service: active RTC in local TZ: no
Gardez à l’esprit que le nom du fuseau horaire doit correspondre exactement. Par exemple, Africa/Cairo
changera le fuseau horaire, mais cairo
ou africa/cairo
ne le fera pas.
Désactiver NTP avec timedatectl
Dans certains cas, il peut être nécessaire de désactiver NTP. Cela peut être fait en utilisant systemctl
mais nous allons le faire en utilisant timedatectl
:
# timedatectl set-ntp no $ timedatectl Local time: Thu 2019-12-05 18:19:04 EET Universal time: Thu 2019-12-05 16:19:04 UTC RTC time: Thu 2019-12-05 16:19:04 Time zone: Africa/Cairo (EET, +0200) NTP enabled: no NTP synchronized: no RTC in local TZ: no DST active: n/a
Régler le fuseau horaire sans timedatectl
Le réglage des informations relatives au fuseau horaire constitue une étape standard lors de l’installation de Linux sur une nouvelle machine. S’il existe une procédure d’installation graphique, cette étape sera très probablement gérée sans aucune autre intervention de l’utilisateur.
Le répertoire /usr/share/zoneinfo
contient des informations sur les différents fuseaux horaires disponibles. Dans le répertoire zoneinfo
, il y a des sous-répertoires avec les noms des continents ainsi que d’autres liens symboliques. Pour retrouver le répertoire zoneinfo
de votre région, utilisez votre continent comme point de départ.
Les fichiers zoneinfo
contiennent les règles nécessaires au calcul du décalage de l’heure locale par rapport à l’UTC. Ils sont également importants si votre région observe l’heure d’été. Le contenu de /etc/localtime
sera lu lorsque Linux aura besoin de déterminer le fuseau horaire local. Pour définir le fuseau horaire sans passer par l’interface graphique, l’utilisateur devra créer un lien symbolique pour son emplacement à partir de /usr/share/zoneinfo
vers /etc/localtime
. Par exemple :
$ ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime
Une fois le fuseau horaire correctement réglé, il est conseillé d’exécuter la commande :
# hwclock --systohc
Ceci aura pour effet de régler l’horloge matérielle sur l’horloge système (c’est-à-dire que l’horloge en temps réel sera réglée sur la même heure que date
). Veuillez noter que cette commande est exécutée avec les privilèges de root, dans ce cas en étant connecté en tant que root.
/etc/timezone
est similaire à /etc/localtime
. C’est une représentation en données du fuseau horaire local, et en tant que telle, elle peut être lue en utilisant cat
:
$ cat /etc/timezone America/Toronto
Notez que ce fichier n’est pas utilisé par toutes les distributions Linux.
Régler la date et l’heure sans timedatectl
Note
|
La plupart des systèmes Linux modernes utilisent |
Avec date
date
a une option pour régler l’heure du système. Utilisez --set
ou -s
pour régler la date et l’heure. Vous pouvez également choisir l’option --debug
pour vérifier l’interprétation correcte de la commande :
# date --set="11 Nov 2011 11:11:11"
Notez que les privilèges de root sont nécessaires pour régler la date ici. Nous pouvons également choisir de modifier l’heure ou la date indépendamment :
# date +%Y%m%d -s "20111125"
Ici, nous devons spécifier les séquences de manière à ce que notre chaîne soit interprétée correctement. Par exemple, %Y
fait référence à l’année, et donc les quatre premiers chiffres 2011
seront interprétés comme l’année 2011. De même, %T
est la séquence pour le temps, et elle est illustrée ici par le réglage du temps :
# date +%T -s "13:11:00"
Une fois l’heure système modifiée, il est recommandé de régler également l’horloge matérielle de manière à ce que l’horloge système et l’horloge matérielle soient synchronisées :
# hwclock --systohc
systohc
signifie "horloge système vers horloge matérielle" (system clock to hardware clock).
Avec hwclock
Plutôt que de régler l’horloge système et de mettre à jour l’horloge matérielle, vous pouvez choisir d’inverser le processus. Nous commencerons par régler l’horloge matérielle :
# hwclock --set --date "4/12/2019 11:15:19" # hwclock Fri 12 Apr 2019 6:15:19 AM EST -0.562862 seconds
Notez que par défaut hwclock
s’attend à recevoir l’heure UTC, mais renvoie l’heure locale par défaut.
Une fois l’horloge matérielle réglée, nous devrons mettre à jour l’horloge système à partir de celle-ci. hctosys
peut être compris comme "horloge matérielle vers horloge système" (hardware clock to system clock).
# hwclock --hctosys
Exercices guidés
-
Indiquez si les commandes ci-dessous affichent ou modifient l’horloge système ou l’horloge matérielle :
Commande Système Matérielle Les deux date -u
hwclock --set --date "12:00:00"
timedatectl
timedatectl | grep RTC
hwclock --hctosys
date +%T -s "08:00:00"
timedatectl set-time 1980-01-10
-
Observez le résultat suivant, puis corrigez le format de l’argument pour que la commande fonctionne :
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
-
Utilisez la commande
date
avec les séquences requises pour que le mois du système soit défini à février. Laissez le reste de la date et de l’heure inchangées. -
En supposant que la commande ci-dessus ait réussi, utilisez
hwclock
pour régler l’horloge matérielle depuis l’horloge système. -
Il existe un lieu appelé
eucla
. De quel continent fait-il partie ? Utilisez la commandegrep
pour le découvrir. -
Réglez votre fuseau horaire actuel sur celui de
eucla
.
Exercices d’approfondissement
-
Quelle est la méthode préférée pour régler l’heure ? Dans quel cas la méthode préférée pourrait-elle s’avérer impossible à utiliser ?
-
Pourquoi pensez-vous qu’il existe autant de méthodes pour accomplir la même chose, c’est-à-dire régler l’heure du système ?
-
Après le 19 janvier 2038, l’heure du système Linux nécessitera un nombre de 64 bits pour être stockée. Cependant, il est possible que nous choisissions simplement de définir une "nouvelle époque". Par exemple, le 1er janvier 2038 à minuit pourrait être fixé à un temps de nouvelle époque de
0
. Pourquoi pensez-vous que cette solution n’a pas été retenue ?
Résumé
Voici ce que nous avons appris dans cette leçon :
-
Afficher l’heure dans différents formats en ligne de commande.
-
La différence entre l’horloge système et l’horloge matérielle sous Linux.
-
Régler manuellement l’horloge système.
-
Régler manuellement l’horloge matérielle.
-
Modifier le fuseau horaire du système.
Commandes utilisées dans cette leçon :
date
-
Affiche ou modifie l’horloge système. Autres options :
-u
-
Affiche l’heure UTC.
+%s
-
Utilise une séquence pour afficher l’heure Epoch.
--date=
-
Spécifie une heure donnée à afficher, par opposition à l’heure actuelle.
--debug
-
Affiche les messages de débogage lors de l’analyse d’une date saisie par l’utilisateur.
-s
-
Règle l’horloge système manuellement.
hwclock
-
Affiche ou modifie l’horloge matérielle.
--systohc
-
Utilise l’horloge système pour régler l’horloge matérielle.
--hctosys
-
Utilise l’horloge matérielle pour régler l’horloge système.
--set --date
-
Règle l’horloge matérielle manuellement.
timedatectl
-
Affiche les horloges système et matérielle ainsi que la configuration NTP sur les systèmes Linux basés sur
systemd
.set-time
-
Règle l’heure manuellement.
list-timezones
-
Affiche les fuseaux horaires disponibles.
set-timezone
-
Règle le fuseau horaire manuellement.
set-ntp
-
Active/désactive NTP.
Réponses aux exercices guidés
-
Indiquez si les commandes ci-dessous affichent ou modifient l’horloge système ou l’horloge matérielle :
Commande Système Matérielle Les deux date -u
X
hwclock --set --date "12:00:00"
X
timedatectl
X
timedatectl | grep RTC
X
hwclock --hctosys
X
date +%T -s "08:00:00"
X
timedatectl set-time 1980-01-10
X
-
Observez le résultat suivant, puis corrigez le format de l’argument pour que la commande fonctionne :
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
date --debug --set "12/20/20 0:10 -3"
-
Utilisez la commande
date
avec les séquences requises pour que le mois du système soit défini à février. Laissez le reste de la date et de l’heure inchangées.date +%m -s "2"
-
En supposant que la commande ci-dessus ait réussi, utilisez
hwclock
pour régler l’horloge matérielle depuis l’horloge système.hwclock --systohc
-
Il existe un lieu appelé
eucla
. De quel continent fait-il partie ? Utilisez la commandegrep
pour le découvrir. Saisissez la commande complète ci-dessous :timedatectl list-timezones | grep -i eucla
OU
grep -ri eucla /usr/share/zoneinfo
-
Réglez votre fuseau horaire actuel sur celui de
eucla
.timedatectl set-timezone 'Australia/Eucla'
ou
ln -s /usr/share/zoneinfo/Australia/Eucla /etc/localtime
Réponses aux exercices d’approfondissement
-
Quelle est la méthode préférée pour régler l’heure ? Dans quel cas la méthode préférée pourrait-elle s’avérer impossible à utiliser ?
Dans la plupart des distributions Linux, le protocole NTP est activé par défaut et il convient de le laisser régler l’heure système sans interférence. Cependant, si un système Linux n’est pas connecté à Internet, NTP sera inaccessible. Par exemple, un système Linux embarqué qui fonctionne sur un équipement industriel peut ne pas avoir de connectivité réseau.
-
Pourquoi pensez-vous qu’il existe autant de méthodes pour accomplir la même chose, c’est-à-dire régler l’heure du système ?
Étant donné que la mise à l’heure est une exigence de tous les systèmes *nix depuis des décennies, il existe de nombreuses méthodes traditionnelles de mise à l’heure qui sont encore maintenues.
-
Après le 19 janvier 2038, l’heure du système Linux nécessitera un nombre de 64 bits pour être stockée. Cependant, il est possible que nous choisissions simplement de définir une "nouvelle époque". Par exemple, le 1er janvier 2038 à minuit pourrait être fixé à un temps de nouvelle époque de
0
. Pourquoi pensez-vous que cette solution n’a pas été retenue ?D’ici 2038, l’immense majorité des ordinateurs seront déjà équipés de processeurs 64 bits, et l’utilisation d’un nombre 64 bits ne dégradera pas les performances de manière significative. Cependant, il serait impossible d’estimer les risques de "réinitialisation" du temps d’époque de cette manière. Beaucoup de logiciels anciens pourraient être affectés. Les banques et les grandes entreprises, par exemple, disposent souvent d’un grand nombre de programmes anciens sur lesquels elles s’appuient pour leur usage interne. Ce scénario, comme tant d’autres, constitue donc une étude des compromis à faire. Tout système 32 bits fonctionnant encore en 2038 serait affecté par un dépassement d’époque, mais les logiciels existants seraient affectés par la modification de la valeur d’époque.