System time (Français)
Dans un système d'exploitation, l'heure (horloge) est déterminée par trois éléments : la valeur de l'heure, qu'il s'agisse de l'heure locale, de l'heure UTC ou d'une autre valeur, le fuseau horaire et l'heure d'été (DST), le cas échéant. Cet article explique ce qu'ils sont et comment les lire/régler. Deux horloges sont présentes sur les systèmes : une horloge matérielle et une horloge système qui sont également détaillées dans cet article.
Le comportement standard de la plupart des systèmes d'exploitation est le suivant :
- Régler l'horloge système à partir de l'horloge matérielle au démarrage.
- Maintenir une heure précise de l'horloge système, consultez #Synchronisation du temps.
- Régler l'horloge matérielle à partir de l'horloge système à l'extinction.
Horloge matérielle
L'horloge matérielle (aussi appelée horloge en temps réel (RTC) ou horloge CMOS) enregistre les valeurs suivantes : Année, Mois, Jour, Heure, Minute et Secondes. Seuls les microprogrammes UEFI de 2016, ou plus récents, ont la capacité de stocker le fuseau horaire, et si l'heure d'été est utilisée.
Lire l'horloge matérielle
# hwclock --show
Régler l'horloge matérielle à partir de l'horloge système
Ce qui suit définit l'horloge matérielle à partir de l'horloge système. De plus, elle met à jour /etc/adjtime
ou la crée si elle n'existe pas. Consultez hwclock(8) § The Adjtime File pour plus d'informations sur ce fichier ainsi que la section #Décalage horaire.
# hwclock --systohc
Horloge système
L'horloge système (alias l'horloge logicielle) garde la trace de : l'heure, le fuseau horaire, et l'heure d'été si applicable. Elle est calculée par le noyau Linux comme le nombre de secondes depuis minuit le 1er janvier 1970, UTC. La valeur initiale de l'horloge système est calculée à partir de l'horloge matérielle, en fonction du contenu de /etc/adjtime
. Une fois le démarrage terminé, l'horloge système fonctionne indépendamment de l'horloge matérielle. Le noyau Linux garde la trace de l'horloge système en comptant les interruptions de la minuterie.
Lire l'horloge
Pour vérifier l'heure actuelle de l'horloge système (présentée à la fois en heure locale et en UTC) ainsi que la RTC (horloge matérielle) :
$ timedatectl
Régler l'horloge du système
Pour régler directement l'heure locale de l'horloge système :
# timedatectl set-time "aaaa-MM-jj hh:mm:ss"
Par exemple :
# timedatectl set-time "2014-05-26 11:13:54"
définit l'heure au 26 mai 2014, 11:13 et 54 secondes.
Standard de temps
Il existe deux standards de temps : L'heure locale (localtime) et Temps universel coordonné (UTC). L'heure locale dépend du "fuseau horaire" (timezone) actuel, tandis que l'UTC est l'heure "globale" et est indépendante des valeurs du fuseau horaire. Bien que conceptuellement différent, UTC est également connu sous le nom de GMT (Greenwich Mean Time).
La norme utilisée par l'horloge matérielle (horloge CMOS, l'heure du BIOS) est définie par le système d'exploitation. Par défaut, Windows utilise l'heure locale, macOS utilise l'heure UTC, les autres systèmes UNIX et de type UNIX varient. Un système d'exploitation qui utilise la norme UTC considère généralement l'horloge matérielle comme UTC et y apporte un ajustement pour définir l'heure du système d'exploitation au démarrage en fonction du fuseau horaire.
Si plusieurs systèmes d'exploitation sont installés sur une machine, ils dériveront tous l'heure actuelle de la même horloge matérielle : il est recommandé d'adopter une norme unique pour l'horloge matérielle afin d'éviter les conflits entre les systèmes et de la régler sur UTC. Sinon, si l'horloge matérielle est réglée sur localtime, plusieurs systèmes d'exploitation peuvent l'ajuster après un changement de l'heure d'été par exemple, entraînant ainsi une surcorrection ; des problèmes peuvent également survenir lors d'un voyage entre différents fuseaux horaires et l'utilisation d'un des systèmes d'exploitation pour réinitialiser l'horloge système/matérielle.
L'horloge matérielle peut être interrogée et réglée avec la commande timedatectl
.
Vous pouvez consulter l'heure standard actuelle de l'horloge matérielle d'un système Arch en utilisant :
$ timedatectl | grep local
RTC in local TZ: no
Pour changer l'heure standard de l'horloge matérielle en heure locale, utilisez :
# timedatectl set-local-rtc 1
Pour revenir à l'horloge matérielle en UTC, tapez :
# timedatectl set-local-rtc 0
Ceci génère /etc/adjtime
automatiquement et met à jour le RTC en conséquence ; aucune autre configuration n'est nécessaire.
Pendant le démarrage du noyau, au moment où le pilote RTC est chargé, l'horloge système peut être réglée à partir de l'horloge matérielle. Cela dépend de la plate-forme matérielle, de la version du noyau et des options de construction du noyau. Si cela se produit, à ce moment de la séquence de démarrage, l'heure de l'horloge matérielle est supposée être UTC et la valeur de /sys/class/rtc/rtcN/hctosys
. (N=0,1,2,..) sera fixée à 1.
Plus tard, l'horloge système est à nouveau réglée à partir de l'horloge matérielle par systemd, en fonction des valeurs dans /etc/adjtime
. Par conséquent, le fait d'avoir l'horloge matérielle utilisant l'heure locale peut provoquer un comportement inattendu pendant la séquence de démarrage ; par exemple l'heure du système qui revient en arrière, ce qui est toujours une mauvaise idée (il y a bien pire que cela). Pour éviter cela, systemd ne se synchronisera en arrière que si l'horloge matérielle est réglée sur UTC et que le noyau n'est pas informé du fuseau horaire local. Par conséquent, les horodatages sur un système de fichiers FAT touché par le système Linux seront en UTC.
- L'utilisation de
timedatectl
nécessite un D-Bus actif. Par conséquent, il peut ne pas être possible d'utiliser cette commande sous un chroot (comme lors de l'installation). (comme lors de l'installation). Dans ces cas, vous pouvez revenir à la commande hwclock, ou utiliser systemd-nspawn au lieu de chroot. - Si
/etc/adjtime
n'est pas présent, systemd suppose que l'horloge matérielle est réglée sur UTC.
UTC dans Microsoft Windows
Pour dual boot avec Windows, il est recommandé de configurer Windows pour utiliser UTC, plutôt que Linux pour utiliser l'heure locale. (Par défaut, Windows utilise l'heure locale [1].)
Cela peut être fait par une simple correction du registre : Ouvrez regedit
et ajoutez une valeur DWORD
avec la valeur hexadécimale 1
dans le registre :
HKEY_LOCAL_MACHINE{SYSTEM{CurrentControlSet{Control{TimeZoneInformation{RealTimeIsUniversal
Vous pouvez effectuer cette opération à partir d'une invite de commande d'administrateur :
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
Vous pouvez également créer un fichier *.reg
(sur le bureau) avec le contenu suivant et le double-cliquer pour l'importer dans le registre :
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation] "RealTimeIsUniversal"=dword:00000001
Si Windows vous demande de mettre à jour l'horloge en raison du changement d'heure, laissez-le faire. Il laissera l'horloge en UTC comme prévu, en corrigeant seulement l'heure affichée.
L'heure de l'#Horloge matérielle et de l'#Horloge système peut devoir être mise à jour après avoir défini cette valeur.
Si vous avez des problèmes avec le décalage de l'heure, essayez de réinstaller tzdata et de régler à nouveau votre fuseau horaire :
# timedatectl set-timezone Europe/Paris
Notes historiques
Pour les très vieux Windows, la méthode ci-dessus échoue, à cause de bogues de Windows. Plus précisément,
- Pour les versions 64 bits de Windows 7 et les anciennes versions de Windows 10, il existait un bogue qui rendait nécessaire l'utilisation d'une valeur
QWORD
avec une valeur hexadécimale de1
au lieu d'une valeurDWORD
. Ce bogue a été corrigé dans les nouvelles versions et maintenant seule la valeurDWORD
fonctionne. - Avant Vista SP2, il y a un bogue qui remet l'horloge à l'heure locale après la reprise depuis l'état de suspension/hibernation.
- Pour XP et les versions antérieures, il y a un bogue lié à l'heure d'été. Consultez [2] pour plus de détails.
- Pour les versions encore plus anciennes de Windows, vous pouvez lire https://www.cl.cam.ac.uk/~mgk25/mswish/ut-rtc.html - la fonctionnalité n'était même pas documentée ni officiellement prise en charge à l'époque.
Pour ces systèmes d'exploitation, il est recommandé d'utiliser localtime.
UTC dans Ubuntu
L'horloge matérielle d'Ubuntu et de ses dérivés est configurée pour être interprétée comme étant en "heure locale" si Windows a été détecté sur un disque quelconque pendant l'installation d'Ubuntu. Ceci est apparemment fait délibérément pour permettre aux nouveaux utilisateurs de Linux d'essayer Ubuntu sur leurs ordinateurs Windows sans modifier le registre.
Pour modifier ce comportement, consultez ci-dessus.
Fuseau horaire
Pour vérifier le fuseau actuel défini pour le système :
$ timedatectl status
Pour lister les zones disponibles :
$ timedatectl list-timezones
Pour définir votre fuseau horaire :
# timedatectl set-timezone Zone/SubZone
Exemple :
# timedatectl set-timezone Canada/Eastern
Cela créera un lien symbolique /etc/localtime
qui pointe vers un fichier zoneinfo sous /usr/share/zoneinfo/
. Si vous choisissez de créer le lien manuellement (par exemple pendant chroot où timedatectl
ne fonctionnera pas), gardez à l'esprit que ce doit être un lien symbolique, comme spécifié dans localtime(5) § DESCRIPTION :
# ln -sf /usr/share/zoneinfo/Zone/SubZone /etc/localtime
Consultez timedatectl(1) et localtime(5) pour plus de détails.
Réglage basé sur la géolocalisation
Pour définir automatiquement le fuseau horaire en fonction de la localisation de l'adresse IP, on peut utiliser une API de géolocalisation pour récupérer le fuseau horaire, par exemple curl https://ipapi.co/timezone
, et passer la sortie à timedatectl set-timezone
pour un réglage automatique. Certaines API géo-IP qui fournissent des services gratuits ou partiellement gratuits sont listées ci-dessous :
Mise à jour du fuseau horaire à chaque fois que NetworkManager se connecte à un réseau
Créez un script pour le répartiteur de NetworkManager :
/etc/NetworkManager/dispatcher.d/09-timezone
#!/bin/sh case "$2" dans up) timedatectl set-timezone "$(curl --fail https://ipapi.co/timezone)" ; ; esac
Alternativement, l'outil tzupdateAUR définit automatiquement le fuseau horaire en fonction de la géolocalisation de l'adresse IP. Cette comparaison des API de géolocalisation IP les plus populaires peut être utile pour décider de l'API à utiliser en production.
Décalage horaire
Chaque horloge a une valeur qui diffère du temps réel (dont la meilleure représentation est le temps atomique international) ; aucune horloge n'est parfaite. Une horloge électronique à quartz donne un temps imparfait, mais conserve une imprécision constante. Cette "imprécision" de base est connue sous le nom de "biais temporel" ou "dérive temporelle".
Lorsque l'horloge matérielle est réglée avec hwclock
, une nouvelle valeur de dérive est calculée en secondes par jour. La valeur de dérive est calculée en utilisant la différence entre la nouvelle valeur réglée et la valeur de l'horloge matérielle juste avant le réglage, en tenant compte de la valeur de la dérive précédente et de la dernière fois que l'horloge matérielle a été réglée. La nouvelle valeur de dérive et le moment où l'horloge a été réglée sont écrits dans le fichier /etc/adjtime
, écrasant les valeurs précédentes. L'horloge matérielle peut donc être ajustée en fonction de la dérive lorsque la commande hwclock --adjust
est exécutée ; cela se produit également à l'arrêt mais seulement si le daemon hwclock
est activé, donc pour les systèmes Arch qui utilisent systemd, cela ne se produit pas.
hwclock
considère que la période de temps écoulée est trop courte pour calculer précisément la dérive.Si l'horloge matérielle continue à perdre ou à gagner du temps par incréments importants, il est possible qu'une dérive invalide ait été enregistrée (mais cela ne s'applique que si le daemon hwclock est en cours d'exécution). Cela peut se produire si vous avez mal réglé l'heure de l'horloge matérielle ou si votre standard de temps n'est pas synchronisé avec une installation Windows ou macOS. La valeur de la dérive peut être supprimée en supprimant d'abord le fichier /etc/adjtime
, puis en réglant correctement l'heure de l'horloge matérielle et de l'horloge système. Vous devriez ensuite vérifier si votre norme horaire est correcte.
/etc/adjtime
même en utilisant systemd, (par exemple si vous ne pouvez ou ne voulez pas utiliser NTP), vous devez appeler hwclock --adjust
régulièrement, peut-être en créant une tâche cron.L'horloge logicielle est très précise mais, comme la plupart des horloges, elle n'est pas parfaitement exacte et dérive également. Bien que rarement, l'horloge système peut perdre sa précision si le noyau saute des interruptions. Il existe quelques outils pour améliorer la précision de l'horloge logicielle :
- Consultez #Synchronisation du temps.
Synchronisation du temps
Le Network Time Protocol (NTP) est un protocole permettant de synchroniser les horloges des systèmes informatiques sur des réseaux de données à commutation de paquets et à latence variable. Les implémentations suivantes de NTP sont disponibles pour Arch Linux :
- Chrony — Un client et un serveur itinérants conçus spécifiquement pour les systèmes qui ne sont pas en ligne en permanence.
- ConnMan — Un gestionnaire de réseau léger prenant en charge NTP.
- Network Time Protocol daemon — L'implémentation de référence du protocole, dont l'utilisation est particulièrement recommandée sur les serveurs de temps. Il peut également ajuster la fréquence d'interruption et le nombre de ticks par seconde pour diminuer la dérive de l'horloge système, et provoquera la re-synchronisation de l'horloge matérielle toutes les 11 minutes.
- ntpclient — Un client NTP simple en ligne de commande.
- NTPsec — Un dérivé de NTPd, axé sur la sécurité.
- https://ntpsec.org/ || ntpsecAUR
- OpenNTPD — Partie du projet OpenBSD et implémente à la fois un client et un serveur.
- sntp — Un client SNTP fourni avec NTPd. Il remplace ntpdate et est recommandé dans les environnements sans serveur.
- systemd-timesyncd — Un simple daemon SNTP qui n'implémente qu'un côté client, se concentrant uniquement sur l'interrogation de l'heure depuis un serveur distant. Il devrait être plus qu'approprié pour la plupart des installations.
Paramètres par utilisateur/session ou temporaires
Pour certaines utilisations, il peut être utile de modifier les paramètres de l'heure sans toucher aux valeurs globales du système. Par exemple, pour tester des applications qui dépendent de l'heure pendant le développement ou pour ajuster le fuseau horaire du système lorsqu'on se connecte à un serveur à distance depuis une autre zone.
Pour qu'une application "voie" une date/heure différente de celle du système, vous pouvez utiliser l'utilitaire faketime(1) (de libfaketime).
Si vous souhaitez plutôt qu'une application consulte un fuseau horaire différent de celui du système, définissez la variable d'environnement TZ
, par exemple :
$ date && export TZ=":/usr/share/zoneinfo/Pacific/Fiji" && date
Tue Nov 1 14:34:51 CET 2016 Wed Nov 2 01:34:51 FJT 2016
C'est différent du simple réglage de l'heure, car cela permet par exemple de tester le comportement d'un programme avec des valeurs de décalage UTC positives ou négatives, ou les effets des changements d'heure d'été lors du développement sur des systèmes dans un fuseau horaire sans heure d'été.
Une autre utilisation est d'avoir des fuseaux horaires différents pour différents utilisateurs du même système : ceci peut être réalisé en définissant la variable TZ
dans le fichier de configuration du shell, consultez Environment variables#Defining variables.
Trucs et astuces
fake-hwc clock
alarm-fake-hwclock conçu spécialement pour les systèmes sans RTC sauvegardé par batterie, il inclut un service systemd qui, à l'arrêt, sauvegarde l'heure actuelle et, au démarrage, restaure l'heure sauvegardée, évitant ainsi d'étranges erreurs de voyage dans le temps.
Installez fake-hwclock-gitAUR, démarrez et activez fake-hwclock.service
.
Dépannage
L'horloge affiche une valeur qui n'est ni UTC ni l'heure locale
Cela peut être causé par un certain nombre de raisons. Par exemple, si votre horloge matérielle fonctionne à l'heure locale, mais que timedatectl
est configuré pour supposer qu'elle est en UTC, le résultat serait que le décalage de votre fuseau horaire par rapport à UTC est effectivement appliqué deux fois, ce qui donne des valeurs erronées pour votre heure locale et UTC.
Pour forcer votre horloge à l'heure correcte, et pour écrire également l'UTC correct sur votre horloge matérielle, suivez ces étapes :
- Configurez ntpd (l'activer en tant que service n'est pas nécessaire).
- Réglez correctement votre fuseau horaire.
- Exécutez
ntpd -qg
pour synchroniser manuellement votre horloge avec le réseau, en ignorant les écarts importants entre l'UTC local et l'UTC du réseau. - Exécutez
hwclock --systohc
pour écrire l'heure UTC logicielle actuelle sur l'horloge matérielle.