Hlavní navigace

Časové zóny a nastavení přesného času v Linuxu

Petr Krčmář

Správně nastavený systémový čas je důležité pro uživatele, ale také pro systém samotný. Vysvětlíme si, jak Linux přistupuje k časovým zónám a jak si nastavit přesný čas, aby vám to správně tikalo.

Doba čtení: 5 minut

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!

Našli jste v článku chybu?