Systemovy cas preskocil o hodinu

Karel Zak kzak na redhat.com
Středa Červenec 4 14:12:04 CEST 2012


On Tue, Jul 03, 2012 at 10:11:43AM +0200, Pavel Kankovsky wrote:
> On Sat, 9 Jun 2012, Petr Baláš wrote:
> 
> > Právě se mi taky posunul čas na Debianu. A může za to update balíčku nut.
> > [...]
> > /lib/udev/hwclock-set
> > a ten (pokud v /etc/default/rcS NENÍ UTC=yes) spoustí příkaz
> > /sbin/hwclock --systz --localtime --noadjfile
> > a ten posune hodiny o 2 hodiny do minulosti
> 
> Jedna opozděná poznámka: tenhle příkaz je fakt dost stupidní vynález.

Neni, mozna ne zcela idealne implementovany.

> Idea byla asi taková, že místo toho, aby se provedlo tradiční --hctosys,
> tak se systémové hodiny někdy při startu nastaví podle RTC s předpokladem,
> že RTC je v UTC, a později se spustí tento příkaz, který systémové hodiny
> "opraví" (bez nutnosti přístupu k /dev/rtc?).

Problem neni cteni, ale synchronizace userspace s tikanim systemovych
hodin a pak nasledne nastaveni (tedy to co dela --hctosys). Todle
celkem trva a rade lidem vadi pri bootu. Udelat to v kernelu je
lepsi.

> Obzvlášť kuriozní na tom je, že ten samý mechanismus (asi celkem 
> zapomenutý) je v jádře a tam ta pojistka proti vícenásobnému posunu 
> implementována je (i když je tam možná menší race condition) i 
> s poznámkou o tom, jaký zmatek by vyplýval z vícenásobného posunutí hodin.

Urcite ne zapomenuty...

> Ale hwclock je naprogramovaný tak, že sice nastaví v jádře časovou zónu 
> (a tím ten jaderný mechanismus jednorázově aktivuje), ale zároveň 
> posunutý čas nastaví sám, a tím tu pojistku obejde.

To volani settimeofday() s nastavenym 'tv' v hwclocku pro --systz je
pravdepodobne copy & past z funkce co nastavuje i cas.

Opravil jsem to (bude v util-linux v2.23), tech lidi s potrebou
nahodne volat hwclock je posledni dobou vice...

> Jiná věc je, že nesmírná stupidita je i to, když je RTC v nějaké lokální
> časové zóně, zejména takové, kde funguje letní čas (a to, co s hodinami
> dělá nejmenovaný uživatelsky přívětivý OS, je pak už na 8 gramů olova).

UTC/LOCAL je v /etc/adjtime, staci to nastavit. Pokud nekdo tento
soubor nepouziva a vola --utc/localtime na command line hwclocku tak
je to jeho problem.

    Karel

-- 
 Karel Zak  <kzak na redhat.com>
 http://karelzak.blogspot.com


Další informace o konferenci Linux