Systémové hodiny na Linuxu fungují jednoduše. Po startu počítače si systém přečte čas z hardwarových hodin (které jsou uloženy na PC v BIOSU) a nastaví si tak svůj systémový čas. Od této chvíle se o čas stará časovač procesoru. Samozřejmě že ten není úplně přesný (což není jeho hlavní úkol) a tak se systémový čas vždy trošičku odchýlí od toho hardwarového (a ten se obvykle také odchýlí od toho pravého). Při dalším restartu se sice čas znovu „upraví“ podle hardwarových hodin, jenže to nám moc nepomůže, protože předpokládám, že počítač slouží jako server a tudíž se nerestartuje velmi často.
Naštěstí, jak už je zvykem, v Linuxu se nabízí hned několik řešení. Záleží na vás, který zvolíte. Pokusím se popsat alespoň základní dvě a pokud existuje nějaká jiná a ještě jednodušší (či přesnější) metoda synchronizace času, rád si vše přečtu v diskuzním fóru.
1) rdate
Nejjednodušším způsobem jak synchronizovat čas ať už na serveru či na stanici je příkaz rdate, který vypíše čas na vzdáleném systému (pokud na něm běží služba time na portu 37). Jedná se o banální TCP/UDP protokol (viz. RFC 868), který přenese jediné 32 bitové číslo – počet sekund od 1.1.1900 (tento protokol tedy bude fungovat asi do roku 2036 ;) Jedním z jeho parametrů (a že je jich opravdu mnoho ;) je -s, který provede synchronizaci se systémovým časem. ALE POZOR! Jak klient tak server počítají s GMT (Greenwich Mean Time) časem. Proto po vypsání příkazu rdate ntp.nasa.gov získáte aktuální čas ve své časové zóně a nikoliv čas v zóně serveru! Pokud byste chtěli zjistit opravdový (reálný) čas na vzdáleném serveru, musíte to provést nějak jinak.
Tímto způsobem lze tedy bez velké námahy udržovat poměrně přesný čas (s odchylkou adekvátní rychlosti přenosu). Stačí to vložit do cronu. Synchronizaci každých 15 minut můžete docílit například tímto příkazem:
root# echo "0,15,30,45 * * * * /usr/bin/rdate -s \ ntps1-2.uni-erlangen.de &> /dev/null" >> /etc/crontab
Samozřejmě že místo německého stroje uvedete nějaký jiný s relativně přesným časem (např. o kterém víte, že na něm běží NTP) a hlavně – který je „blízko“ (ne fyzicky ale odezvou).
2) NTP a SNTP
Network Time Protocol (port 123) je o mnoho složitější a také přesnější. Synchronizované servery jsou to postaveny do hierarchické stromové struktury. Každý server je v určité vrstvě (stratum) při čemž v nejvyšší vrstvě číslo jedna (stratum-1) je server, který je připojen na nějaké externí časové zařízení (GPS, rádiové, atomové hodiny ap.) Jeho „potomci“ (např. třetí nebo čtvrté vrstvě) se považují za méně přesné. Protokol NTP stanoví maximální možný počet vrstev na 15.
NTP protokol má čtyři majoritní verze. V současné době je nejpoužívanější verze 3, avšak již je vyvinuta stabilní verze 4 (ta má již zkratku SNTP (Simple NTP) a je trošku zjednodušená – pozor na překlepy: SNTP, SNMP a SMTP jsou tři různé protokoly ;-). Pozor na názvy. Démoni verze 3 nebo nižší mají název xntpd a verze 4 se jmenuje ntpd. Všechny verze jsou zpětně kompatibilní. NTP démon umožňuje vzdálenou administraci (za pomoci ntpdc klienta) a autentizaci šifrováním. Tato autentizace je důležitá zejména proto, aby potencionální útočník nemohl zaslat matoucí informaci a změnit tak systémový čas. Instalace je snadná, instalační balíčky s binárkami se nacházejí jak na Red Hatu tak na Debianu. Ukázková konfigurace může vypadat například takto:
# seznam serveru server ntp1.fau.de server ntps1-0.uni-erlangen.de server rustime01.rus.uni-stuttgart.de # jeste nejake ty formalitky driftfile /etc/ntp/drift broadcastdelay 0.008 authenticate no
Hotovo. Otestování funkčnosti našeho nového démona provedeme utilitkami ntpq nebo ntpdate (což je obdoba příkazu rdate):
[root@cop /root]# ntpq ntpq> help Commands available: addvars associations authenticate cl clearvars clocklist clockvar cooked cv debug delay exit help host hostnames keyid keytype lassociations lopeers lpassociations lpeers mreadlist mreadvar mrl mrv ntpversion opeers passociations passwd peers poll pstatus quit raw readlist readvar rl rmvars rv showvars timeout version writelist writevar ntpq> host time current host set to time.loc ntpq> rl status=0664 leap_none, sync_ntp, 6 events, event_peer/strat_chg, processor="i486", system="Linux2.2.14-5.0", leap=00, stratum=2, precision=-17, rootdelay=39.269, rootdispersion=23.864, peer=7692, refid=faui45.informatik.uni-erlangen.de, reftime=bd855272.e6c2699c Wed, Oct 4 2000 8:53:38.901, poll=10, clock=bd8554c6.4b5dedf1 Wed, Oct 4 2000 9:03:34.294, state=4, phase=0.009, frequency=-320.455, jitter=1.262, stability=0.017 ntpq> quit [root@cop /root]#
Nezoufejte pokud server píše zprávy typu „Server is not synchronized!“ a v klidu vyčkejte, protože proces synchronizace někdy trvá i několik minut! Situace se nám poněkud komplikuje, pokud chceme službu NTP nabízet. V tomto případě si malinko „zakonfigurujeme“ a z bezpečnostních důvodů určíme, komu bude server odpovídat.
Které řešení je tedy nejvýhodnější? Pokud máte zajistit čas pro celou síť je vhodné, aby se např. brána či firewall synchronizovala přes NTP. Zbytek sítě pak bude bráně „věřit“ a budou se synchronizovat podle ní (existuje spoustu shareware/freeware utilitek i pro Windows). A jaký NTP server zvolit? Předně se zeptejte svého providera, ten by vám měl sdělit adresu nejvhodnějšího stroje (buď bude mít nějaký svůj nebo bude znát nějaký vhodný nadřízený). Pokud se informace od providera nedozvíte, použijte seznamy veřejných NTP serverů, které naleznete na konci tohoto článku.
Mám tady ještě malou výzvu pro časové odborníky. Zajímal by mě rozdíl mezi GMT a UTC – tedy zda nějaký existuje a také jestli má GMT resp. UTC vliv na DST. Trošku jsem se při psaní tohoto článku zamotal a abych pravdu řekl, už ani nevím, v jaké časové zóně jsme. Jeden systém mi tvrdí +1, druhý zase +2 (ovšem všichni se shodují na tom, že je právě dvanáct hodin a já jdu tedy na oběd… :). Přeji hezký den.
Odkazy:
www.NTP.org
RFC 868 – Time Protocol
RFC 1059 – Network Time Protocol v1
RFC 1119 – Network Time Protocol v2
RFC 1305 – Network Time Protocol v3
RFC 2030 – Simple Network Time Protocol v4
Seznam veřejných STRATUM-1 NTP serverů
Seznam veřejných STRATUM-2 NTP serverů
NTP FAQ