Linux-aikasynkronointi: NTP, Chrony ja systemd-timesyncd

Linux-aikasynkronointi: NTP, Chrony ja systemd-timesyncd
Useimmat ihmiset seuraavat aikaa. Nousemme ajoissa suorittaaksemme aamurituaalimme ja menemme töihin, pidämme lounastauon, noudatamme projektin määräaikoja, juhlimme syntymäpäiviä ja lomapäiviä, nousemme lentokoneeseen ja niin edelleen.

Lisäksi: jotkut meistä ovat pakkomielle ajasta. Kelloni toimii aurinkoenergialla ja saa tarkan ajan National Institute of Standards and Technologylta (NIST) Fort Collinsiin, Coloradoon pitkäaaltoradion kautta wwvb. Aikasignaalit synkronoidaan atomikellon kanssa, joka sijaitsee myös Fort Collinsissa. Fitbit synkronoidaan puhelimeni kanssa, joka synkronoi palvelimen kanssa NTP, joka lopulta synkronoituu atomikellon kanssa.

Laitteet seuraavat myös aikaa

On monia syitä, miksi laitteemme ja tietokoneemme tarvitsevat tarkan ajan. Esimerkiksi pankkitoiminnassa, osakemarkkinoilla ja muissa rahoitusalan liiketoimissa liiketoimet on suoritettava oikeassa järjestyksessä, ja tarkat aikajaksot ovat tässä kriittisiä.

Puhelimemme, tablettimme, automme, GPS-järjestelmämme ja tietokoneemme edellyttävät tarkat aika- ja päivämääräasetukset. Haluan, että tietokoneeni työpöydällä oleva kello näyttää oikeaa aikaa. Haluan, että muistutukset näkyvät paikallisessa kalenterissani oikeaan aikaan. Oikea aika varmistaa myös, että cron- ja systemd-työt suoritetaan oikeaan aikaan.

Päivämäärä ja aika ovat myös tärkeitä kirjaamisen kannalta, joten tiettyjen lokien löytäminen päivämäärän ja kellonajan perusteella on hieman helpompaa. Esimerkiksi työskentelin kerran DevOpsissa (sitä ei tuolloin kutsuttu) ja olin perustamassa sähköpostijärjestelmää Pohjois-Carolinan osavaltioon. Käsittelimme yli 20 miljoonaa sähköpostia päivässä. Sähköpostin seuraaminen useiden palvelimien kautta tai tapahtumien tarkan järjestyksen määrittäminen lokitiedostojen avulla maantieteellisesti hajallaan olevilla isännillä voi olla paljon helpompaa, jos vastaavat tietokoneet synkronoidaan ajoissa.

Kerran - monta tuntia

Linux-isäntien on otettava huomioon, että on olemassa järjestelmäaika ja RTC-aika. RTC (Real Time Clock) on hieman outo ja ei kovin tarkka nimi laitteistokellolle.

Laitteistokello toimii jatkuvasti, vaikka tietokone olisi sammutettu, järjestelmän emolevyn akun avulla. RTC:n päätehtävä on tallentaa aikaa, kun yhteyttä aikapalvelimeen ei ole saatavilla. Niinä päivinä, jolloin Internetin kautta oli mahdotonta muodostaa yhteyttä aikapalvelimeen, jokaisessa tietokoneessa oli oltava tarkka sisäinen kello. Käyttöjärjestelmien oli päästävä RTC:hen käynnistyksen yhteydessä, ja käyttäjän oli asetettava järjestelmän aika manuaalisesti BIOS-laitteiston konfigurointirajapinnan avulla varmistaakseen, että se oli oikein.

Laitteistokellot eivät ymmärrä aikavyöhykkeiden käsitettä; RTC tallentaa vain ajan, ei aikavyöhykettä tai poikkeamaa UTC:stä (Coordinated Universal Time, joka tunnetaan myös nimellä GMT tai Greenwichin aika). Voit asentaa RTC:n työkalulla, jota käsittelen myöhemmin tässä artikkelissa.

Järjestelmän aika on aika, jonka käyttöjärjestelmä näyttää työpöydän GUI-kellossa, päivämääräkomennon tulosteessa, lokien aikaleimoissa. Tämä koskee myös tiedostojen luomista, muokkaamista ja avaamista.

Sivulla mies rtc:lle siellä on täydellinen kuvaus RTC:stä ja järjestelmän kellosta.

Mitä NTP:lle kuuluu?

Tietokoneet kaikkialla maailmassa käyttävät NTP-protokollaa (Network Time Protocol) synkronoidakseen aikansa tavallisten viitekellojen kanssa Internetissä käyttämällä NTP-palvelimien hierarkiaa. Pääaikapalvelimet ovat kerroksessa 1 ja ne ovat suoraan yhteydessä eri kansallisiin aikapalveluihin kerroksessa 0 satelliitin, radion tai jopa puhelinlinjojen kautta modeemien kautta. Layer 0 -aikapalvelut voivat olla atomikello, radiovastaanotin, joka on viritetty atomikellojen lähettämiin signaaleihin, tai GPS-vastaanotin, joka käyttää erittäin tarkkoja GPS-satelliittien lähettämiä kellosignaaleja.

Suurimmalla osalla referenssipalvelimista on useita tuhansia julkisia NTP stratum 2 -palvelimia, jotka ovat avoinna yleisölle. Monet organisaatiot ja käyttäjät (mukaan lukien minä), joilla on paljon isäntiä ja jotka tarvitsevat NTP-palvelimen, päättävät perustaa omat aikapalvelimensa, jotta vain yksi paikallinen isäntä pääsee osuuteen 2 tai 3. Sitten he määrittävät verkon loput solmut käyttämään paikallista aikapalvelin. Kotiverkon tapauksessa tämä on kerroksen 3 palvelin.

Erilaisia ​​NTP-toteutuksia

NTP:n alkuperäinen toteutus on ntpd. Sitten siihen liittyi kaksi uudempaa, chronyd ja systemd-timesyncd. Kaikki kolme synkronoivat paikallisen isäntäajan NTP-aikapalvelimen kanssa. Systemd-timesyncd-palvelu ei ole yhtä luotettava kuin chronyd, mutta se on riittävän hyvä useimpiin tarkoituksiin. Jos RTC ei ole synkronoitu, se voi vähitellen säätää järjestelmän aikaa synkronoitumaan NTP-palvelimen kanssa, kun paikallinen järjestelmäaika poikkeaa hieman. Systemd-timesync-palvelua ei voi käyttää aikapalvelimena.

Chrony on NTP:n toteutus, joka sisältää kaksi ohjelmaa: chronyd-daemonin ja chronyc-nimisen komentoriviliittymän. Chronylla on joitain ominaisuuksia, jotka ovat välttämättömiä monissa tapauksissa:

  • Chrony voi synkronoida aikapalvelimen kanssa paljon nopeammin kuin vanha ntpd-palvelu. Tämä sopii kannettaville tietokoneille tai pöytätietokoneille, jotka eivät toimi koko ajan.
  • Se voi kompensoida kellonvaihtelut, kuten kun isäntä menee lepotilaan tai siirtyy lepotilaan, tai kun kello muuttuu taajuushyppelyn vuoksi, mikä hidastaa kelloja alhaisilla kuormilla.
  • Se ratkaisee epävakaaseen verkkoyhteyteen tai verkon ruuhkautumiseen liittyvät aikaongelmat.
  • Se säätelee verkon viiveitä.
  • Ensimmäisen ajan synkronoinnin jälkeen Chrony ei koskaan pysäytä kelloa. Tämä tarjoaa vakaat ja yhdenmukaiset aikavälit monille järjestelmäpalveluille ja sovelluksille.
  • Chrony voi toimia myös ilman verkkoyhteyttä. Tässä tapauksessa paikallinen isäntä tai palvelin voidaan päivittää manuaalisesti.
  • Chrony voi toimia NTP-palvelimena.

Jälleen kerran, NTP on protokolla, joka voidaan toteuttaa Linux-isäntäkoneella Chronyn tai systemd-timesyncdin avulla.

NTP-, Chrony- ja systemd-timesyncd RPM:t ovat saatavilla tavallisissa Fedoran arkistoissa. systemd-udev RPM on ytimen tapahtumien hallinta, joka asennetaan oletuksena Fedoraan, mutta se on valinnainen.

Voit asentaa kaikki kolme ja vaihtaa niiden välillä, mutta tämä aiheuttaa ylimääräistä päänsärkyä. Joten on parempi olla tekemättä. Fedoran, CentOS:n ja RHEL:n nykyaikaiset julkaisut ovat siirtyneet Chronyyn oletustoteutukseksi, ja niissä on myös systemd-timesyncd. Mielestäni Chrony toimii hyvin, tarjoaa paremman käyttöliittymän kuin NTP-palvelu, tarjoaa paljon enemmän tietoa ja hallintaa, mistä järjestelmänvalvojat varmasti nauttivat.

NTP-palvelujen poistaminen käytöstä

NTP-palvelu saattaa olla jo käynnissä isännässäsi. Jos näin on, sinun on poistettava se käytöstä ennen kuin vaihdat johonkin muuhun. Chronyd oli käynnissä, joten käytin seuraavia komentoja sen pysäyttämiseen ja poistamiseen. Suorita asianmukaiset komennot mille tahansa NTP-daemonille, jota käytät isännässäsi:

[root@testvm1 ~]# systemctl disable chronyd ; systemctl stop chronyd
Removed /etc/systemd/system/multi-user.target.wants/chronyd.service.
[root@testvm1 ~]#

Tarkista, että palvelu on pysäytetty ja poistettu käytöstä:

[root@testvm1 ~]# systemctl status chronyd
● chronyd.service - NTP client/server
     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:chronyd(8)
             man:chrony.conf(5)
[root@testvm1 ~]#

Tilatarkistus ennen käynnistystä

Järjestelmän kellon synkronointitilan avulla voit määrittää, onko NTP-palvelu käynnissä. Koska et ole vielä käynnistänyt NTP:tä, timeync-status-komento vihjaa tähän:

[root@testvm1 ~]# timedatectl timesync-status
Failed to query server: Could not activate remote peer.

Suora tilapyyntö antaa tärkeitä tietoja. Esimerkiksi timedatectl-komento ilman argumenttia tai vaihtoehtoja suorittaa status-alikomennon oletusarvoisesti:

[root@testvm1 ~]# timedatectl status
           Local time: Fri 2020-05-15 08:43:10 EDT  
           Universal time: Fri 2020-05-15 12:43:10 UTC  
                 RTC time: Fri 2020-05-15 08:43:08      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: no                          
              NTP service: inactive                    
          RTC in local TZ: yes                    

Warning: The system is configured to read the RTC time in the local time zone.
         This mode cannot be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.
[root@testvm1 ~]#

Tämä antaa sinulle isännän paikallisen ajan, UTC-ajan ja RTC-ajan. Tässä tapauksessa järjestelmän aika asetetaan Amerikan / New_Yorkin (TZ) aikavyöhykkeelle, RTC on asetettu paikallisen aikavyöhykkeen kellonaikaan, eikä NTP-palvelu ole aktiivinen. RTC-aika on alkanut hieman poiketa järjestelmäajasta. Tämä on normaalia järjestelmissä, joiden kelloja ei ole synkronoitu. Isännän siirtymän määrä riippuu ajasta, joka on kulunut järjestelmän viimeisestä synkronoinnista.

Saimme myös varoituksen paikallisen ajan käytöstä RTC:ssä - tämä koskee aikavyöhykemuutoksia ja kesäajan asetuksia. Jos tietokone sammutetaan, kun muutoksia on tehtävä, RTC ei muutu. Mutta palvelimille tai muille kellon ympäri toimiville koneille tämä ei ole ongelma ollenkaan. Lisäksi mikä tahansa palvelu, joka tarjoaa NTP-ajan synkronoinnin, säätää isännän aikaa alkukäynnistysvaiheessa, joten aika on jälleen oikea käynnistyksen jälkeen.

Aikavyöhykkeen asettaminen

Yleensä määrität aikavyöhykkeen asennuksen aikana, eikä sinun tarvitse muuttaa sitä myöhemmin. Joskus aikavyöhykettä on kuitenkin vaihdettava. On olemassa useita työkaluja, jotka voivat auttaa. Linux käyttää aikavyöhyketiedostoja määrittääkseen isännän paikallisen aikavyöhykkeen. Nämä tiedostot ovat hakemistossa /usr/share/zoneinfo. Oletuksena aikavyöhykkeelleni järjestelmä määrää tämän: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Mutta sinun ei tarvitse tietää tällaisia ​​hienouksia muuttaaksesi aikavyöhykettä.

Tärkeintä on tietää sijaintisi virallinen aikavyöhykkeen nimi ja vastaava komento. Oletetaan, että haluat muuttaa aikavyöhykkeeksi Los Angeles:


[root@testvm2 ~]# timedatectl list-timezones | column
<SNIP>
America/La_Paz                  Europe/Budapest
America/Lima                    Europe/Chisinau
America/Los_Angeles             Europe/Copenhagen
America/Maceio                  Europe/Dublin
America/Managua                 Europe/Gibraltar
America/Manaus                  Europe/Helsinki
<SNIP>

Nyt voit asettaa aikavyöhykkeen. Käytin päivämäärä-komentoa muutosten tarkistamiseen, mutta voit myös käyttää timedatectl-komentoa:

[root@testvm2 ~]# date
Tue 19 May 2020 04:47:49 PM EDT
[root@testvm2 ~]# timedatectl set-timezone America/Los_Angeles
[root@testvm2 ~]# date
Tue 19 May 2020 01:48:23 PM PDT
[root@testvm2 ~]#

Nyt voit vaihtaa isäntäsi aikavyöhykkeen takaisin paikalliseen aikaan.

systemd-timesyncd

Systemd timeync -daemon tarjoaa NTP-toteutuksen, jota on helppo hallita systemd-kontekstissa. Se on oletuksena asennettu Fedoraan ja Ubuntuun. Se käynnistyy kuitenkin oletuksena vain Ubuntussa. En ole varma muista jakeluista. Voit tarkistaa itse:

[root@testvm1 ~]# systemctl status systemd-timesyncd

Määritetään systemd-timesyncd

Systemd-timesyncd-määritystiedosto on /etc/systemd/timesyncd.conf. Tämä on yksinkertainen tiedosto, jossa on vähemmän vaihtoehtoja käytössä kuin vanhat NTP- ja chronyd-palvelut. Tässä on tämän tiedoston sisältö (ilman muita muutoksia) Fedora VM:ssäni:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org 2.fedora.pool.ntp.org 3.fedora.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

Ainoa osio, joka siinä on kommenttien lisäksi, on [Aika]. Kaikki muut rivit on kommentoitu. Nämä ovat oletusarvoja, eikä niitä tule muuttaa (ellei sinulla ole syytä). Jos sinulla ei ole NTP=-rivillä määritettyä NTP-aikapalvelinta, Fedora käyttää oletuksena Fedoran vara-aikapalvelinta. Lisään yleensä aikapalvelimeni:

NTP=myntpserver

Ajansynkronointi käynnissä

Voit käynnistää ja aktivoida systemd-timesyncd:n seuraavasti:

[root@testvm2 ~]# systemctl enable systemd-timesyncd.service
Created symlink /etc/systemd/system/dbus-org.freedesktop.timesync1.service → /usr/lib/systemd/system/systemd-timesyncd.service.
Created symlink /etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service → /usr/lib/systemd/system/systemd-timesyncd.service.
[root@testvm2 ~]# systemctl start systemd-timesyncd.service
[root@testvm2 ~]#

Laitteistokellon asettaminen

Tältä tilanne näyttää timesyncd:n suorittamisen jälkeen:

[root@testvm2 systemd]# timedatectl
               Local time: Sat 2020-05-16 14:34:54 EDT  
           Universal time: Sat 2020-05-16 18:34:54 UTC  
                 RTC time: Sat 2020-05-16 14:34:53      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: no    

Aluksi ero RTC:n ja paikallisen ajan (EDT) välillä on alle sekunti, ja ero kasvaa vielä pari sekuntia seuraavien päivien aikana. Koska RTC:ssä ei ole aikavyöhykkeiden käsitettä, timedatectl-komennon on suoritettava vertailu oikean aikavyöhykkeen määrittämiseksi. Jos RTC-aika ei täsmälleen vastaa paikallista aikaa, se ei myöskään vastaa paikallista aikavyöhykettä.

Etsin lisätietoja, tarkistin systemd-timesyncin tilan ja löysin tämän:

[root@testvm2 systemd]# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2020-05-16 13:56:53 EDT; 18h ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 822 (systemd-timesyn)
     Status: "Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org)."
      Tasks: 2 (limit: 10365)
     Memory: 2.8M
        CPU: 476ms
     CGroup: /system.slice/systemd-timesyncd.service
             └─822 /usr/lib/systemd/systemd-timesyncd

May 16 09:57:24 testvm2.both.org systemd[1]: Starting Network Time Synchronization...
May 16 09:57:24 testvm2.both.org systemd-timesyncd[822]: System clock time unset or jumped backwards, restoring from recorded timestamp: Sat 2020-05-16 13:56:53 EDT
May 16 13:56:53 testvm2.both.org systemd[1]: Started Network Time Synchronization.
May 16 13:57:56 testvm2.both.org systemd-timesyncd[822]: Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org).
[root@testvm2 systemd]#

Huomaa lokiviesti, jonka mukaan järjestelmän aikaa ei ole asetettu tai se on nollattu. Timesync-palvelu asettaa järjestelmän ajan aikaleiman perusteella. Timesync-daemon ylläpitää aikaleimoja, ja ne luodaan jokaisen onnistuneen synkronoinnin yhteydessä.

Timedatectl-komennolla ei ole mitään keinoa ottaa laitteiston kellon arvoa järjestelmän kellosta. Se voi asettaa vain ajan ja päivämäärän komentoriville syötetystä arvosta. Voit asettaa RTC:n samaan arvoon kuin järjestelmän aika käyttämällä hwclock-komentoa:

[root@testvm2 ~]# /sbin/hwclock --systohc --localtime
[root@testvm2 ~]# timedatectl
               Local time: Mon 2020-05-18 13:56:46 EDT  
           Universal time: Mon 2020-05-18 17:56:46 UTC  
                 RTC time: Mon 2020-05-18 13:56:46      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: yes

Vaihtoehto --localtime käskee laitteiston kellon näyttämään paikallista aikaa, ei UTC-aikaa.

Miksi ylipäätään tarvitset RTC:tä?

Mikä tahansa NTP:n toteutus asettaa järjestelmän kellon käynnistyshetkellä. Ja miksi sitten RTC? Tämä ei ole täysin totta: tämä tapahtuu vain, jos sinulla on verkkoyhteys aikapalvelimeen. Monilla järjestelmillä ei kuitenkaan aina ole pääsyä verkkoon, joten laitteistokello on hyödyllinen Linuxille järjestelmän ajan asettamiseen. Tämä on parempi kuin ajan asettaminen manuaalisesti, vaikka se saattaa poiketa reaaliajasta.

Johtopäätös

Tässä artikkelissa on tarkasteltu joitain työkaluja päivämäärän, ajan ja aikavyöhykkeiden muokkaamiseen. Systemd-timesyncd-työkalu tarjoaa NTP-asiakkaan, joka voi synkronoida paikallisen isäntälaitteen ajan NTP-palvelimen kanssa. Systemd-timesyncd ei kuitenkaan tarjoa palvelinpalvelua, joten jos tarvitset NTP-palvelimen verkkoosi, sinun on käytettävä jotain muuta, kuten Chrony-palvelinta, toimimaan palvelimena.

Pidän parempana yhden toteutuksen jokaiselle verkkoni palvelulle, joten käytän Chronyä. Jos et tarvitse paikallista NTP-palvelinta tai jos et halua käyttää Chronya palvelimena ja systemd-timesyncd:tä SNTP-asiakkaana. Loppujen lopuksi Chronyn lisäominaisuuksia ei tarvitse käyttää asiakkaana, jos olet tyytyväinen systemd-timesyncd:n toimivuuteen.

Toinen huomautus: sinun ei tarvitse käyttää systemd-työkaluja NTP:n toteuttamiseen. Voit käyttää ntpd:n, Chronyn tai muun NTP-toteutuksen vanhempaa versiota. Loppujen lopuksi systemd koostuu suuresta määrästä palveluita; monet niistä ovat valinnaisia, joten voit sammuttaa ne ja käyttää jotain muuta tilalle. Tämä ei ole valtava monoliittinen hirviö. Et ehkä pidä järjestelmästä tai sen osista, mutta sinun tulee tehdä tietoinen päätös.

Pidän systemdin NTP:n toteutuksesta, mutta pidän enemmän Chronysta, koska se sopii tarpeisiini paremmin. Se on Linux, kulta -)

Mainonnan oikeuksista

VDSina tarjoaa palvelimia mihin tahansa tehtävään, valtava valikoima käyttöjärjestelmiä automaattista asennusta varten, on mahdollista asentaa mikä tahansa käyttöjärjestelmä omasta ISO, mukava ohjauspaneeli oma kehitys ja päivittäinen maksu. Muista, että meillä on ikuisia palvelimia, jotka ovat ehdottomasti ajattomia 😉

Linux-aikasynkronointi: NTP, Chrony ja systemd-timesyncd

Lähde: will.com

Lisää kommentti