Čas je iluze. Čas oběda dvojnásob.
(Douglas Adams)
V této kapitole bude vysvětleno, jakým způsobem systém Linux udržuje správný čas a co jepotřeba dělat, abyste potížím s nesprávným systémovým časem předešli. Obvykle nebudete muset dělat se systémovým časem nic, ale je užitečné porozumět jeho principům.
Měření času je založeno na převážně pravidelných přírodních jevech jako je střídání světla a tmy, jehož příčinou je rotace planety. Celkový čas mezi dvěma po sobě následujícími periodami je stejný, ale délka denní a noční doby se mění. Jedinou konstantou je poledne.
Poledne je denní doba, ve které se Slunce nachází na své nejvyšší pozici. Vzhledem k tomu, že se Země otáčí, je poledne na různých místech zeměkoule v jinou dobu. Z toho vychází představa lokálního, místního času. Lidstvo měří čas v různých jednotkách, jejichž většina je rovněž svázána s přírodními jevy, jako je ona kulminace Slunce v poledne. Pokud se nacházíte na stejném místě, nezáleží na tom, že je lokální čas na jiných místech jiný.
Když ale potřebujete komunikovat se vzdálenějšími místy, uvědomíte si zároveň, že potřebujete jakýsi "společný" čas. V dnešní moderní době potřebuje hodně míst komunikovat s různými jinými místy na celé planetě. Proto byl zaveden společný standard měření času.
Tomuto "společnému" času se říká univerzální čas (angl. universal time, zkráceně UT nebo UTC), dříve označovaný jako greenwichský čas (angl. Greenwich Mean Time nebo GMT), protože je místním časem ve městě Greenwich v Anglii. Když spolu potřebují komunikovat lidé, kteří mají různý lokální čas, mohou používat společný univerzální čas. Nevzniká tak zmatek kolem toho, kdy se která věc stala nebo měla stát.
Místním časům se říká časové zóny. I když se z pohledu geografie zdá logické, aby byla místa, která mají poledne ve stejnou dobu, začleněna do stejného časového pásma, neumožňují to hlediska politická. Mnoho zemí z různých důvodů zavádí letní čas (angl. daylight savings time, zkráceně DST). Posouvají ručičky hodinek tak, aby měly více denního světla v době, kdy se pracuje, pak je v zimě zase přetáčí zpět. Jiné státy to tak pro změnu nedělají. No a ty, které tak činí, nejsou zajedno v tom, kdy má být čas posunutý a mění pravidla z roka na rok.
To je důvod proč nemohou být posuny časových pásem triviální. Časová pásma je nejlepší určovat podle polohy nebo podle rozdílu mezi místním a univerzálním časem. Ve Spojených státech a některých dalších zemích mají místní časové zóny své jméno a odpovídající třípísmennou zkratku. Ale tato zkratka není jedinečná a neměla by se používat bez současného označení země. Je lepší mluvit o lokálním čase například v Helsinkách, než o východoevropském čase (zkratka EET, East European Time), protože ne všechny státy východní Evropy leží ve stejném pásmu a nemusí mít stejná pravidla přechodu na letní čas.
Linux má balík programů pro práci s časovými pásmy. Tento software zná všechny existující časové zóny a navíc jej lze jednoduše přizpůsobit v případě, že se změní pravidla určování času. Takže jediné, co musí správce systému udělat, je vybrat správné časové pásmo. Také každý z uživatelů si může nastavit své vlastní časové pásmo - to je důležité proto, že mnoho z nich používá prostřednictvím sítě Internet počítače v různých zemích. Když se ve vašem místním časovém pásmu změní pravidla přechodu na letní čas, budete muset upgradovat jenom tomu odpovídající část subsystému pro určování času. Stačí pak nastavit časové pásmo systému a upravit datové soubory zvoleného pásma, není potřeba se trápit s nastavováním systémového času.
Osobní počítač má hardwarové systémové hodiny napájené z baterií. Díky těmto bateriím hodiny fungují, i když je zbytek počítače bez proudu. Hardwarové systémové hodiny lze seřizovat jako jednu z položek na obrazovce pro nastavení systému BIOS, nebo z běžícího operačního systému.
Jádro systému Linux udržuje vlastní čas nezávisle na hardwarových hodinách. Při zavádění operačního systému Linux nastaví své vlastní softwarové hodiny na stejný čas, jaký je v tom momentě na systémových hardwarových hodinách. Pak běží oboje hodiny nezávisle. Systém Linux udržuje vlastní čas pomocí softwarových hodin proto, že využívání systémových hardwarových hodin je dost pomalé a složité.
Hodiny jádra systému ukazují vždy univerzální čas. Proto jádro nemusí vůbec nic vědět o časových zónách - jednoduchost přispívá k vyšší spolehlivosti a ulehčuje možnost změny informací o vybraném časovém pásmu. Každý proces si převádí časová pásma sám (pomocí standardních nástrojů, jež jsou součástí balíku pro konverze časových zón).
Hardwarové systémové hodiny mohou být nastaveny na místní či univerzální čas. Je obvykle lepší mít nastavený univerzální čas, protože pak není potřeba měnit nastavení hardwarových systémových hodin na začátku a konci období letního času (UTC nemá DST). Bohužel některé operační systémy pro PC - včetně systémů MS-DOS, Windows, OS/2 - počítají s tím, že hardwarové hodiny ukazují lokální čas. Systém Linux si umí poradit s oběma způsoby nastavení, ale v případě, že hardwarové hodiny ukazují místní čas, bude potřeba měnit jeho nastavení při přechodu z a na letní čas (jinak by softwarové hodiny neukazovaly místní čas).
V systému Debian je systémové časové pásmo určeno symbolickým linkem /etc/localtime. Tento link odkazuje na datovš soubor pro dané časové pásmo, jež popisující místní časovou zónu. Jednotlivé datové soubory pro časová pásma jsou uloženy v adresáři /usr/lib/zoneinfo. Jiné distribuce Linuxu mohou parametry pro časová pásma nastavovat odlišně.
Uživatel může změnit své vlastní časové pásmo nastavením proměnné prostředí TZ. Není-li hodnota TZ nastavena, předpokládá se, že uživatel používá nastavení časového pásma systému. Syntaxe nastavení hodnoty proměnné TZ je popsána v manuálové stránce příkazu
tzset(3).
Příkaz date ukáže aktuální datum a čas.
Například:
$ date
Sun Jul 14 21:53:41 EET DST 1996
$
To znamená, že je neděle, 14. července 1996, asi za deset minut deset večer, to všechno v časovém pásmu označeném "EET DST", což by mohlo v angličtině znamenat "East European Daylight Savings Time", tedy východoevropský letní čas. Příkazem date můžeme rovněž zjistit univerzální čas:
$ date .u
Sun Jul 14 18:53:42 UTC 1996
$
Příkazem date se také nastavují softwarové hodiny jádra systému:
# date 07142157
Sun Jul 14 21:57:00 EET DST 1996
# date
Sun Jul 14 21:57:02 EET DST 1996
#
Více podrobností hledejte v manuálové stránce příkazu date - syntaxe příkazu je tak trochu "tajemná". Čas může nastavovat pouze superuživatel. I když může mít každý z uživatelů nastaveno své vlastní časové pásmo, systémový čas je pro všechny stejný.
Příkaz date ukazuje nebo nastavuje jenom softwarové hodiny. Příkaz clock synchronizuje systémové hardwarové a softwarové hodiny. Spouští se při zavádění systému, kdy se zjišťuje nastavení hardwarových systémových hodin. Podle nich se pak nastavují hodiny softwarové. Potřebujete-li nastavit oboje, nastavte nejprve softwarové hodiny příkazem date, následně hardwarové příkazem clock -w.
Parametrem -u sdělíte programu clock, že hardwarové hodiny ukazují univerzální čas. Přepínač -u je potřeba používat správně. V opačném případě bude mít váš systém mírný zmatek v tom, jaký je vlastně přesný čas.
Nastavení hodin se musí dělat opatrně. Mnoho částí operačního systému Unix spoléhá na to, že hodiny fungují správně. Například démon cron spouští pravidelně různé příkazy. Změníte-li nastavení hodin, může se stát, že nebude vědět, zda je potřeba některý z programů spustit, či nikoliv. Když na některém starším unixovém systému někdo nastavil hodiny o dvacet let dopředu, démon cron se snažil spustit všechny periodicky vykonávané příkazy za celých dvacet let naráz. Aktuální verze programu cron si s tímto problémem umí poradit. Přesto byste měli být při změnách času opatrní. Velké časové "skoky" dopředu nebo posuny vzad jsou nebezpečnější, než menší změny a posuny dopředu.
Softwarové hodiny systému Linux nejdou vždy přesně. V chodu je udržují pravidelná přerušení časovače generované hardwarem PC. Běží-li v systému příliš mnoho procesů, může trvat obsluha přerušení časovače příliš dlouho a softwarové hodiny se začnou zpožďovat. Hardwarové systémové hodiny běží nezávisle na operačním systému a jsou obvykle přesnější. Jestli často vypínáte a zapínáte počítač (to je případ většiny systémů, které neslouží jako servery), budete mít obvykle i přesnější systémový čas.
Potřebujete-li upravit nastavení hardwarových hodin, je obyčejně nejjednodušší restartovat systém, spustit obrazovku pro nastavení systému BIOS a udělat to tam. Tak lze předejít všem potížím, které by mohly být zapříčiněny změnou systémového času za běhu systému. Nemáte-li možnost upravit čas v nastaveních systému BIOS, nastavte jej příkazy date a clock (v tomto pořadí), ale připravte se na to, že se možná některé části systému budou chovat podivně, takže budete muset systém opět restartovat.
Počítač připojený k síti (i když jenom pomocí modemu) může automaticky kontrolovat správnost nastavení vlastních hodin tak, že je bude srovnávat s nastavením hodin nějakého jiného počítače. Jestli se o tomto jiném počítači ví, že jeho hodiny jdou velmi přesně, budou pak mít po připojení přesný čas nastavené oba systémy. Systémové časy dvou systémů lze seřídit příkazy rdate a netdate. Oba uvedené programy kontrolují čas na vzdáleném počítači (příkaz netdate i na několika vzdálených stanicích) a podle toho nastaví místní čas lokálního počítače. Počítač, na kterém se bude pravidelně spouštět některý z těchto příkazů, bude mít tak přesný čas, jak přesné budou hodiny vzdáleného počítače.