OVH Cloud OVH Cloud

Probleme d'horloge

22 réponses
Avatar
RedPower
Bonjour à tous !
A chaque fois que je démarre Linux Redhat 9, l'heure de l'horloge
s'incrémente de 1... Qu'est-ce qui se passe ? Quel est le programme
responsable de ça ??? Comment faire pour régler ce problème ?
Merci de votre aide !
Guilhem.

10 réponses

1 2 3
Avatar
RedPower
1ère chose à vérifier.
Si vous faites la commande
TZ="Europe/Paris" date
[ guilhem]$ TZ="Europe/Paris" date

mar déc 30 09:49:26 CET 2003
Est-ce que cela vous affiche la bonne heure?
oui.

Dans l'affirmative, qu'affiche echo $TZ ?
Rien. Une ligne vide s'affiche:

[ guilhem]$ echo $TZ

[ guilhem]$
Et quel est le résultat de la
commande date sans prépositionnement du TZ.
[ guilhem]$ date

mar déc 30 09:50:01 CET 2003
Ce n'est pas l'heure qui
m'intéresse mais le mot affiché juste avant l'année en fin de ligne.
Normalement, ça devrait être "CET".
C'est bon.

Au démarrage, l'heure est positionnée par un script qui utilise pour cela
le programme hwclock.
Il faudrait d'abord repérer ce script (il se trouve dans
/etc/rc.d/init.d ou /etc/init.d selon la distribution).
Pour cela:
grep hwclock /etc/rc.d/init.d/*
[ guilhem]$ grep hwclock /etc/rc.d/init.d/*

/etc/rc.d/init.d/halt:runcmd $"Syncing hardware clock to system time"
/sbin/hwclock $CLOCKFLAGS
Voir ensuite avec quels paramètres il est lancé. Au démarrage et à
l'arrêt.
que dois-je faire à ce niveau ?

En principe, au démarrage ça devrait être
hwclock --hctosys --localtime
Et à l'arrêt
hwclock --systohc --localtime
Il faut regarder si le script positionne la variable TZ.
Le fait que l'heure s'incrémente à chaque fois que vous démarrez Linux
semble indiquer qu'en dépit de vos réglages le script s'entête à régler
l'horloge en UTC.
Au fait, l'incrémentation ne se fait-elle que si vous démarrez Windows
entre 2 sessions Linux? Ou se fait-elle à chaque démarrage que Windows
ait été lancé ou non entre deux?
Windows n'intervient pas. Si je lance 5 fois de suite Linux, l'heure

s'incrémentera de +1 à chaque fois (soit +5).

Avatar
RedPower
En faisant: vi /etc/sysconfig/clock
ZONE="Europe/Paris"
UTC=true
ARCúlse

En faisant vi /etc/rc.d/init.d/halt, je trouve ca:

# Sync the system clock.
ARC=0
SRM=0
UTC=0

if [ -f /etc/sysconfig/clock ]; then
. /etc/sysconfig/clock

# convert old style clock config to new values
if [ "${CLOCKMODE}" = "GMT" ]; then
UTC=true
elif [ "${CLOCKMODE}" = "ARC" ]; then
ARC=true
fi
fi

CLOCKDEF=""
CLOCKFLAGS="$CLOCKFLAGS --systohc"

case "$UTC" in
yes|true)
CLOCKFLAGS="$CLOCKFLAGS -u";
CLOCKDEF="$CLOCKDEF (utc)";
;;
no|false)
CLOCKFLAGS="$CLOCKFLAGS --localtime";
CLOCKDEF="$CLOCKDEF (localtime)";
;;
esac

case "$ARC" in
yes|true)
CLOCKFLAGS="$CLOCKFLAGS -A";
CLOCKDEF="$CLOCKDEF (arc)";
;;
esac
case "$SRM" in
yes|true)
CLOCKFLAGS="$CLOCKFLAGS -S";
CLOCKDEF="$CLOCKDEF (srm)";
;;
esac

runcmd $"Syncing hardware clock to system time" /sbin/hwclock $CLOCKFLAGS

Mais est-ce bon ???????
Avatar
Cem
En faisant: vi /etc/sysconfig/clock
ZONE="Europe/Paris"
UTC=true
ARCúlse

En faisant vi /etc/rc.d/init.d/halt, je trouve ca:

# Sync the system clock.
ARC=0
SRM=0
UTC=0

[...]

Mais est-ce bon ???????


OK c'est bon pour le halt.
Par contre c'est mauvais pour le /etc/sysconfig/clock
Il faut mettre "UTCúlse".
Ceci dit, je suis un peu étonné de ne voir d'utilisation de hwclock
qu'au niveau du halt. Il devrait aussi y avoir un script qui l'utilise
pour le démarrage. Il utilise probablement le contenu de
/etc/sysconfig/clock
Essayez déjà de mettre "UTCúlse" dans /etc/sysconfig/clock et voyez ce
que ça donne.

Avatar
RedPower

En faisant: vi /etc/sysconfig/clock
ZONE="Europe/Paris"
UTC=true
ARCúlse

En faisant vi /etc/rc.d/init.d/halt, je trouve ca:

# Sync the system clock.
ARC=0
SRM=0
UTC=0

[...]

Mais est-ce bon ???????



OK c'est bon pour le halt.
Par contre c'est mauvais pour le /etc/sysconfig/clock
Il faut mettre "UTCúlse".
Ceci dit, je suis un peu étonné de ne voir d'utilisation de hwclock
qu'au niveau du halt. Il devrait aussi y avoir un script qui l'utilise
pour le démarrage. Il utilise probablement le contenu de
/etc/sysconfig/clock
Essayez déjà de mettre "UTCúlse" dans /etc/sysconfig/clock et voyez ce
que ça donne.
Ca donne rien. Si je met UTCúlse, l'heure s'incrémente. Si UTC=true

alors l'heure ne s'incrémente pas et l'heure sous wXP=heure sous Linux -1.
Quand UTC=true, date=clock=la bonne heure (heure de ma montre).


Avatar
Cem
Ca donne rien. Si je met UTCúlse, l'heure s'incrémente. Si UTC=true
alors l'heure ne s'incrémente pas et l'heure sous wXP=heure sous Linux -1.
Quand UTC=true, date=clock=la bonne heure (heure de ma montre).
Plutôt difficile à comprendre...

Que donne une recherche de /etc/sysconfig/clock dans /etc/rc.d/init.d ?
grep /etc/sysconfig/clock /etc/rc.d/init.d/*
et au cas où ça ne donnerait rien
grep -r /etc/sysconfig/clock /etc/rc.d/*

Avatar
RedPower
[ guilhem]$ grep /etc/sysconfig/clock /etc/rc.d/init.d/*
/etc/rc.d/init.d/apmd:# clock: /etc/sysconfig/clock
/etc/rc.d/init.d/halt:if [ -f /etc/sysconfig/clock ]; then
/etc/rc.d/init.d/halt: . /etc/sysconfig/clock

[ guilhem]$ grep -r /etc/sysconfig/clock /etc/rc.d/*
/etc/rc.d/init.d/halt:if [ -f /etc/sysconfig/clock ]; then
/etc/rc.d/init.d/halt: . /etc/sysconfig/clock
/etc/rc.d/init.d/apmd:# clock: /etc/sysconfig/clock
/etc/rc.d/rc0.d/S01halt:if [ -f /etc/sysconfig/clock ]; then
/etc/rc.d/rc0.d/S01halt: . /etc/sysconfig/clock
/etc/rc.d/rc0.d/K74apmd:# clock: /etc/sysconfig/clock
/etc/rc.d/rc1.d/K74apmd:# clock: /etc/sysconfig/clock
/etc/rc.d/rc2.d/S26apmd:# clock: /etc/sysconfig/clock
/etc/rc.d/rc3.d/S26apmd:# clock: /etc/sysconfig/clock
/etc/rc.d/rc4.d/S26apmd:# clock: /etc/sysconfig/clock
/etc/rc.d/rc5.d/K74apmd:# clock: /etc/sysconfig/clock
/etc/rc.d/rc6.d/S01reboot:if [ -f /etc/sysconfig/clock ]; then
/etc/rc.d/rc6.d/S01reboot: . /etc/sysconfig/clock
/etc/rc.d/rc6.d/K74apmd:# clock: /etc/sysconfig/clock
/etc/rc.d/rc.sysinit:if [ -f /etc/sysconfig/clock ]; then
/etc/rc.d/rc.sysinit: . /etc/sysconfig/clock

Je pense que l'incrémentation se fait au démarrage de Linux car si elle
se faisait à l'extinction, wXP serait également incrémenté. Or il ne
l'est pas (dans le cas: extinction Linux puis démarrage de Windows).

Comparaison de /etc/rc.d/init.d/halt et /etc/rc.d/rc.sysinit.d. Seules
les dernières lignes du bloc relatif à l'horloge sont différentes:

vi /etc/rc.d/init.d/halt
.
.
.
runcmd $"Syncing hardware clock to system time" /sbin/hwclock $CLOCKFLAGS

vi /etc/rc.d/rc.sysinit.d
.
.
.
/sbin/hwclock $CLOCKFLAGS
action $"Setting clock $CLOCKDEF: `date`" date

ps: echo $CLOCKDEF ne renvoie rien (ni $CLOCKFLAGS)
Avatar
Cem
[...]

Je pense que l'incrémentation se fait au démarrage de Linux car si elle
se faisait à l'extinction, wXP serait également incrémenté. Or il ne
l'est pas (dans le cas: extinction Linux puis démarrage de Windows).

[...]


Franchement je nage.
Je ne vois rien d'anormal dans les scripts.
L'horloge système est positionnée au démarrage par le script
/etc/rc.d/rc.sysinit.
L'horloge BIOS est alignée sur l'horloge système à l'arrêt par le script
/etc/rc.d/init.d/halt (ou /etc/rc.d/init.d/reboot en cas de demande de
reboot).
La similitude des scripts est rassurante.
Quand vous mettez "UTC=true", vous constatez que Win XP a son horloge
décalée d'une heure. C'est normal. Windows ne fonctionne pas en UTC. Si
on fait fonctionner Linux en UTC, l'horloge BIOS est alignée sur une
heure GMT et donc Windows va indiquer une heure de moins (et deux en
été) que l'heure officielle locale.
Je maintiens donc qu'il faut mettre "UTCúlse".
Est-ce que /usr ou /usr/share est sur une partition différente de / ?
Ça pourrait être la raison du problème.
Il se peut en effet qu'au démarrage, lorsque le script met l'heure
système, /usr ne soit pas monté. Dans ce cas, si /etc/localtime est un
lien, il pointe sur un fichier inaccessible. Et par défaut, dans ce cas,
hwclock doit se conduire comme si le "TimeZone" était GMT. Et donc
l'heure s'incrémente de 1 (seulement si UTC=true).
Je suggère donc de faire
cp --remove-destination /usr/share/zoneinfo/Europe/Paris /etc/localtime
de remettre "UTCúlse" dans /etc/sysconfig/clock
et de réessayer !

ps: echo $CLOCKDEF ne renvoie rien (ni $CLOCKFLAGS)


Il faut mettre cet "echo" dans le script pour voir quelque chose. Est-ce
que c'est ce que vous avez fait?
Le mieux pour tracer qch c'est de faire
echo "CLOCKFLAGS=$CLOCKFLAGS" >>/tmp/init.log
Le fichier /tmp/init.log contient alors tout ce qu'on voulait observer.
ou bien d'utiliser l'instruction "logger" pour mettre les traces dans
les fichiers /var/log/*.log.

Avatar
RedPower
Je viens d'effectuer une trace sur le fichier /etc/rc.d/rc.sysinit.
L'incrémentation se fait à cet endroit précis:

# Mount all other filesystems (except for NFS and /proc, which is already
# mounted). Contrary to standard usage,
# filesystems are NOT unmounted in single user mode.
action $"Mounting local filesystems: " mount -a -t nonfs,smbfs,ncpfs -O
no_netdev

Mais pourquoi donc ?? Avez-vous une idée ??
Pour répondre à votre question, j'ai effectivement 3 partitions: / ,
/usr et /home.
Je viens de réinstaller la partition / et à présent l'heure ne
s'incrémente plus. Le problème est donc réglé. Ouf...

Guilhem.
Ps: Merci pour votre aide.
Avatar
Cem
Je viens d'effectuer une trace sur le fichier /etc/rc.d/rc.sysinit.
L'incrémentation se fait à cet endroit précis:

# Mount all other filesystems (except for NFS and /proc, which is already
# mounted). Contrary to standard usage,
# filesystems are NOT unmounted in single user mode.
action $"Mounting local filesystems: " mount -a -t nonfs,smbfs,ncpfs -O
no_netdev

Mais pourquoi donc ?? Avez-vous une idée ??
Pour répondre à votre question, j'ai effectivement 3 partitions: / ,
/usr et /home.
Je viens de réinstaller la partition / et à présent l'heure ne
s'incrémente plus. Le problème est donc réglé. Ouf...


Je crois que j'ai compris ce qui s'était passé. Je vais essayer de
l'expliquer.

Il faut savoir que pour Linux, il existe 3 heures différentes. L'heure
donnée par le BIOS, l'heure système et l'heure retournée par les
fonctions de la librairie Glibc (qui est l'heure locale, celle
qu'utilisent tous les programmes, celle qu'affiche par exemple le
programme 'date').
Lorsque le système Linux démarre, il va chercher l'heure du BIOS et
charge l'horloge système avec l'heure *GMT*. Les fonctions de la
librairie Glibc récupèrent l'heure système (GMT), regardent dans quelle
"zoneinfo" le système est situé et restituent l'heure locale (GMT+1 en
hiver en France, GMT+2 en été). La librairie Glibc utilise le fichier
/etc/localtime pour connaître la "zoneinfo".
L'heure BIOS stockée est soit une heure UTC (=GMT), soit une heure
locale. Quand on utilise Linux seul il est recommandé de stocker l'heure
BIOS en UTC. Quand on utilise Linux et Windows sur la même machine, on
est obligé de stocker une heure locale dans l'heure BIOS parce que c'est
comme cela que Windows travaille.
Au démarrage le script rc.sysinit utilise le programme hwclock pour
récupérer l'heure BIOS et charger l'heure système. En mettant
"UTCúlse" dans /etc/sysconfig/clock, le paramètre --localtime est
passé à hwclock. Il va donc lire l'heure BIOS, considérer que c'est une
heure locale, regarder en quelle "zoneinfo" le système se trouve (grâce
au fichier /etc/localtime), transformer cette heure locale en heure GMT
et la stocker dans l'heure système.
Je pense que sur votre système, le fichier /etc/localtime était un lien
symbolique vers le fichier /usr/share/zoneinfo/Europe/Paris. Et le
problème, c'est que le script rc.sysinit positionne l'heure système
AVANT d'avoir monté les partitions (autres que /). Et donc au moment où
le programme hwclock fait son travail, il est dans l'incapacité de lire
le fichier /usr/share/zoneinfo/Europe/Paris. Il considère alors que le
système se trouve en zoneinfo GMT et se contente de charger l'heure BIOS
dans l'heure système. Se faisant, il met une heure de trop (ça serait 2
heures si on était en été) dans l'horloge système.
Si vous insérez des trace dans le script pour connaître l'heure système,
tant que la partition /usr n'est pas montée, le fichier /etc/localtime
ne pointe sur rien de lisible. Le programme 'date' retourne donc l'heure
système sans correction et vous avez l'impression que tout est bon.
Quand /usr est montée, /etc/localtime peut être lu. Les fonctions de la
librairie Glibc ajoutent 1 heure à l'horloge système et vous constatez
donc que votre heure locale a été avancée d'une heure. C'est pour cela
que vous avez l'impression un peu trompeuse que c'est l'instruction
mount qui incrémente l'heure. En fait c'est le hwclock qui a mis 1 heure
de trop dans l'horloge système parce que /usr n'était pas monté quand il
a été exécuté.

J'espère que cette laborieuse explication est compréhensible.

Je ne saisis pas bien ce que vous avez fait sur / pour que désormais
tout aille bien. Avez-vous fusionné / et /usr sur la même partition?
Est-ce que votre "réinstallation "a provoqué la suppression du fichier
/etc/localtime? Si c'est le 2ème cas de figure, vous avez l'impression
que votre système marche bien mais ce n'est pas tout à fait vrai. Sans
fichier /etc/locatime, le système croit qu'il est en zoneinfo GMT.
L'heure BIOS = l'heure système = l'heure Glibc. 'date' affiche
d'ailleurs GMT comme zoneinfo (alors qu'il devrait afficher CET) et ça
peut perturber le fonctionnement de certains programmes (par exemple vos
mails risquent d'avoir une heure incorrecte).
La bonne solution quand on a des partitions / et /usr séparées, c'est de
COPIER le fichier /usr/share/zoneinfo/Europe/Paris vers /etc/localtime
au lieu de faire de /etc/localtime un lien symbolique. Ainsi que /usr
soit monté ou pas, le système saura toujours dans quelle zoneinfo il est
situé.

Avatar
hugolino
Le Thu, 01 Jan 2004 08:46:36 +0100, RedPower a écrit:
Mais pourquoi donc ?? Avez-vous une idée ??
Pour répondre à votre question, j'ai effectivement 3 partitions: / ,
/usr et /home.


Je ne vois pas bien l'intérêt d'avoir "/usr" sur une partition
différente de celle de "/". A mon avis (que je partage avec moi-même)
"/usr" est une partition "système" dans le sens où elle ne contient que
ce que tu as choisi d'installer avec les CD de ta distro. Si elle
crashe, tu réinstalles vite fait bien fait sans problèmes.

Par contre, tu peux mettre "/usr/local" sur une autre partition, pour
tes soft amoureusement compilés à la maison.

x-post et fu2: fcold

(merci à Cem pour ces explications, je stocke ça au chaud)

--
Hugo

1 2 3