Přesný čas Linuxu
Nejen v operačním systému GNU/Linux se pro správu a synchronizaci času používá služba NTPd (Network Time Protocol Daemon), název, jak je patrné, vychází z pojmenování velmi složitého a precizního síťového protokolu NTP.
Synchronizace času v počítači může fungovat v zásadě dvěma způsoby. První je triviální nastavení času v určitých intervalech, což je velmi hloupé a přináší to s sebou problémy (viz níže). Tento způsob zajistí přesnost času řádově v sekundách. Což možná stačí na včasný odchod na autobus, ovšem na pořádnou práci nikoliv a taková časová odchylka může mít i právní následky (například pro termíny veřejné zakázky, aukcí apod.).
Druhým a preferovaným způsobem je plynulá změna toku času. Mění se tedy (velmi nepatrně) rychlost tikání vnitřních hodin v operačním systému. Tímto způsobem lze na fyzickém počítači dosáhnout dlouhodobé přesnosti řádově stovky mikrosekund. Tento způsob času zajišťuje služba NTPd. Pro přesnější čas (například laboratorní měření) lze zakoupit speciální přístroje.
Zdroje času na síti
Zdroji přesného času na síti jsou časové servery. Tvoří vrstvy (v NTP terminologii se používá výraz stratum). Zařízení stratum 0 jsou samotné generátory přesného času. Mohou to být atomové hodiny, GPS družice (každá obsahuje dvoje atomové hodiny, GPS přijímač vidí minimálně čtyři družice) a další zdroje.
Na tato zařízení se připojují servery stratum 1. Tyto jsou tedy prvním síťově dostupným zdrojem času a nejpřesnějším zdrojem času na síti. Používají se pro synchronizaci ostatních časových serverů na další vrstvě, tedy stratum 2, a až tyto by měly být používány klienty (ovšem dnes jsou pro klienty nabízeny i servery stratum 1, například český ntp.nic.cz).
Instalace, nastavení povolení a spuštění služby
Instalace služby je závislá na konkrétní distribuci GNU/Linuxu, například pro systémy Red Hat Enterprise Linux a CentOS (způsob instalace balíčků pro vaši distribuci se může lišit):
yum install ntp
Služba je ve výchozím stavu nastavena na synchronizaci času pomocí veřejně dostupných časových serverů (například pool.centos.org) a lze ji bez dalšího nastavování spustit. Mnoho systémů má tuto službu automaticky spuštěnou již od instalace.
Po ruční instalaci je nutné povolit službu při startu systému a spustit ji (opět platí pro RHEL a CentOS):
chkconfig ntpd on service ntpd start
Vlastní nastavení služby NTPd
Prakticky jediným zásahem ze strany uživatele je výběr zdrojů času. Chceme-li býti patrioty (nebo jen prostě potřebujeme mít čas synchronizovaný se státním etalonem času České republiky), nastavíme v souboru /etc/ntp.conf kvalitní české časové servery:
server ntp.nic.cz prefer server tik.cesnet.cz server tak.cesnet.cz
Pomocí parametru prefer lze označit zdroj času, který má být primárně používán. Po jakýchkoliv změnách v souboru /etc/ntp.conf je nutné službu restartovat příkazem service ntpd restart
.
Kontrola
O stavu synchronizace se lze přesvědčit příkazem ntpq -p
, příklad:
remote refid st t when poll reach delay offset jitter ============================================================================================== +tik.cesnet.cz. GPS. 1 u 68 256 377 3.950 0.297 0.059 *tak.cesnet.cz. GPS. 1 u 148 256 377 3.945 0.255 0.068 +ntp.nic.cz. PPS. 1 u 129 256 377 3.934 0.365 0.068
Kde jednotlivé sloupce znamenají:
-
Remote je vzdálený server se zdrojem času. Znak * udává preferovaný server. Všimněte si, že je jiný, než jsme uvedli v konfiguraci. Služba NTPd vybírá vhodné servery podle dlouhodobých statistik. Znak + označuje další vhodné kandidáty na preferovaný server, pokud aktuální vypadne. Znak – bychom nikdy vidět neměli, označuje totiž nekvalitní zdroj času.
-
Refid je zdroj času používaný daným serverem. Zdroj GPS označuje synchronizaci pomocí družic globálního pozičního a navigačního systému, PPS (pulse per second) je pak speciální tikající zařízení připojené k počítači (například atomové hodiny, velmi přesný krystal apod.).
-
St udává vrstvu časového zdroje v hierarchii, viz pojem stratum výše.
-
When a pool udávají čas další kontroly času u vzdáleného serveru.
-
Reach udává stav synchronizace. Pro nás je důležitá pouze hodnota 377, pak je synchronizace plně funkční. Pro dosažení 377 je potřeba hned několik dotazů na vzdálené servery, což může trvat i několik desítek minut.
-
Delay je síťová latence vzdáleného serveru.
-
Offset udává rozdíl času v ms a tato hodnota nás tedy zajímá nejvíce. V uvedeném výpise je časový rozdíl 255 μs (0.255 ms). Všimněte si, že dosahovaná přesnost je několikrát lepší než síťová latence.
Přesný čas a virtualizace
Synchronizace virtuálních strojů má svá specifika daná především horší kvalitou lokálního času. Při synchronizaci virtuálních strojů (zde je konkrétně popisován návod pro VMware ESX, ale tento postup obecně platí i pro ostatní virtualizační nástroje) je nutné vypnout zdroj času local („hardwarové“ hodiny na virtuálním stroji) a někdy také povolit službě NTP překonávat velké rozdíly v čase, které není možné překonat změnou rychlosti plynutí času a je nutné je řešit skokem.
Vypnout zdroj času local lze několika způsoby. Vypnout synchronizaci času v ESX konzoly (VMware Tools | Time Synchronization), pak „hardwarový“ čas virtuálního stroje nastavuje NTPd. Druhá možnost je nastavit NTPd tak, aby se vůbec nezabýval časem z hardwaru (z praxe doporučuji) a bral pouze čas ze síťových zdrojů přesného času. Tato možnost umožňuje nastavit synchronizaci času bez nutnosti vypnutí stroje pro nastavení parametrů ve virtualizátoru. Tento způsob nastavení je i předmětem následujících řádků.
Vypnutí local
V /etc/ntp.conf je nutné zakomentovat (na počátek řádku vložit znak #
) či rovnou smazat následující řádky:
server 127.127.1.0 fudge 127.127.1.0 stratum 10
Povolení vyrovnání velkých časových rozdílů skokem
Pokud je časový rozdíl mezi synchronizovaným počítačem a zdrojem času větší než tisíc sekund, nelze jej upravit pomocí změny rychlosti toku času (trvalo by to neúnosně dlouho) a služba NTP se ukončí (a tuto skutečnost zapíše do systémového logu).
Jestliže potřebujeme vyrovnávat takto velké rozdíly a nevadí nám (jedna, po dosažení synchronizace se vzdálenými servery) skoková změna času, stačí přidat do konfiguračního souboru /etc/ntp.conf řádek:
tinker panic 0
Proč nepoužívat ntpdate a skokovou změnu času
Starý (a nikdy nedoporučovaný) způsob synchronizace času pomocí příkazu ntpdate pravidelně spouštěný z crontabu je obecně špatný. Konkrétně například z důvodu (pravidelné) skokové změny času, a to ještě oběma směry. Změna vpřed je méně škodlivá, ne však zcela bezpečná (hrozí potenciální možnost přeskočení některé naplánované úlohy, výpadek v monitorování pomocí nástrojů RRD apod.). Změna času vzad je daleko horší a může způsobit pád některých služeb (typicky POP a IMAP server dovecot), nepořádek v lozích a databázích, na souborové systému (novější verze souboru má starší čas) apod.
Naproti tomu, jak již bylo uvedeno, služba ntpd nepoužívá (krom speciálního případu, který je nutno povolit v konfiguraci) skokovou změnu času, ale plynule ovlivňuje rychlost toku času (směr je pochopitelně vždy stejný, dopředný). Podle potřeby tak čas v počítači plyne nepatrně rychleji (je potřeba dohnat aktuální přesný čas), či pomaleji (hodiny v počítači jsou napřed).
Dobře nastavená služba ntpd udržuje dlouhodobě čas v toleranci 10 ms na virtuálním stroji a několika stovek mikrosekund na fyzickém stroji.