Hlavní navigace

Přesný čas: nalaďte se podle atomových hodin

1. 11. 2010
Doba čtení: 8 minut

Sdílet

 Autor: profit
Přesný čas je důležitý nejen pro to, abychom stihli autobus, ale potřebují jej také naše počítače a servery. Naštěstí tu máme prastarý a užitečný protokol NTP, který umožňuje srovnat čas proti atomovým hodinám. Automaticky tak můžeme udržovat odchylku v řádu několika milisekund a vždy budeme přesní.

NTP je jedním z nejstarších dodnes používaných internetových protokolů. Vznikl na počátku osmdesátých let minulého století a na University of Delaware jej navrhl David L. Mills, který je také mimochodem tvůrcem první implementace FTP. V současné době je aktuální čtvrtá verze protokolu, kterou popisuje RFC 5905.

NTP je možné využívat jak v unixových systémech, tak na MS Windows. Implementace Microsoftu je ovšem poněkud pochybná a sama firma přiznává, že její systémy negarantují odchylku nižší než jednu až dvě sekundy. Samozřejmě i pro Windows existuje implementace démona ntpd, kterým se budeme v tomto článku zabývat. Nabízí plnou podporu aktuálního NTPv4 a měl by dosahovat vysokých přesností. Dále se Windows již nebudeme zabývat.

Jak to funguje

Protokol NTP využívá UDP portu 123, po kterém se domlouvá s ostatními nakonfigurovanými servery, od kterých získává co možná nejpřesnější čas. Celý proces je poměrně složitý a přibližuje jej náš starší článek nebo článek na serveru Lupa.cz. Důležité je, že náš ntpd naváže spojení se všemi servery a snaží se změřit zpoždění způsobené sítí a tím co nejlépe odhadnout čas, který ukazují hodiny na těchto serverech. Výsledkem je pak čas, na který jsou postupně upraveny systémové hodiny.

Pravděpodobně vás bude zajímat, jak je takové nastavování času přesné. Závisí to na několika faktorech, mezi které patří počet serverů nastavených v konfiguraci ntpd a také kvalita sítě mezi vámi a těmito servery. Obecně se uvádí přesnost asi 10 milisekund při použití serverů na internetu a 200 mikrosekund (50× lepší) na lokální síti.

Pro pochopení a správné použití NTP je třeba také pochopit hierarchický systém serverů. Ten se používá především kvůli rozložení zátěže – přestože se používá úsporný protokol UDP, desítky tisíc uživatelů na jednom serveru už způsobují slušnou zátěž. NTP servery jsou v internetu rozloženy do takzvaných stratum zón, které se číslují počínaje jedničkou. Číslo pak označuje vzdálenost (tedy počet dalších časových serverů) od referenčního časového ukazatele. Tím obvykle bývá hardwarový GPS přijímač či přímo atomové hodiny. Toto zařízení se označuje jako stratum 0 a první server, který je k němu přímo připojen je v zóně stratum 1. Toto jsou servery velkých poskytovatelů přesného času (u nás třeba CESNET).

K těmto serverům jsou pak připojeny další počítače, logicky označované jako stratum 2. Jedná se o počítače, které slouží jako časové servery pro další sítě či koncové uživatele. Ti se pak nacházejí v zóně stratum 3 a dále. Teoretické maximum je stratum 255, ale tak vysoko nemá v praxi smysl jít a řetězec končívá obvykle u trojky či čtyřky.

Jako koncoví uživatelé byste ve své síti nebo na svém lokálním počítači měli používat pro seřizování času servery alespoň stratum 2, abyste zbytečně nevytěžovali přesnější servery ve vyšší úrovni, kterých je logicky výrazně méně. Samozřejmě máte možnost si i ve své síti pořídit stratum 1 server, pokud chcete investovat do hardwarového přijímače přesného času. Cena už dnes nebude jinak závratná.

Proč nepoužívat ntpdate

Část uživatelů stále ještě využívá služeb programu ntpdate, který je součástí balíčku ntpd. Vývojáři už ale tento postup označují za zastaralý a nadále jej nedoporučují. Hlavní problém tohoto programu je v tom, že se jedná o „jednorázového nastavovače času“. Program se jednoduše spustí, zjistí od zvoleného serveru přesný čas, nastaví podle něj hodiny a svou činnost skončí.

Z toho vyplývá, že se systémové hodiny mění skokově v obou směrech. Při použití ntpdate tak může jednoduše dojít k tomu (a také dochází), že si některá aplikace dvakrát vyžádá od systému aktuální čas a druhý získaný údaj bude nižší než ten první. Takový skok do minulosti vám jednak popletou třeba logy, ale některé aplikace vůbec podobnou změnu neunesou. Klasickým příkladem je POP3 a IMAP server Dovecot. Ten ve starších verzích havaroval, ve verzích novějších než 2.0 pak „jen“ shodí aktuální spojení a počká, až se čas zase srovná.

Důvodem, proč si tento server hlídá jednosměrnost času, jsou časové značky, které jsou využívány při ukládání pošty do souborů v Maildiru, hlídání změn, zamykání adresářů a podobně. Pokud by došlo k poškození těchto značek, mohlo by dojít ke ztrátě dat. Dovecot ale není jediný a obecně posunutí času zpět způsobí problémy různým síťovým službám nebo i databázovým serverům, které se spoléhají na systémový čas. Z tohoto důvodu je ntpdate velmi nevhodnou metodou pro nastavování systémového času. Nepoužívejte ji.

V poslední sekci tohoto článku najdete postup, kterým můžete jednoduše (a správně) provést jednorázovou synchronizaci času.

Časový démon ntpd

Místo ntpdate se dnes využívá výhradně démon ntpd, který je velmi mocný a umí spoustu užitečných věcí. Dokáže také beze zbytku nahradit zastaralý ntpdate. Výhodou ntpd je, že jakékoliv úpravy provádí plynule, tedy pomocí zrychlování nebo zpomalování systémových hodin. Nikdy tak nemůže dojít k tomu, že by se čas vrátil zpět.

Práce s ntpd je v zásadě velmi jednoduchá. Zcela jistě jej naleznete v repositářích své linuxové distribuce či jiného operačního systému. Konfiguračním souborem je /etc/ntp.conf, do kterého je potřeba po instalaci zapsat servery, které chceme používat. Navštivte proto příslušnou stránku na ntp.org a vyberte si několik stratum 2 serverů. Více serverů zajistí lepší přesnost hodin a démon se také bez problémů vyrovná s výpadkem (totálním nebo i rozsynchronizování jeho času) některého z nich prostě tím, že bude používat ty ostatní.

V konfiguračním souboru jsou tyto server zapsány za položkou server. Co server, to jeden řádek. Já mám ve svých souborech následující servery ze zmíněného seznamu:

server ntp.ujf.cas.cz
server ntp.karpo.cz
server ntp2.contactel.cz

Můžete využít také služeb takzvaného pool serveru, který automaticky volí ze serverů nejblíže ve vašem okolí. Volba je na vás.

Poté už stačí server nastartovat tak, jak je to ve vašem systému obvyklé:

# /etc/init.d/ntp start

nebo

# service ntp start

Jelikož po spuštění začne probíhat komunikace se všemi servery, měření času nějakou dobu zabere a hodiny se začnou posouvat postupně, je nastavení přesného času obvykle otázkou minut. Nečekejte, že se za pět sekund hodiny ve vašem počítači výrazně změní a budou najednou přesné. Server ntpd by měl běžet pořád a neustále kontrolovat kvalitu času a korigovat ji. Pak už si ho nikdy nebudete muset všímat.

Kontrolujeme správný běh

Stav běžícího serveru je možné zkontrolovat pomocí programu ntpq. Pokud jej zavoláme s parametrem -p, dostaneme tabulku s informacemi o serverech a jejich použití:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*lx.ujf.cas.cz   195.113.156.189  2 u  865 1024  377    6.732   -0.141   0.445
+web1.euromise.c 195.113.144.201  2 u  782 1024  377    5.963   -1.091   0.152
+bus1.isp.contac 212.65.193.199   3 u  854 1024  377    6.925   -0.122   0.262

Plus u každého serveru značí, že je tento server používán a váš systém s ním vede komunikaci (neboli že vše funguje jak má). Hvězdička pak označuje primární server, tedy server s nejlepšími parametry, který je považován za referenční. Následuje informace o tom, z jakého nadřazeného serveru bere konkrétní server svůj čas. Následuje již vysvětlovaná položka stratum, která označuje vzdálenost konkrétního serveru od hardwarového zdroje přesného času.

Položka when odpočítává sekundy od posledního měření. Jakmile dosáhne na hodnotu položky poll, začne prověřování času proti danému serveru a počítadlo se opět vynuluje. Položka poll je proměnlivá a démon si ji nastavuje podle toho, jak dopadla předchozí zpřesňovací měření. Pokud čas příliš „neujíždí“, hodnota se zvyšuje, protože není třeba přeměřovat tak často. 

Položka reach je z historických důvodů trochu složitější: ukazuje počet úspěšných dotazů na konkrétní server pomocí posuvného registru. Jeho hodnota je ale ukazována osmičkově. Po startu démona ukazuje reach nulu a postupně se mění na 1, 3, 7, 17, 37, 77, 177, 377. Nejvyšší hodnota je 377 a znamená, že posledních osm dotazů na server bylo úspěšných.

Poslední tři položky delay, offset a jitter jsou v milisekundách a vztahují se přímo k měření času. První je odvozena od doby odpovědi od serveru, druhá ukazuje odchylku lokálního času od serveru a poslední ukazuje kolísání odchylky několika posledních měření.

Z praktického hlediska je pro kontrolu důležité, že servery mají před sebou znaménko plus a jeden je označen hvězdičkou a že poslední tři hodnoty v tabulce jsou dostatečně nízké. V takovém případě vše běží správně a není třeba na démona sahat. Pokud některý ze serverů přestane fungovat, na příslušném řádku bude chyba a vy můžete v konfiguračním souboru vybrat jiný server.

Šikovné poznámky na závěr

Stává se, že ntpd po instalaci odmítá nastavit váš systémový čas. Pokud totiž odchylka od zjištěného času přesáhne 1000 sekund (asi 17 minut), server zjistí, že je něco špatně a do logu zahlásí jen time correction of 3568 seconds exceeds sanity limit a s touto chybou se ukončí.

Pak je potřeba buďto časový posun vynutit nebo hodiny nastavit ručně. Pozor ovšem na to, že může dojít k problémům v některých aplikacích, tento postup byste měli proto provádět ideálně hned po instalaci systému, ještě než spustíte všechny služby. Můžete využít služeb příkazu date a zapsat přibližný čas ve formátu MMDDhhmm:

# date 12241600

Nebo provést automatické seřízení času pomocí ntpd. Standardním postupem to ale není možné udělat, protože jádro obvykle umožňuje zpomalovat či zrychlovat čas o 0,5 ms/s. Stáhnout desetiminutovou odchylku by takovým tempem trvalo asi 14 dní. Je možné ale tento režim obejít a pomocí parametrů vynutit časový skok:

UX DAy - tip 2

# ntpd -gq

Ty postupně znamenají: přeskoč úvodní kontrolu odchylky (čili ignoruj posun o více než 17 minut a neukončuj se), zapni zrychlený posun času a po srovnání hodin se ukonči. Jakmile tento příkaz proběhne, bude systémový čas relativně přesný a nyní je už možné standardně spustit démona pro trvalý běh.

Pokud vám ntpd nastavuje čas se špatným posunem, pravděpodobně máte v systému špatně nastavenu časovou zónu. Stačí správný soubor časové zóny nalinkovat do  /etc/localtime:

# ln -s /usr/share/zoneinfo/Europe/Prague /etc/localtime

Byl pro vás článek přínosný?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.