14 novembre 2012

UTC or not UTC

UTC linux
Universal Time Coordinate
Pour certaines applications l’heure est un paramètre très important. Un changement d’heure été/hiver non pris en compte, ou faux, peut être grave. Comment gérer l’heure sur un système Linux (Fedora) ?

A: Choisir le temps de référence :
Le plus simple est de prendre comme référence le temps universel, c'est-à-dire UTC, et d’utiliser ce temps pour régler l’horloge matérielle de votre serveur, c'est-à-dire l’horloge maintenue à jour dans un circuit électronique CMOS et qui est réglable via le BIOS. (Mais on va s’arranger pour ne pas avoir à passer par le BIOS)

Si on utilise une autre référence la gestion du changement d’heure hiver/été devient difficile ou même impossible. Si on y ajoute la gestion de machines virtuelles et la mise à jour via NTP ça devient un cauchemar.

B: Définir le temps local :
C'est-à-dire indiquer dans quel fuseau horaire est la machine et/ou l’utilisateur.

Voici comment procéder concrètement pour configurer un serveur Linux type Fédora. Attention if faut être root pour faire tout cela.
  1. Configurer le système de démarrage pour qu’il sache que l'horloge matérielle indique l’heure UTC.
  2. Configurer le fuseau horaire du serveur.
  3. Mettre à jour l’heure locale (heure du système linux)
  4. Mettre à jour l’heure UTC (heure dans le circuit cmos)
Allons y...

a) Editer le fichier /etc/sysconfig/clock pour qu’il ressemble à ceci :
UTC=true
ZONE="Europe/Paris"


UTC=true indique que la valeur lue dans l’horloge matérielle est le temps universel (UTC)
ZONE=" … " indique le nom du répertoire/fichier, relativement à /usr/share/zoneinfo, qui contient la description du fuseau horaire du serveur.

b) Faire un lien logique de /etc/localtime vers le repertoire/fichier choisi ci-dessus pour ZONE.
Exemple :
ln –sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
Ceux qui ont un volume /usr qui risque de ne pas pouvoir être monté préférerons faire une copie. Mais dans ce cas les mises à jour des fichiers de zone n’auront pas d’effet sur la copie dans /etc.

c) IMPORTANT: Ce qui vient d’être fait n’a pas d'effet immédiat sur le fuseau actuel du système. Si en faisant ce qui précède vous avez changé de fuseau horaire, il est faut rebooter afin que cela soit pris en compte.

Pour les deux étapes qui suivent il est imperatif que le fuseau horaire effectif du système soit le bon (celui definit par ZONE dans /etc/sysconfig/clock et par /etc/localtime.

d) Mettre (si nécessaire) votre heure locale à jour avec la commande « date MMDDHHmm »
Exemple, pour le 13/dec 14h15 on tapera :

date 12131415

e) Copier l’heure système (linux) dans l’heure hardware (bios) en indiquant qu’on veut y mettre l’heure UTC. Linux s’occupera de faire la conversion heure locale/heure universelle.

hwclock --systohc –-utc

Voila !
L’étape suivante est de mettre en place un client NTP afin de garder cette heure à jour.

NOTE: Si un utilisateur n'est pas satisfait par le fuseau horaire définit au niveau du serveur, il peut facilement fixer son propre fuseau horaire, pour sa session, avec la variable TZ. L'usage est le même que pour ZONE dans le fichier /etc/sysconfig/clock.

# TZ='Asia/Kolkata'
# export TZ
# date
Wed Nov 14 21:33:11 IST 2012

# TZ='France/Paris'
# date
Wed Nov 14 16:03:30 France 2012

Non, j'ai pas mis une demie heure pour taper la deuxième commande !
Il a un déclage horaire de 5h30 entre Paris et Kolkata