Na internetu lze najít spoustu nářků nad tím, že se po instalaci systému uživateli zobrazují špatné hodiny. Obvykle jsou posunuté o několik hodin a začátečníci jsou ze situace zoufalí. Vlastně na tom ale není nic tak komplikovaného, stačí mít správné nastavený systémový čas a správnou časovou zónu.
Hardwarový čas
Linuxové jádro při svém startu převezme hodiny od hardware. Na základní desce jsou obvykle integrovány hodiny reálného času (RTC), které jsou napájeny z baterie a běží tedy i při vypnutém počítači. Nebývají nijak zvlášť přesné, ale pro úvodní orientaci postačují. Jejich nastavení uvidíte při vstupu do Biosu.
Hardwarové hodiny je možné nastavovat také z operačního systému, v Linuxu k tomu slouží utilita hwclock
. Pokud jej spustíte bez parametrů, dozvíte se, jaký ukazují v danou chvíli čas:
# hwclock 2018-09-19 09:56:34.717870+0200
Utilita automaticky přepočítá čas podle nastaveného pásma, pokud je to potřeba. Existují totiž dva různé přístupy: buď hardwarové hodiny ukazují rovnou lokální čas nebo častěji univerzální čas UTC. Kvůli přechodu na letní čas při vypnutém počítači je výrazně doporučováno používat v hardwarových hodinách UTC. Pozor ovšem na to, že to může způsobit problém při dualbootu s Windows, která zase počítají jen s hodinami v lokálním čase.
Utilita hwclock
si informace uchovává v souboru /etc/adjtime
. Ten může vypadat třeba takto:
# cat /etc/adjtime 0.001462 1537343980 0.000000 1537343980 UTC
První řádek obsahuje na začátku informaci o systematické chybě hardwarových hodin. Ty sice nejsou přesné, ale jejich chyba je stabilní a zde je uložena hodnota v sekundách za den (samozřejmě může být i záporná). Kromě toho je tu také čas, kdy byly naposledy hodiny ze systému nastaveny (v sekundách unixového času, od 1. ledna 1970).
Poslední řádek pak ukazuje informaci o tom, zda hardwarové hodiny ukazují místní čas nebo univerzální. Na tomto řádku může být tedy zapsáno LOCAL
nebo UTC
. V případě, že soubor chybí nebo tato informace není k dispozici, považuje se za výchozí univerzální čas.
Utilita si soubor přepisuje ve chvíli, kdy zároveň nastavuje hardwarové hodiny. To můžete vynutit použitím parametru -w
či --systohc
. Zároveň při tom můžete změnit, zda mají hodiny tikat podle lokálního času ( --localtime
) nebo UTC ( --utc
).
Pokud chcete vidět více podrobností o stavu hardwarových hodin, zavolejte utilitu v debug režimu:
# hwclock -D hwclock z util-linux 2.29.2 Pro hodiny se použije rozhraní /dev. Poslední oprava posunu proběhla 1537343980 sekund od roku 1969. Poslední kalibrace proběhla 1537343980 sekund od roku 1969. Hodiny reálného času jsou nastaveny na UTC čas. Předpokládám, že hodiny reálného času jsou nastaveny na UTC čas. čekám na tik hodin… …hodiny tikly Hodiny reálného času ukazují 2018/09/19 08:26:57 Hodiny reálného času: 2018/09/19 08:26:57 = 1537345617 sekund od roku 1969 Doba od poslední opravy je 1637 sekund Vypočtený systematický posun hardwarových hodin je 0,000027 sekund 2018-09-19 10:26:56.807618+0200
Pokud jdou hodiny špatně, můžeme je ručně nastavit na požadovanou hodnotu:
# hwclock --set --utc --date='2019-09-19 8:45:05'
Hodiny nám tedy tikají správně a systém si je při startu umí načíst. Pokud budeme chtít přenos z hardwarových do systémových hodin vyžádat, můžeme k tomu použít parametr -s
nebo dlouhou variantu --hctosys
.
Časová zóna
V tuto chvíli systém ví, kolik je hodin podle UTC. Aby nám ukazoval lokální čas, musí vědět, kde se nacházíme a jakou časovou zónu má použít. K tomu slouží takzvaná tz databáze, někdy také zvaná tzdata, zoneinfo databáze nebo IANA time zone database. Vytváří se jako public domain a je k dispozici na webu IANA.
Jedná se vlastně o databázi časových zón rozdělenou podle jednotlivých států. Obsahuje i všechna historická data, to proto, aby bylo možné správně přepočítávat čas na lokální také u historických časových značek. Databáze je pravidelně aktualizována, jak do ní přibývají informace o úpravách časových zón.
Databáze je distribuována v lidsky čitelné textové podobě včetně komentářů, pro použití v Linuxu je nutné ji mít zkompilovanou do platformně nezávislé binární podoby. To zajistí například kompilátor zic
, který se nachází v základním systémovém balíčku libc-bin
.
Nebudete ho ale potřebovat, pokud nemáte v plánu upravovat pro nějaké speciální účely rozvržení časových zón. V balíčku tzdata
totiž už přicházejí časové zóny zkompilované a rozdělené podle kontinentů do adresářů. Najdete je v /usr/share/zoneinfo/
. Data odtud načítá především knihovna GNU C (glibc), která pak nabízí standardní funkce pro získávání času.
Nastavení časové zóny
Použitá časová zóna se nachází v souboru /etc/localtime
. Obvykle se sem data nekopírují, pouze se vytvoří symbolický link odkazující na správný soubor:
# unlink /etc/localtime # ln -s /usr/share/zoneinfo/Europe/Prague /etc/localtime
Druhou možností je v moderních distribucích využít služeb konfigurační utility timedatectl
, která nabízí rozhraní k vypsání a nastavení časových zón. Dělá samozřejmě nakonec totéž, jen alternativní cestou.
# timedatectl list-timezones … Europe/Oslo Europe/Paris Europe/Podgorica Europe/Prague Europe/Riga Europe/Rome Europe/Samara … # timedatectl set-timezone Europe/Prague
V každém případě by vám nyní příkaz date
měl vypisovat správný místní čas včetně zobrazení správné zóny:
# date St zář 19 11:00:19 CEST 2018
Automatické nastavení času
Pokud máme správně časovou zónu a nastavili jsme si správně hodinky, určitě chceme, aby se nám přesný čas udržoval automaticky dále. K tomu slouží protokol NTP, který umí pomocí časových serverů na internetu sám ladit nastavení systémových hodin.
Podrobně jsme o tom psali v článku Přesný čas: nalaďte se podle atomových hodin
K synchronizaci budete potřebovat démona, který ovládá protokol NTP a umí upravovat rychlost hodin v jádře. Použít je možné různé implementace včetně NTP, OpenNTPD nebo Chrony. Poslední zmíněný je dnes výchozím například v RHEL a derivátech a je doporučován kvůli rychlejší synchronizaci, stabilnějšímu fungování na uspávaných systémech a lepšímu fungování při odpojování od sítě.
Konfigurace se nachází v souboru /etc/chrony.conf
a to hlavní je konfigurace časových serverů, ke kterým se má démon připojovat. Obvyklé dnes je, že už po instalaci je nastaveno několik serverů z projektu ntppool.org, ke kterému se mohou přihlásit různí dobrovolníci.
Pokud je konfigurace v pořádku, stačí démona zapnout a pomocí utility chronyc
případně monitorovat jeho stav. Parametr tracking
vypíše údaje o stavu synchronizace hodin, sources
vás zase informuje o tom, k jakým serverům je démon připojen.
Tak přesný čas všem!