Domainin kellot aikaan

Modernien Windowsien aikapalvelu(t) tuntuvat välillä olevan hieman epämääräinen suo. Tässä artikkelissa pyrimme hälventämään hämmennystä jonka aikapalveluiden kanssa säätäminen saa aikaan.

Aikapalvelun arkkitehtuuri

Alla oleva kuva esittää aikapalveluiden toimintaa toimialueen sisällä:

domain

Hilpeä kuva, paljon nuolia. Periaate kuitenkin on seuraava:

  • Työasemat ja member serverit toimialueella hakevat kellonsa miltä hyvänsä saman toimialueen DC:ltä. Siis nimenomaan omalta toimialueeltaan, ei esim. ylemmältä (jos semmoinen on)
  • Toimialueen DC hakee kellonsa joko saman toimialueen PDC-emulaattorin omaavalta DC:ltä, tai ylemmän toimialueen DC:ltä.
  • Ylimmän toimialueen DC:t hakevat kellonsa saman toimialueen PDC-emulaattorilta.
  • PDC-emulaattorin roolissa oleva ylimmän toimialueen DC hakee kellonsa sitten mistä hakee - joko ylläpitää sitä paikallisesti, tai hakee aikareferenssinsä NTP-palvelun avulla esim. internetin julkisista aikapalveluista.

Yllä olevan mukaan mennään oletuksena, sikäli kun muuta ei ole erikseen konfiguroitu. Kun uusi toimialue pystytetään tyhjästä, ylimmän toimialueen PDC-emulaattori on aikalähde koko toimialueelle, ja se (oletuksena) elää oman kellonsa varassa - aika ei siis toimialueella ole välttämättä oikein (ts. synkronissa muun maailman kanssa), mutta se on kaikkien koneiden välillä sama (joka on erinomaisen tärkeää esim. Kerberos-tikettien kannalta).

Todellisuudessa homman toimivuutta voi säätää - ylin toimialueen auktoriteetti aikapalveluiden suhteen on RTS, Reliable Time Source. RTS:n voi asettaa erikseen jos ei yllä kuvattuun automatiikkaan ole luottaminen. Toimialueen jäsenet ja DC:t käyvät läpi tietyn valintaprosessin löytääkseen RTS:n (joka on sen verran pitkä, etten sitä lähde tässä kuvaamaan). Yleisesti ottaen toimialueen sisällä aikasynkronointi tapahtuu kuten edellä kuvattu on.

Sivumennen - on mahdollista että kone käyttää erillistä NTP-asiakasohjelmistoa jolloin w32time -palvelua ei ole startattu ollenkaan, eivätkä alla mainitut komennot toimi. Mielenkiintoisena sivujuontena esimerkiksi Windows 7-työasemat sisältävät kelloappletissa mahdollisuuden käyttää internet-kelloa - ja tämä onkin erillinen NTP-asiakas. W32time -palvelu käynnistyy vasta jos em. työasema liitetään toimialueeseen.

Palvelut ja komennot

Lyhyesti:

  • Windowsin aikapalvelusta huolehtiva palvelu (service) on w32time
  • Komento jolla em. palvelua säädetään, on w32tm

No miten tätä sitten säädetään? Ja missä tilanteissa?

Ensimmäisenä tulee sisäistää, että loppujen lopuksi Windows itse päättää, mistä kello järjestelmälle otetaan. Jos olet "pakottavinasi" aikalähteeksi ulkoisen NTP-palvelimen, mutta siihen ei saada yhteyttä, Windows ottaa kellonsa paikalliselta RTC:ltä (Real Time Clock, koneen sisäinen rautakello). Komento jolla nähdään käytettävä kellolähde on

w32tm /query /status
C:\Users\crescom>w32tm /query /status
Leap Indicator: 0(no warning)
Stratum: 5 (secondary reference - syncd by (S)NTP)
Precision: -6 (15.625ms per tick)
Root Delay: 0.0950470s
Root Dispersion: 0.2711888s
ReferenceId: 0x0AE11FD0 (source IP:  123.123.123.123)
Last Successful Sync Time: 19.2.2015 1:27:24
Source: DC.domain.com
Poll Interval: 14 (16384s)

Kiintoisa osuus on "Source"-kenttä, joka kertoo meille sen mistä Windows on päättänyt yrittää kellonsa hakea. Jos jotain NTP-säätöjä on tehty, ja Sourcen kohdalla lukee "Local CMOS Clock", jokin on melkolailla säädöissä pielessä, ja Windows käyttää RTC-kelloa. Ylläolevassa esimerkissä kone on toimialueen kellon varassa, ja Windows on valinnut kellolähteeksi yhden toimialueen DC:eistä. Toinen kiinnostava asia on "Last Successful Sync Time", joka kertoo onko kello todellakin saatu synkattua aikalähteeseen, ja milloin viimeinen synkronisaatio on tapahtunut.

Jos koneeseen on onnistuneesti asetettu aikalähteeksi aito NTP jostain päin internettiä, näyttää komento seuraavanlaisen tuloksen:

C:\Users\Administrator>w32tm /query /status
Leap Indicator: 0(no warning)
Stratum: 2 (secondary reference - syncd by (S)NTP)
Precision: -6 (15.625ms per tick)
Root Delay: 0.0312500s
Root Dispersion: 0.0259890s
ReferenceId: 0x3EED56EE (source IP:  62.237.86.238)
Last Successful Sync Time: 2/19/2015 1:32:03 AM
Source: pool.ntp.org,0x8
Poll Interval: 10 (1024s)

Source-kohdassa kannattaa huomata mielenkiintoinen lisä - palvelimen nimen perässä on heksadesimaalinumero. Numero on syötetty /manualpeerlist -option mukana. Numero valitaan seuraavan taulukon mukaisesti.

  • 0x01 SpecialInterval (tällä osoitetaan että Windows ei saa käyttää ns. kelluvaa synkronisointi-intervallia, vaan kello on haettava tasaisin väliajoin)
  • 0x02 UseAsFallbackOnly (osoittaa että kyseistä entryä peerlistissä käytetään vain jos jokin muu ei vastaa)
  • 0x04 SymmetricActive (osoittaa että tälle entrylle voidaan myös tarjota aikaa paikalliselta koneelta, kaksisuuntainen synkronisointi, ei voida käyttää option 0x02 kanssa)
  • 0x08 Client (osoittaa että paikallinen kone on asiakas tälle entrylle)

Yleisimmin käytettävät optiot ovat 0x08 ja 0x09 - ensimmäinen kertoo että ollaan asiakas, toinen kertoo että ollaan asiakas ja synkataan tiukasti tietyn aikataulun mukaan.

Valinta toimialueen kellon ja ulkoisen NTP:n välillä

Tärkein yksittäinen optio w32tm-komennossa on /syncfromflags. Pääasiallisesti käytämme kahta eri optiota:

  • /syncfromflags:DOMHIER
  • /syncfromflags:MANUAL

DOMHIER kertoo koneelle, että aikasynkronisaatio tulisi hakea toimialueen kellosta. Vaikka /manualpeerlist -optiolla olisi syötetty kuinka monta internetin NTP-palvelinta, jos DOMHIER on valittuna (ja DC:t vastaavat), NTP-aikalähteitä ei käytetä.

MANUAL kertoo koneelle että ensisijaisesti kello pitäisi hakea jostakin /manualpeerlist-optiolla syötetystä NTP-aikalähteestä. Jos NTP-palvelinta ei löydy, kone valitsee kelloksi paikallisen RTC:n.

Jos kone siis on osana toimialuetta (member server tai työasema), ja se halutaan pakottaa käyttämään toimialueen aikalähteitä, riittää kun koneelle sanotaan

w32tm /config /syncfromflags:DOMHIER
net stop w32time
net start w32time

Jos kone on toimialueen ylin aikalähde - esimerkiksi se ylimmän domainin PDC-emulaattori, täytyy aika ottaa jostain muualta, sillä ylempiä aikalähteitä ei ole enää toimialueella tarjolla. Tämä puolestaan käy käyttämällä MANUAL-optiota:

w32tm /config /manualpeerlist:pool.ntp.org,0x8 /syncfromflags:MANUAL
net stop w32time
net start w32time

Edellä myös huomataan, että aikapalvelu (w32time) täytyy uudelleenkäynnistää jotta asetukset tulisivat voimaan. Esimerkissä on aikapalvelimeksi syötetty pool.ntp.org, joka on round-robin tyyppinen aikapalvelun nimi - jos koneelta on NTP:llä pääsy internettiin, pool.ntp.org melko varmasti toimii. Jos koneelta ei pääsyä internettiin ole, pitää NTP-palvelimeksi luonnollisesti valita sellainen palvelin johon kone pääsee käsiksi.

Jos testaamisessa halutaan pakottaa Windows synkronoimaan kellonsa mahdollisimman nopeasti, voidaan synkronisaatio laukaista liikkelle komennolla

w32tm /resync

...ja tämän jälkeen kysellä w32tm /query /status -komennolla kuinka hommassa kävi.

Caveat Emptor

Joskus on havaittu, että tiettyjen koneiden kellot edistävät, ja vaikka aikalähde on valittu oikein ja se on toimiva, kellopa ei tunnu silti ajassa pysyvän. Tälle on löytynyt selitys - ongelma koskee yleensä Oracle-palvelimia joille on tietyn Oraclen oman ohjeen mukaan tehty hippasen rekisterisäätöjä. Rekisteriavaimen HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config alla on parametri MaxNegPhaseCorrection joka on saatettu säätää arvoon nolla.

Tästä seuraa ettei Windows koskaan kykene korjaamaan kelloaan taaksepäin, ja jos kello vähänkään edistää, se sitten edistää pitkällä aikavälillä paljon kun taaksepäin ei voi säätää. Suosittelemme arvoksi 300 (desimaaliarvo). Kun arvoa on muutettu, pitää w32time-palvelu uudelleenkäynnistää.

Lisätietoa

Technetissä on pari melko onnistunutta sivua, jotka kuvaavat aikapalvelun toimintaa ja avittavat komentojen ymmärtämisessä:

P.S. Missä mun PDC-emulaattorirooli on?

Avaat sen CMD:n ja takutat että:

C:\> netdom query fsmo

Schema master               DC.domain.local
Domain naming master        DC.domain.local
PDC                         DC.domain.local
RID pool manager            DC.domain.local
Infrastructure master       DC.domain.local

The command completed successfully.