Platon Technologies
neprihlásený Prihlásiť Registrácia
SlovakEnglish
open source software development oslavujeme 10 rokov vývoja otvoreného softvéru! Sobota, 21. apríl 2018
O nás
Magazín
Otvorený softvér
CVS
Služby
Index  »  Administrácia  »  Synchronizácia času, časť 1: hardvérové a systémové hodiny

Synchronizácia času, časť 1: hardvérové a systémové hodiny

Autor: Ondrej Jombík | Sekcia: Administrácia | Dátum: 2002-02-19

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. Predstavíme si hardvérové a systémové, rozdiely medzi nimi a spôsoby ich nastavovania a synchronizovania.

Hardvérové a systémové hodiny

Linuxový systém obsahuje dvoje 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 vybí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 hodín, 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í používatelia, môžu vyššieuvedený príkaz vykonať aj iní používatelia ako je root. Ďalšou metódou je priamy 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 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ých. 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ôžeme presvedčiť príkazom

/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/drivers/char/rtc.c a iné
web: http://www.google.com/

Článok bol pôvodne vydaný na serveri Root.cz a v redakčnom systéme Platon.SK je publikovaný so súhlasom autora aj prevádzkovateľa servera.

Čo je Platón?
Platón bol veľmi doležitý filozof starovekého Grécka, študent Sokratesa a učiteľ Aristotela. viac info...

Platon Group zastrešuje slovenskú skupinu vývojárov otvoreného softvéru. Vyvíja, spravuje, dokumentuje niekoľko úspešných open-source projektov.

Platon Technologies, s.r.o. je mladá a dynamicky rozvíjajúca sa spoločnosť, ktorá má za cieľ prinášať otvorené technológie do komerčnej a verejnej sféry.

Podporte nás

Výkonný webhosting
a multihosting

Platon Webhosting

Super rýchle servery
a profesionálna administrácia

Virtuálne, dedikované a manažované servery

Vývoj
Diskusia k článku

   

 
Copyright © 2002-2006 Platon Group
Stránka používa redakčný systém Metafox
Na začiatok · Odkazový formulár · Prihláška
Upozorniť na chybu na PLATON.SK webstránke · Podmienky použitia · Ochrana osobných údajov