Synchronizácia času - aplikácia chrony

5. 3. 2002
Doba čtení: 9 minut

Sdílet

V poslednom dieli seriálu o synchornizácii času si nainštalujeme a nakonfigurujeme aplikáciu chrony a opíšeme rôzne varianty a možnosti jej používania.
Úvod

Aplikácia chrony je NTP klientom a serverom zároveň. Pomocou nej je možné synchronizovať systémový čas oproti vybraným NTP serverom a zároveň byť poskytovateľom (zdrojom) presného času pre iných klientov. Taktiež vie kontrolovať odchýlku hardvérových hodín a tú zohľadniť pri nastavovaní presného času napr. po vypnutí počítača alebo pri dlhodobejšej nemožnosti prístupu k internetovým zdrojom. Celá aplikácia sa skladá sa z dvoch častí:

  • chronyd

    Démon bežiaci na pozadí zabezpečujúci sieťovú výmenu dát s NTP servermi a klientami, nastavovanie systémových aj hardvérových hodín, generujúci štatistiky a informácie o zdrojoch.

  • chronyc

    Klient slúžiaci na komunikáciu s démonom chronyd. Predstavuje jednoduchý príkazový nástroj, pomocou ktorého je možné za behu nastavovať rôzne parametre, dočasne meniť konfiguráciu démona, ručne nastavovať aktuálny čas systémových aj hardvérových hodín, zobrazovať generované štatistiky a pod.

Obe časti, chronyc aj chronyd majú svoj vlastný protokol postavený nad UDP komunikujúci na porte 323 (zmeniteľný v konfigurácii). Pomocou neho sú príkazy z príkazoveho riadku klienta chronyc posielané serveru chronyd, ktorý podľa nich vykonáva príslušné reálne akcie.

Aplikácia momentálne podporuje nasledovné platformy:

  • Linux 2.0, 2.1 (bez podpory RTC), 2.2, 2.3, 2.4, 2.5
  • Solaris 2.5/2.5.1 na architektúrach Sparc 20 a Ultrasparc
  • Solaris 2.8 na architektúre x86
  • SunOS 4.1.4 na architektúrach Sparc 2 a Sparc 20
  • BSD/386 (s použitím ovládača pre SunOS 4.1.4)
  • ďalšie varianty BSD systémov budú fungovať po modifikácii configure skriptu tak, aby bol systém rozpoznaný ako SunOS alebo BSD/386

Portovanie programu na ostatné systémy by nemalo byť zložité. Problematickým je len nie celkom jednotné správanie volaní jadra adjtimex(), gettimeofday() a settimeofday(). Práve kvoli absencii týchto funkcií nie je démon chronyd portnutý aj na platformu MS-Windows. Klient chronyc však spoľahlivo funguje v prostredí Cygwin.

Oproti klasickému NTP démonu má chrony viaceré výhody, ale i nevýhody. K výhodám patrí funkčnosť aj pri nefrekventovanom pripojení k Internetu (dial-up); optimalizované používanie na izolovaných lokálnych sieťach, kde jediným zdrojom presného času sú hodinky administrátora; integrovanosť všetkých funkcií do jednej binárky (chronyd). Naopak nevýhodami sú nepodpora hardvérových časových zdrojov pripojených k serveru (GPS, atómové hodiny); nekompletne implementované RFC 1305, tj. napr. nemožnosť synchornizovania času broadcastom alebo multicastom; podpora relatívne malého počtu platforiem.

Inštalácia

Program sa dodáva vo forme zdrojových kódov. Autor popisuje, že existujú aj inštalačné balíčky pre Debian, ale táto aktivita ide viacmenej mimo neho. My nainštalujeme chrony klasickou metódou.

Z oficiálnej domovskej stránky projektu si stiahneme aktuálnu verziu 1.16, ktorú nájdeme tu. Taktiež musíme stiahnuť aj patch, ktorý fixuje chybu pri kompilovaní na jadrách 2.4.13 a pravdepodobne aj vyšších. Ten sa nachádza tu.

Súbory premiestnime na miesto, kde zvykneme kompilovať programy a rozbalíme, aplikujeme patch, skompilujeme a nainštalujeme do adresára /usr/local/. Posledný z príkazov musí vykonať root.

tar xvzf chrony-1.16.tar.gz
cd chrony-1.16
gunzip < ../chrony-1.16-1.16.1-patch.gz | patch -p1
./configure
make
# make install

Vzhľadom nato, že ide o pomerne špecifický softvér, množstvo varovaní od kompilátoru nebude výnimkou. Zväčša ich však môžeme bez problémov odignorovať. V podadresári contrib/ máme rôzne podporné súbory. Zaujímavý je najmä contrib/stephan_bo­ettcher1, ktorý po úprave môžeme použiť ako štartovací skript podľa normy System V. Na distribúcii RedHat alebo obdobnej ho treba uložiť do adresáru /etc/rc.d/init.d/ a vytvoriť príslušné symbolické linky v podadresároch /etc/rc.d/rc?.d/ (manuálne alebo programom chkconfig).

Podmienkou funkčnosti aplikácie je zapnutá podpora pre RTC v jadre alebo skompilovaný a nainštalovaný modul rtc.o.

Konfigurácia

V tejto fáze máme program nainštalovaný, môžeme sa pustiť do konfigurácie. Našou modelovou situáciou bude lokálna sieť pripojená pomocou linuxového routeru do Internetu. Predpokladám, že aplikácia chrony je nainštalovaná práve na tomto routeri.

Na začiatok je nutné zadovážiť si zdroje presného času. Tie možno získať nasledovnými spôsobmi:

  • Inštitúcia pod ktorú spadá vaša podsieť môže na niektorom zo svojich serverov prevádzkovať NTP server.
  • Poskytovateľ vášho internetového pripojenia (ISP) môže taktiež zabezpečovať prístup k vlastným NTP serverom.
  • Na tejto stránke sa nachádza zoznam verejných NTP serverov, ktoré možno používať za určitých podmienok. Viz. predchádzajúci diel.

Predpokladám teda, že máme vybraný aspoň jeden platný NTP server. Za každý vybraný server do konfiguračného súboru /etc/chrony.conf zapíšeme:

server a.b.c

Kde a.b.c je meno alebo IP adresa príslušného NTP serveru. Ďalej potrebujeme zabezpečiť ochranu pred nežiadanou manipuláciou chronyd klientom chronyc. Vytvoríme súbor /etc/chrony.keys a nastavíme mu mód na 0600 (chmod 0600 /etc/chrony.keys). Do súboru zapíšeme identifikačné číslo (ID) a heslo. Takže napríklad:

echo "1 kofola" > /etc/chrony.keys

A taktiež odpovedajúce direktívy v konfiguračnom súbore:

keyfile /etc/chrony.keys
commandkey 1

Odteraz bude každá podstatná akcia vyžadovať heslo. Potrebujeme ešte zadať meno súboru, kde sa budú zaznamenávať odchýlky systémového času. Tie budú hrať svoju úlohu, pri absencii pripojenia k Internetu, resp. NTP serverom.

driftfile /etc/chrony.drift

Minimálna konfigurácia je teda na svete a v uvedenom nastavení je možné používať chrony pri permanentnom pripojení.

Dial-up

Pre pripojenie dial-up platia rovnaké pravidlá získavania zdrojov presného času ako pri pevnej linke. Rozdielom je, že je nutné za direktívou server špecifikovať kľúčové slovo offline. V opačnom prípade by sa chrony pokúšal pripojiť k NTP serverom aj keď nie je internetové pripojenie aktívne. Ak navyše používate službu dial-on-demand, netreba zdôrazňovať, čo by to v praxi znamenalo. Taktiež je nutné písať priamo IP adresy serverov miesto ich symbolických mien, pretože prístup k DNS bez pripojenia k Internetu pravdepodobne nemáte. Vzorový riadok bude vyzerať teda takto:

server 1.2.3.4 offline

Ďalším vecou je nutnosť oznamovať aplikácii, kedy sa internetové pripojenie stáva aktívnym a kedy naopak neaktívnym. Využijeme nato klienta chronyc a bude to môcť pochopiteľne vykonať iba osoba poznajúca heslo, ktoré sme nastavili. Do internetového štatovacieho skriptu (/etc/ppp/ip-up) zapíšeme nasledovné riadky:

/usr/local/bin/chronyc <<EOF
password kofola
online
EOF

Obdobne aj do súboru /etc/ppp/ip-down:

/usr/local/bin/chronyc <<EOF
password kofola
offline
EOF

Synchornizácia času bude prebiehať iba pri aktívnom internetovom pripojení. V prípade, že ste nainštalovali aj podporný System V štartovací skript, o ktorom som sa zmieňoval v úvode, môžete používať zjednodušené zápisy týchto príkazov. Opäť ich treba zapísať do príslušných internetových skriptov.

/etc/rc.d/init/chrony online

resp.

/etc/rc.d/init/chrony offline

Lokálna sieť

Teraz si povieme ako pomocou našeho routeru synchronizovať čas na celej lokálnej sieti. Na serveri stačí povoliť pripájanie klientom. V základnom nastavení nie je povolené pripájanie žiadnym klientom. Ak je teda naša podsieť napr. 192.168.1.0/24, do konfiguračného súboru routeru s IP adresou 192.168.1.1 za­píšeme:

allow 192.168.1

Na povoľovanie a zamedzovanie prístupu sa okrem direktívy allow používa aj deny. Pomocou nich je možné vytvoriť ľubovolné kombinácie prístupu tak celých podsietí ako aj samostatných serverov.

Ako NTP klientov na našej lokálnej sieti môžeme používať opäť program chrony. Jediné čo musíme v konfigurácii klienta predefinovať je direktíva server, ktorú zmeníme na:

server 192.168.1.1

Na rozloženie záťaže môže každý z týchto klientov zároveň ako NTP server pre ďalších klientov a pod. Rôznorodosti sa medze nekladú. Častokrát však bývajú na lokálnych sieťach používané aj pracovné stanice Windows. Pre tie existuje jednoduchý a pritom vysoko konfigurovateľný NTP klient Automachron, ktorého môžeme získať tu.

Izolovaná sieť

Špecifickým prípadom konfigurácie lokálnej sieťe je izolovaná sieť bez prístupu do Internetu. Opäť bude synchronizácia času prebiehať pomocou jedného hlavného time serveru, ktorý si sami vyberieme. Situácia sa však môže navyše skomplikovať, ak chceme tento hlavný time server čas od času vypnúť resp. reštartovať. Všetky tieto situácie má však chrony bezpečne vyriešené.

Konfigurácia je rovnaká ako v prípade lokálnej siete. Keďže na hlavnom time serveri budeme čas nastavovať manuálne, potrebujeme navyše špecifikovať v jeho konfigurácii direktívu manual. Tá zabezpečí, že budeme môcť v príkazovom riadku klienta chronyc používať príkaz settime na nastavovanie času, ktoré bude sledované a pomocou neho sa budu určovať odchýlky systémových i hardvérových ho­dín.

Taktiež je nutné v konfigurácii definovať odchýlku od reálneho času v podobe veľkosti stratum. Princíp ohodnotenia časových zdrojov bol vysvetlený v minulej časti, pre nás je dôležité, že náš hlavný time server je stratum-8 a jeho klienti sú stratum-10. Je možné prirodzene použiť aj iné čísla v závislosti od toho ako si myslíme, že je náš čas presný, rozhodne však klient musí mať väčšie číslo ako server s ktorým sa synchronizuje. Zápis do konfiguračných súborov bude vyzerať takto (n je veľkosť stratum):

local stratum n

Ak uvažujeme, že náš hlavný timeserver sa čas od času reštartuje, ale niektorý z jeho klientov ostáva zapnutý, môžeme na počiatočnú synchronizáciu pri štarte aplikácie použiť direktívu initstepslew. Ako parameter špecifikujeme maximálnu možnú zmenu systémového času (predpokladajme, že je to 30 sekúnd). Za ňou nasleduje zoznam počítačov, ktoré nám s touto úvodnou synchronizáciou pomôžu. Netreba ale zabudnúť povolenie spojenia na klientoch pomocou direktívy allow. Konfiguračný záznam bude vyzerať napr. takto (192.168.1.1 je hlavný time server; ostatné jeho klienti):

initstepslew 30 192.168.1.2 192.168.1.3

Takisto pre klientov napr.:

initstepslew 5 192.168.1.1

Ďalšie nastavenia

Medzi jednu z najlepších vlastností aplikácie chrony patrí vyrovnávanie odchýlky presného času po vypnutí počítača pri jeho následnom spustení. V príklade izolovanej sieti sme si povedali, ako sa na to dajú použiť iné zdroje z našej lokálnej siete. Ak však tieto zdroje nemáme, môžeme na nastavenie presného času pri štarte použiť hardvérové hodiny a ich zaznamenanú odchýlku.

Na základe jednotlivých meraní pri aktívnom pripojení k Internetu vie aplikácia udržovať systémové hodiny veľmi presné. Vďaka tomu vie potom aj zistiť reálnu odchýlku hardvérových hodín od presného času. Pri vypínaní bude zapísaná do súboru špecifikovaného direktívou rtcfile a pri najbližšom štarte použitá na nastavenie systémových hodín podľa hardvérových hodín a spomínanej odchýlky. Aplikácia tiež zapíše merania a štatistiky pre všetky NTP servery s ktorými sa synchornizovala. Tie budú pri štarte obnovené vďaka čomu bude zachovaný aj ďalší správny chod systémových hodín. I keď to vyzerá možno zložito, skutočne to funguje. :-)

Podmienkou funkčnosti je vypnutý 11-minútový mód (viz. prvý diel), a nasledovné riadky v konfiguračnom súbore:

writertc
dump

Prvý riadok zabezpečí spomínaný zápis odchýlky hardvérových hodín do súboru (aj pri signáloch SIGTERM a ďalších). Další zase zápis štatistík NTP serverov. Problém nastáva, keď je počítač vypnutý nečakane, napr. v dôsledku výpadku prúdu. Ochrana proti tomu spočíva v špecifikovaní uvedených príkazov na mieste kde sa nachádza direktíva offline, tj. pri odpájaní z Internetu.

Záver

Tak a to už je naozaj všetko. Verím, že si túto aplikáciu obľúbite pre jej širokospektrálnu funkčnosť rovnako ako ja a že od dnešného dňa budú všetky vaše servery a pracovné stanice obsahovať len ten správny a presný čas.

bitcoin_skoleni

Zdroje

domovská stránka aplikácie chrony: http://www.rrbcur­now.freeuk.com/chro­ny/
domovská stránka NTP klienta Automachron pre Win32: http://oneguy­coding.com/au­tomachron
RFC dokumenty: RFC 1305 (PDF)
manuálové stránky: adjtimex(2)
systémové hlavičkové súbory: /usr/include/sys/ti­mex.h

Autor článku