Hlavní navigace

Synchronizácia času - hardvérové a systémové hodiny

19. 2. 2002
Doba čtení: 7 minut

Sdílet

V prvej časti trojdielneho seriálu o synchronizácii času sa okrem teórie a objasňovania pojmov budeme zaoberať aj synchronizovaním času na počítači nepripojenom k sieti Internet.

Hardvérové a systémové hodiny

Linuxový systém obsahuje dvojo hlavných hodín, alebo inak povedané zdrojov presného času. Sú to hardvérové hodiny (hardware clock) a systémové hodiny (system clock).

Hardvérové hodiny sú taktiež známe pod pomenovaním CMOS clock, alebo BIOS clock. Fungujú nezávisle od akéhokoľvek programu alebo operačného systému. Sú súčasťou ISA špecifikácie a nachádzajú sa v pamäti CMOS (Complementary Metal-Oxide Semiconductor), ktorá je poháňaná osobitným energetickým zdrojom – batériou. Vďaka tomu je možný ich chod nielen keď je počítač zapnutý (vtedy sa pamäť CMOS dobíja), ale i keď je počítač vypnutý (pamäť CMOS sa nabíja).

Aplikačný program môže čítať alebo zapisovať do tejto pamäte časové údaje s precíznosťou jednej sekundy. Taktiež môže túto pamäť používať ako zdroj jednosekundových impulzov. Zápis resp. čítanie prebieha pomocou špecializovaného zariadenia /dev/rtc ovládaného modulom jadra rtc.o alebo priamym prístupom do pamäti CMOS.

Systémové hodiny sú súčasťou linuxového jadra a riadené sú špeciálnym prerušením procesora. Toto prerušenie procesora je taktiež súčasťou ISA špecifikácie. Uvažovať nad týmito hodinami má však zmysel iba ak systém Linux beží. Vtedy sú v chode aj systémové hodiny. Inak nie. Ich reprezentáciou je známy UNIX time, počet sekúnd od prvého januára 1970.

Systémové hodiny sú tie, na ktorých pri chode systému záleží. Výstup programu date je práve tento systémový čas. Príkazom date ‚+%s‘ získame inkriminovaný počet sekúnd od roku 1970.

Časové zóny

Aby sa situácia ešte viac skomplikovala, sú tu časové zóny. Linuxové jadro si uchováva svoju osobitnú informáciu o časovej zóne, ale taktiež existuje aj premenná prostredia TZ, ktorá obsahuje ďalšiu informáciu o časovej zóne. Každá má svoj význam. Prvá slúži viacmenej pre internú potrebu v jadre a využíva ju napr. ovládač FAT particií. Druhá má svoj význam hlavne na aplikačnej úrovni, kde pomocou nej môžu rôzne programy zobrazovať ten správny čas. Viac informácií na manuálových stránkach tzset, tzselect a pod.

Manipulácia s časom

Tak úvodnú teóriu by sme mali úspešne za sebou a poďme skúmať načo je to všetko dobré. Oboje hodiny, hardvérové aj systémové, majú svoje prirodzené časové odchýlky. V praxi to znamená, že keď ráno nastavíte presný čas na svojich hardvérových hodinách (napr. setupom v BIOSe), večer už tak presný nebude. Prejaví sa na ňom časová odchýlka. To isté platí aj pre hodiny systémové.

Naštastie táto odchýlka je u oboch typov hodín stabilná. Ak sa vám za deň omeškajú hardvérové hodiny o 5 minút za 10 dní to bude istotne 50 minút. Systémové hodiny majú tiež svoje odchýlky, avšak tie spravidla nebývajú také vysoké ako u hodín hardvérových. Na manipuláciu s týmito hodinami slúžia programy hwclock a adjtimex. hwclock pre hardvérové a adjtimex pre systémové.

Pomocou týchto programov je možné tieto hodiny nielen nastavovať, ale aj vyrovnávať ich odchýlky. Zmysel to má však iba vtedy, ak máme počítač bez možnosti prístupu do siete Internet. V tom prípade je totiž lepšie použiť niektorý z dostupných programov na sychronizáciu času pomocou NTP protokolu. NTP protokol a algoritmus bude opísaný v ďalšej časti seriálu.

Hardvérové hodiny

Aktuálny čas hardvérových hodín zistíme príkazom:

/sbin/hwclock --show

Ako som už spomínal v úvode, komunikácia s hardvérovými hodinami je zabezpečovaná rôznymi metódami. Prvou metódou, ktorú sa snaží hwclock použiť je, manipulácia so zariadením /dev/rtc a k nemu prislúchajúcim ovládačom rtc.o. Vzhľadom nato, že k tomuto zariadeniu majú prístup aj neprivilegovaní užívatelia, môžu vyššieuvedený príkaz vykonať aj iní užívatelia ako je root. Ďalšou metódou je priamym prístup do pamäti CMOS, ktorý je už však povolený iba root-ovi. Tento mód sa dá vynútiť pomocou prepínača –directisa. Na iných architektúrach je možné využiť aj iné metódy prístupu v závislosti od konkrétneho hardvéru. Bližšie informácie o prístupe k hardvérovým hodinám na iných architektúrach ako x86 sú opísané na manuálovej stránke programu hwclock.

Čas hardvérových hodín sa nastavuje príkazom:

/sbin/hwclock --set --date=dátum

Paramter dátum obsahuje čas, ktorý chceme nastaviť v tvare „MM/DD/YYYY hh:mm:ss“.

Na sychronizáciu hardvérových hodín v závislosti od systémových hodín slúži parameter –systohc (v preklade: system time to hardware clock). /sbin/hwclock –systohc teda nastaví čas v hardvérových hodinách na rovnakú hodnotu ako je aktuálny systémový čas. Opačne, na synchronizáciu systémových hodín v závislosti od hardvérových, sa používa parameter –hctosys (hardware clock to system time).

Systémové hodiny vždy reprezentujú lokálny čas, ale hardvérové môžu byť nastavené aj na uschovávanie univerzálneho času (Coordinated Universal Time). Je to čisto vaša osobná voľba, ktorú možnosť si vyberiete, ale akokoľvek sa rozhodnete, program hwclock túto informáciu nemá ako zistiť. Preto je možné dať mu vedieť parametrami –utc a –localtime, či sú vaše hardvérové hodiny nastavené na univerzálny čas alebo na lokálny. Pokiaľ žiadny z týchto parametrov nebude zadaný, použije sa ten, ktorý bol zadaný naposledy. Informácie o tom sú uložené v súbore /etc/adjtime. Ak tento súbor neexistuje, použitá bude voľba lokálny čas.

Azda najzaujímavejšou možnosťou, ktorú nám hwclock ponúka je vyrovnávanie časových odchýliek hardvérových hodín. Vďaka tomu, že odchýlka hardvérových hodín je pravidelná, je možné zaznamenať aj jej veľkosť. K tomuto účelu slúži súbor /etc/adjtime. Jeho štruktúra je jednoduchá. Na prvom riadku sú v tomto poradí informácie o časovej odchýlke, dátume posledného vyrovnávania času v tvare počtu sekúnd od roku 1970 a na poslednom mieste nula. Na druhom riadku sa nachádza opäť dátum posledného vyrovnávania času v tvare počtu sekúnd od roku 1970, ale ak je známe, že táto posledná kalibrácia neobsahovala správny čas (napr. hardvérové hodiny neboli dovtedy nastavené, alebo boli nastavené zle), nachádza sa tam hodnota 0. Tretí riadok obsahuje jeden z reťazcov LOCAL alebo UTC v závislosti od toho, či ide o lokálny alebo univerzálny čas.

Samotné vyrovnávanie času (kalibrácia) prebieha jednoducho. Predstavme si, že na začiatku nemáme žiadny súbor /etc/adjtime. Pri prvom volaní /sbin/hwclock –set sa vytvorí tento súbor s požadovanými informáciami. Informácia o časovej odchýlke (prvý riadok, prvé číslo) bude v tomto prípade veľmi blízko nuly. Po nejakom čase, napríklad o 10 dní neskôr, zistíte, že vaše hardvérové hodiny meškajú o 50 minút oproti reálnemu času. Zavoláte opäť /sbin/hwclock –set s príslušným časom a hwclock modifikuje záznam poslednej kalibrácie v súbore /etc/adjtime. Taktiež zaznamená časovú odchýlku 5 minút za deň.

Keďže už máme zistenú veľkosť pravidelnej odchýlky, môžeme používať príkaz

/sbin/hwclock --adjust

Ak bude zavolaný po ďalších desiatich dňoch, hwclock na základe pravidelnej odchýlky odoberie za každý deň 5 minút, čiže 50 minút dokopy. Taktiež modifikuje záznam poslednej kalibrácie v súbore /etc/adjtime. Treba mať na pamäti, že pri každom volaní hwclock s parametrami –set alebo –systohc bude veľkosť pravidelnej odchýlky opať znovu vyhodnotená.

Hlavnou výhodou hardvérových hodín je to, že bežia aj keď je počítač vypnutý. Mnoho ľudí, hlavne tí, ktorí zvyknú vypínať na noc svoje počítače, synchronizuje svoje systémové hodiny pomocou hodín hardvérovým. Systémové hodiny je nutné synchronizovať, pretože ako som už písal vyššie, sú to tie na ktorých v systéme záleží. Vtedy si treba nastaviť odchýlku podľa vyššieuvedeného postupu a je dôležité zavolať /sbin/hwclock adjust PRED /sbin/hwclock hctosys. To aby sme ako systémový čas nastavovali už korektne upravený čas hardvérových hodín. Ideálne je toto vykonať pri štarte systému (zápisom do štartovacieho skriptu /etc/rc.d/rc.local alebo obdobného) a potom spúštať v pravidelných intervaloch pomocou démonu crond.

Systémové hodiny

Na modifikáciu systémových hodín slúži príkaz adjtimex. U tých sa dá taktiež nájsť pravidelná odchýlka. Hľadať pravidelnú odchýlku v systémových hodinách je však v zásade kontraproduktívne, pretože po vypnutí počítača a jeho najbližšom zapnutí nebudeme vedieť nastaviť správny čas. Systém Linux, ktorý sa stará o chod systémových hodín, pokiaľ viem, na vypnutom počítači nebeží. :-)

Ak nemáme prístup do siete Internet, je ideálne na vyrovnávanie časových odchýliek používať už spomenuté hardvérové hodiny. Obsluha je jednoduchšia ako pri vyrovnávaní odchýliek systémových hodín a po vypnutí počítača budeme vedieť nastaviť správny čas.

V prípade, že prístup do siete Internet máme, zabezpečíme synchronizáciu systémových hodín oproti vonkajším zdrojom voľným NTP serverom, obsahujúcim presný čas. U hardvérových hodín budeme len skúmať odchýlku, aby sme po reštarte (resp. vypnutí a zapnutí) počítača mali ihneď presný čas. O tom ako na to, navyše pomocou jediného programu chrony si povieme v tretej časti seriálu.

11 minútový mód

Na záver, aby som neostal nič dlžný, spomeniem ešte fakt, že linuxové jadro môže bežať v tzv. 11 minútovom móde. Je to mód keď sú každých 11 minút hardvérové hodiny synchronizované podľa hodín systémových. O tom, či jadro beží v tomto móde sa môžme presvedčiť príkazom

root_podpora

/usr/sbin/adjtimex --print

Ak hodnota položky status má bit 7 nastavený, tzn. obsahuje napr. hodnotu 64, je 11 minútový mód vypnutý. Ak je tento bit nenastavený, 11 minútový mód je zapnutý. Pre nás je dôležité, aby bol vypnutý. Pravidelnou synchronizáciou v tomto 11 minútovom móde sa totiž pripravíme o možnosť skúmať pravidelnú odchýlku hardvérových hodín a využitia tejto vlastnosti pri vypnutí počítača.

Zdroje

manuálové stránky: date(1), tzset(3), tzselect(3), hwclock(8), adjtimex(8)
zdrojové kódy linuxového jadra 2.4.17: /usr/src/linux/dri­vers/char/rtc­.c a iné
web: http://www.go­ogle.com/

Byl pro vás článek přínosný?

Autor článku