Régler l’heure de serveurs virtuels sous Debian

Quand des serveurs ont besoin de communiquer entre eux, il devient vite indispensable d’utiliser la même référence de temps. Cela semble évident mais, en pratique, ce petit détail est souvent négligé. Résultat : synchronisation de données défectueuses, résultats incohérents, documents écrasés par d’anciennes versions, fichiers de log illisibles… Que du bonheur !

Pourtant, mettre à l’heure un serveur est simple. Et quand le serveur accueille des serveurs virtuels ? Comme nous allons le voir, cela reste toujours simple !

Lire l’heure

L’heure d’un serveur sous Debian (comme sur d’autres distributions Linux) est gérée par la commande date. Sans paramètre, elle retourne la date et l’heure du système :

# date
mar avr 18 12:47:53 CEST 2006

On remarque au passage que le résultat est formaté selon les paramètres de localisation du système (ici en français pour l’heure locale de Paris).

Pour obtenir l’heure UTC, c’est-à-dire l’heure universelle ou heure de Greenwich, on ajoute le paramètre -u :

# date -u
mar avr 18 10:47:53 UTC 2006

On obtient bien un décalage de 2 heures par rapport à l’heure de Paris.

Modifier l’heure

Pour modifier l’heure, on utilise le paramètre --set :

# date --set 12:53:20

Et si la date n’est pas bonne, même remède :

# date --set 2006-05-18

Configuration du fuseau horaire

Si le fuseau horaire ne convient pas, inutile de réinstaller le système ! On utilise simplement la commande tzconfig et on répond aux questions :

# tzconfig
Your current time zone is set to Europe/Paris
Do you want to change that? [n]: y

Please enter the number of the geographic area in which you live:
[...]
Number: 8

[...]

Please enter the name of one of these cities or zones
[...]
Name: Paris
Your default time zone is set to 'Europe/Paris'.
Local time is now: mar avr 18 13:07:02 CEST 2006.
Universal Time is now: mar avr 18 11:07:02 UTC 2006.

Facile ! Pour information, la configuration du fuseau horaire est stockée dans le fichier /etc/timezone.

Temps système et temps BIOS

Tout semble parfait mais il y a un détail sournois : votre serveur gère deux références de temps, celle du système et celle de la carte-mère (horloge BIOS) ! Et elles peuvent très bien ne pas indiquer la même heure ! Dans certains cas, cette subtile différence peut avoir des conséquences agaçantes lors du redémarrage du serveur (par exemple, perte de l’heure système). Comme dit le proverbe, « l’homme qui a une montre sait l’heure qu’il est, celui qui en a deux n’est jamais sûr. »

Donc, autant régler une bonne fois pour toute l’heure matérielle avec la commande hwclock. Comme nous avons déjà réglé l’heure système, on utilise l’option --systohc pour la récupérer et --utc pour la définir en heure UTC :

# hwclock --systohc --utc

Synchronisation avec un serveur de temps

« Bon, tout est à l’heure, je passe à autre chose. »

Pas encore ! Car le quartz qui pilote l’oscillation de l’horloge de la carte-mère n’est jamais parfait. L’heure va donc se décaler petit à petit (parfois de plusieurs secondes par jour !). Heureusement, le protocole NTP (Network Time Protocol) vient à notre secours et offre la possibilité de synchroniser l’horloge du serveur avec un serveur de temps qui fait référence. Là encore, rien de bien méchant.

Il faut d’abord installer les paquets qui permettront d’utiliser NTP :

# apt-get install ntp-simple ntpdate

Puis, on configure NTP :

# vi /etc/ntp.conf

Concernant les serveurs NTP, choisissez sans hésiter ceux du projet pool.ntp.org qui optimisent les requêtes NTP par l’utilisation de clusters répartis dans le monde entier. Une rapide visite de ce site vous indiquera les serveurs NTP à utiliser dans votre zone géographique. Si votre serveur est en France, on ajoute donc les lignes suivantes dans ntp.conf :

server 0.fr.pool.ntp.org
server 1.fr.pool.ntp.org
server 2.fr.pool.ntp.org

Avant de mettre en place le démon qui synchronisera l’heure automatiquement, il faut le faire manuellement (ici, avec le serveur principal de pool.ntp.org) :

# ntpdate pool.ntp.org

Maintenant que l’heure système est bonne, reste à mettre à jour celle de l’horloge BIOS :

# hwclock --systohc --utc

Pourquoi choisir l’heure UTC ? Pour éviter de perdre l’heure si les serveurs NTP ne sont pas accessibles au redémarrage de votre serveur.

Il reste à charger nos modifications et la synchronisation automatique est en place :

# /etc/init.d/ntp-server restart

On termine par le redémarrage du serveur qui est obligatoire pour éviter quelques mauvaises surprises (par exemple, les tâches cron qui se déclenchent à l’heure UTC ou les fonctions de temps de PHP qui perdent deux heures…). Si le redémarrage n’est pas possible, il faut relancer tous les services actifs.

Si vous souhaitez mettre à jour l’heure manuellement, le paquet ntp-server n’est pas utile. Gardez simplement le paquet ntpdate et utilisez directement la commande ntpdate. Vous pouvez aussi désactiver le chargement du démon NTP au démarrage :

# update-rc.d ntp remove

Et pour le remettre en place :

# update-rc.d ntp defaults

Régler l’heure d’un serveur virtuel (vserver)

« Et les serveurs virtuels dans tout ça ? Faut-il faire toutes ces opérations pour chacun des 100 vservers installés sur ma machine ? »

Non, heureusement ! Pour que le système de fichiers fonctionne correctement, tous les vservers utilisent la même référence de temps, celle du serveur principal. On ne peut donc pas modifier l’heure d’un vserver. Par contre, un vserver peut avoir sa propre configuration de fuseau horaire, très utile pour proposer des services à des utilisateurs de zones géographiques différentes.

Comme nous l’avons vu plus haut, la commande tzconfig permet de définir le fuseau horaire pour calculer le décalage horaire entre l’heure UTC du serveur principal et celle du vserver. On remarque au passage la nécessité d’utiliser l’heure UTC comme référence de temps sur un serveur.

Les puristes (ou plutôt les administrateurs qui ont la responsabilité d’exploiter des serveurs de production en toute sécurité) se pencheront sur les nombreuses options de configuration de NTP : installation d’un serveur NTP local, filtrage des adresses IP, portée des requêtes, périodicité de la synchronisation, etc. A chacun sa cuisine !

Avertissement !
Cet article est très ancien et son contenu peut s'avérer obsolète.

Commentaires

mica

Niquel et très clair merci 😀

11 janvier 2007, 10h03 · Répondre

sputnick

tres bien merkiii!
ça fait longtemps que j’aurais du tomber ici 😉

20 avril 2007, 22h58 · Répondre

germon

Et moi donc avec une sid et une testing sur le même hd mal installé au départ je passai mon temps dans le bios.
Un grand merci :-))

28 août 2007, 17h57 · Répondre

Kmleonix

Superbe, merci Mr Christophe
Je n’aurais enfin plus à regler l’heure de ma machine ^^

Je me permet juste une petite remarque. Aprés avoir installé et configuré le dameon ntp, pour mettre à l’heure la machine, il faut supprimer l’option -q de la commande ‘ntpdate -q pool.ntp.org’.
Cette option ‘query’ permet de voir le ntp fonctionner, mais ne modifie pas l’heure de la machine.

Un grand merci pour cette article clair :o)

12 septembre 2007, 1h18 · Répondre

Christophe

> Kmleonix : un grand merci pour cette « petite » remarque que je trouve essentielle. L’erreur est corrigée !

19 septembre 2007, 23h01 · Répondre

Tintwo

Moi qui cherchait un tutoriel pour ce « soucis », tombe pile poil dessus !

Très bien fait ! Merci.

25 octobre 2007, 0h16 · Répondre

Christophe

Je vous remercie pour ces… remerciements !

Cet article doit effectivement bien servir car il est le plus consulté de mon blog.

12 novembre 2007, 16h00 · Répondre

lidiriel

Nickel un article qui résume tout. 😉
je fait de ce pas faire un lien sur mon site.

2 avril 2008, 16h41 · Répondre

misterT

Super ! Non seulement ça mache et en plus c’est très bien expliqué : on comprend tout ce qu’on fait !
Et pour un débutant c’est pas si courant de tomber sur un article si bien et simplement écrit .

Merci

10 juillet 2008, 14h59 · Répondre

corriou

Exactement ce que je cherchais. Par contre, la commande pour modifier le fuseau horaire a été modifiée depuis. Maintenant, il faut faire :
dpkg-reconfigure tzdata

25 novembre 2010, 8h52 · Répondre

thomas

Hello,
je vois que cela fait longtemps que l’on a pas publié sur ton blog, c’est l’occasion ! 😉
je confirme d’ailleurs que c’est toujours d’actualité puisque je viens de suivre tes étapes pour synchro mes serveurs à Londres sur des ces serveurs de temps :
server 0.uk.pool.ntp.org
server 1.uk.pool.ntp.org
server 2.uk.pool.ntp.org
server 3.uk.pool.ntp.org

Tout semble bien se passer sauf que de temps à un autre je passe de 2s de décalage avec des sites comme celui là : http://www.horlogeparlante.com/heure-londres-royaume-uni-HEUREfrance2643743.html
à plus de 20s ce qui est énorme pour moi car j’ai des scripts qui sont quasi à la seconde près pour rechercher des data financières de puis Reuters.
Comment remédier à ces décalages imprévisibles ?

Merci les gars,

29 janvier 2013, 17h24 · Répondre

Ares_XL

Il semble que sur Débian la commande « tzconfig » soit dépréciée
et remplacée par :

« dpkg-reconfigure tzdata »

elle donne accès à une interface pseudo graphique qui pose les même question ! (secteur géographique mondial, suivie de la ville).

Test sur Rasbian V3.18.7 (12/02/2015)

4 avril 2015, 11h01 · Répondre

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *