Linuxi aja sünkroonimine: NTP, Chrony ja systemd-timesyncd

Linuxi aja sünkroonimine: NTP, Chrony ja systemd-timesyncd
Enamik inimesi jälgib aega. Tõuseme õigel ajal üles, et lõpetada oma hommikused rituaalid ja minna tööle, teha lõunapausi, pidada kinni projekti tähtaegadest, tähistada sünnipäevi ja pühi, istuda lennukisse jne.

Veelgi enam: mõned meist on aja kinnisideeks. Minu kell töötab päikeseenergial ja saab täpset aega riiklikult standardite ja tehnoloogia instituudilt (NIST) Colorado osariiki Fort Collinsi pikalaineraadio kaudu WWVB. Ajasignaalid sünkroniseeritakse aatomkellaga, mis asub samuti Fort Collinsis. Minu Fitbit sünkroonib minu telefoniga, mis sünkroonib serveriga NTP, mis lõpuks sünkroniseerub aatomkellaga.

Ka seadmed jälgivad aega

Põhjuseid, miks meie seadmed ja arvutid täpset aega vajavad, on palju. Näiteks panganduses, aktsiaturgudel ja muudes finantsärides peavad tehingud toimuma õiges järjekorras ning täpsed ajajärjestused on selle jaoks üliolulised.

Meie telefonid, tahvelarvutid, autod, GPS-süsteemid ja arvutid nõuavad täpset kellaaja ja kuupäeva seadistust. Ma tahan, et minu arvuti töölaual olev kell näitaks õiget aega. Ma tahan, et meeldetuletused ilmuksid mu kohalikku kalendrisse õigel ajal. Õige kellaaeg tagab ka selle, et cron ja systemd tööd töötavad õigel ajal.

Logimisel on olulised ka kuupäev ja kellaaeg, seega on teatud logide leidmine kuupäeva ja kellaaja järgi veidi lihtsam. Näiteks töötasin kunagi DevOpsis (sel ajal seda nii ei kutsutud) ja loosin Põhja-Carolina osariigis meilisüsteemi. Töötlesime varem üle 20 miljoni meili päevas. E-kirjade jälgimine serverite seeria kaudu või sündmuste täpse jada kindlaksmääramine geograafiliselt hajutatud hostide logifailide abil võib olla palju lihtsam, kui vastavad arvutid on õigeaegselt sünkroonitud.

Üks kord - mitu tundi

Linuxi hostid peavad arvestama, et on olemas süsteemiaeg ja RTC aeg. RTC (Real Time Clock) on pisut kummaline ja mitte väga täpne nimi riistvaralisele kellale.

Riistvarakell töötab süsteemi emaplaadi akut kasutades pidevalt isegi siis, kui arvuti on välja lülitatud. RTC põhifunktsioon on aja salvestamine, kui ühendus ajaserveriga pole saadaval. Ajal, mil Interneti kaudu ei olnud võimalik ajaserveriga ühendust luua, pidi igal arvutil olema täpne sisemine kell. Operatsioonisüsteemid pidid alglaadimise ajal pääsema juurde RTC-le ja kasutaja pidi BIOS-i riistvara konfiguratsiooniliidese abil käsitsi süsteemi aja määrama, et veenduda selle õigsuses.

Riistvarakellad ei mõista ajavööndite mõistet; RTC salvestab ainult kellaaega, mitte ajavööndit ega nihet UTC-st (koordineeritud universaalaeg, tuntud ka kui GMT või Greenwichi aeg). RTC saate installida tööriista abil, mida käsitlen hiljem selles artiklis.

Süsteemi aeg on aeg, mille OS kuvab teie töölaual GUI kellas, kuupäevakäsu väljundis ja logide ajatemplites. See kehtib ka failide loomise, muutmise ja avamise kohta.

Lehel mees rtc eest seal on RTC ja süsteemi kella täielik kirjeldus.

Mis on NTP-ga?

Arvutid üle kogu maailma kasutavad NTP-d (Network Time Protocol) oma aja sünkroonimiseks standardsete võrdluskelladega Interneti kaudu, kasutades NTP-serverite hierarhiat. Peamised ajaserverid asuvad 1. kihis ja need on otse ühendatud erinevate riiklike ajateenustega 0-kihis satelliidi, raadio või isegi modemite kaudu telefoniliinide kaudu. Layer 0 ajateenused võivad olla aatomkell, raadiovastuvõtja, mis on häälestatud aatomkellade edastatavatele signaalidele, või GPS-vastuvõtja, mis kasutab GPS-satelliitide edastatud ülitäpseid kellasignaale.

Enamikul võrdlusserveritest on mitu tuhat avalikku NTP stratum 2 serverit, mis on avalikkusele avatud. Paljud organisatsioonid ja kasutajad (kaasa arvatud mina), kellel on palju hoste ja kes vajavad NTP-serverit, otsustavad seadistada oma ajaserverid, nii et ainult üks kohalik host pääseb kihile 2 või 3 juurde. Seejärel konfigureerivad nad ülejäänud võrgusõlmed kasutama kohalikku ajaserver. Minu koduvõrgu puhul on see 3. kihi server.

Erinevad NTP rakendused

NTP algne rakendus on ntpd. Seejärel liitusid sellega kaks uuemat, chronyd ja systemd-timesyncd. Kõik kolm sünkroonivad kohaliku hosti aja NTP-ajaserveriga. Systemd-timesyncd teenus ei ole nii usaldusväärne kui chronyd, kuid see on enamiku eesmärkide jaoks piisavalt hea. Kui RTC on sünkroonist väljas, saab see järk-järgult kohandada süsteemi aega NTP-serveriga sünkroonimiseks, kui kohaliku süsteemi aeg veidi triivib. Teenust systemd-timesync ei saa ajaserverina kasutada.

Chrony on NTP rakendus, mis sisaldab kahte programmi: chronyd deemon ja käsurea liides nimega chronyc. Chronyl on mõned funktsioonid, mis on paljudel juhtudel asendamatud:

  • Chrony suudab ajaserveriga sünkroonida palju kiiremini kui vana ntpd-teenus. See sobib hästi sülearvutitele või lauaarvutitele, mis kogu aeg ei tööta.
  • See võib kompenseerida kella kõikumisi, näiteks kui host läheb magama või unerežiimile või kui kell muutub sageduse hüppamise tõttu, mis aeglustab kellasid madalal koormusel.
  • See lahendab ebastabiilse võrguühenduse või võrgu ülekoormusega seotud ajaprobleemid.
  • See reguleerib võrgu viivitusi.
  • Pärast esialgset aja sünkroonimist ei peata Chrony kunagi kella. See tagab paljude süsteemiteenuste ja rakenduste jaoks stabiilsed ja järjepidevad ajavahemikud.
  • Chrony töötab ka ilma võrguühenduseta. Sel juhul saab kohalikku hosti või serverit käsitsi värskendada.
  • Chrony võib toimida NTP-serverina.

Taaskord on NTP protokoll, mida saab Chrony või systemd-timesyncd abil Linuxi hostis rakendada.

NTP, Chrony ja systemd-timesyncd RPM-id on saadaval standardsetes Fedora hoidlates. Systemd-udev RPM on kerneli sündmuste haldur, mis on Fedorasse vaikimisi installitud, kuid on valikuline.

Saate installida kõik kolm ja nende vahel vahetada, kuid see tekitab täiendavat peavalu. Nii et parem on mitte. Fedora, CentOS-i ja RHELi kaasaegsed väljaanded on vaikerakenduseks kolinud Chronysse ja neil on ka systemd-timesyncd. Leian, et Chrony töötab hästi, pakub paremat liidest kui NTP-teenus, pakub palju rohkem teavet ja kontrolli, mida süsteemiadministraatorid kindlasti naudivad.

NTP-teenuste keelamine

NTP-teenus võib teie hostis juba töötada. Kui jah, peate selle enne millegi muule üleminekut keelama. Mul oli chronyd töös, nii et kasutasin selle peatamiseks ja keelamiseks järgmisi käske. Käivitage vastavad käsud mis tahes NTP-deemoni jaoks, mida oma hostis kasutate:

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

Kontrollige, kas teenus on peatatud ja keelatud:

[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 ~]#

Oleku kontroll enne käivitamist

Süsteemi kella sünkroonimise olek võimaldab teil määrata, kas NTP-teenus töötab. Kuna te pole veel NTP-d käivitanud, vihjab käsk timesync-status sellele:

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

Otsene olekupäring annab olulist teavet. Näiteks käsk timedatectl ilma argumendi või suvanditeta käivitab vaikimisi oleku alamkäsu:

[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 ~]#

See annab teile hosti kohaliku aja, UTC aja ja RTC aja. Sel juhul on süsteemiajaks seatud Ameerika / New_Yorki (TZ) ajavöönd, RTC on seatud kohaliku ajavööndi kellaaega ja NTP-teenus pole aktiivne. RTC aeg on hakanud veidi erinema süsteemiajast. See on normaalne süsteemide puhul, mille kellad pole sünkroonitud. Hosti nihke suurus sõltub ajast, mis on möödunud süsteemi viimasest sünkroonimisest.

Samuti saime hoiatuse kohaliku aja kasutamise kohta RTC jaoks – see kehtib ajavööndi muudatuste ja DST sätete kohta. Kui arvuti lülitatakse välja, kui on vaja muudatusi teha, siis RTC ei muutu. Kuid serverite või muude ööpäevaringselt töötavate hostide puhul pole see probleem. Lisaks kohandavad kõik NTP-aja sünkroonimist pakkuvad teenused algkäivitusfaasis hosti aega, nii et kellaaeg on pärast käivitamise lõpetamist jälle õige.

Ajavööndi määramine

Tavaliselt määrate ajavööndi installimise käigus ja teil pole ülesannet seda hiljem muuta. Siiski on aegu, mil peate ajavööndit muutma. On mitmeid tööriistu, mis võivad aidata. Linux kasutab hosti kohaliku ajavööndi määramiseks ajavööndifaile. Need failid on kataloogis /usr/share/zoneinfo. Vaikimisi näeb süsteem minu ajavööndi jaoks ette järgmist: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Kuid ajavööndi muutmiseks ei pea te selliseid peensusi teadma.

Peaasi on teada oma asukoha ametlikku ajavööndi nime ja vastavat käsku. Oletame, et soovite muuta ajavööndiks 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>

Nüüd saate määrata ajavööndi. Kasutasin muudatuste kontrollimiseks käsku date, kuid võite kasutada ka timedatectl:

[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 ~]#

Nüüd saate oma hosti ajavööndi tagasi kohaliku aja järgi muuta.

systemd-timesyncd

Systemd timesync deemon pakub NTP-rakendust, mida on systemd kontekstis lihtne hallata. See on vaikimisi installitud Fedorasse ja Ubuntu. Kuid see käivitub vaikimisi ainult Ubuntus. Teiste distributsioonide osas ma kindel pole. Saate ise kontrollida:

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

Systemd-timesyncd seadistamine

Systemd-timesyncd konfiguratsioonifail on /etc/systemd/timesyncd.conf. See on lihtne fail, milles on vähem võimalusi lubatud kui vanad NTP ja chronyd teenused. Siin on selle faili sisu (ilma täiendavate muudatusteta) minu Fedora VM-is:

#  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

Ainus jaotis, mis lisaks kommentaaridele sisaldab, on [Aeg]. Kõik ülejäänud read on kommenteeritud. Need on vaikeväärtused ja neid ei tohiks muuta (kui teil pole selleks põhjust). Kui teil pole real NTP= määratletud NTP-ajaserverit, kasutab Fedora vaikimisi Fedora varuajaserverit. Tavaliselt lisan oma ajaserveri:

NTP=myntpserver

Ajasünkroonimine töötab

Saate käivitada ja muuta systemd-timesyncd aktiivseks järgmiselt:

[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 ~]#

Riistvara kella seadistamine

Pärast timesyncd käivitamist näeb olukord välja järgmine:

[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    

Esialgu on erinevus RTC ja kohaliku aja (EDT) vahel alla sekundi ning järgmiste päevade jooksul suureneb lahknevus veel paari sekundi võrra. Kuna RTC-s pole ajavööndite kontseptsiooni, peab timedatectl käsk õige ajavööndi määramiseks tegema võrdluse. Kui RTC aeg ei ühti täpselt kohaliku ajaga, siis ei kattu see ka kohaliku ajavööndiga.

Otsides lisateavet, kontrollisin systemd-timesynci olekut ja leidsin järgmise:

[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]#

Pange tähele logiteadet, mis ütleb, et süsteemi aega pole määratud või see on lähtestatud. Timesynci teenus määrab süsteemi aja ajatempli alusel. Ajatempleid haldab ajasünkroonimise deemon ja need luuakse iga eduka sünkroonimise korral.

Käsk timedatectl ei saa kuidagi süsteemi kellalt riistvara kella väärtust võtta. See saab määrata käsureale sisestatud väärtusest ainult kellaaja ja kuupäeva. Saate seada RTC-ks sama väärtuse kui süsteemiaja, kasutades käsku hwclock:

[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

Valik --localtime käsib riistvarakellal näidata kohalikku aega, mitte UTC aega.

Miks teil RTC-d üldse vaja on?

Mis tahes NTP rakendamine seab käivitusajal süsteemi kella. Ja miks siis RTC? See pole täiesti tõsi: see juhtub ainult siis, kui teil on ajaserveriga võrguühendus. Paljudel süsteemidel pole aga alati juurdepääsu võrguühendusele, nii et riistvarakell on Linuxi jaoks kasulik süsteemiaja määramiseks. See on parem kui kellaaja käsitsi seadistamine, kuigi see võib reaalajas erineda.

Järeldus

See artikkel on läbi vaadanud mõned tööriistad kuupäeva, kellaaja ja ajavöönditega manipuleerimiseks. Systemd-timesyncd tööriist pakub NTP-klienti, mis saab sünkroonida kohaliku hosti aega NTP-serveriga. Systemd-timesyncd aga ei paku serveriteenust, nii et kui vajate oma võrgus NTP-serverit, peate serverina kasutama midagi muud, näiteks Chrony.

Eelistan oma võrgu mis tahes teenuse jaoks ühte rakendust, seega kasutan Chronyt. Kui te ei vaja kohalikku NTP-serverit või kui te ei soovi kasutada Chrony serverina ja systemd-timesyncd SNTP-kliendina. Lõppude lõpuks pole vaja Chrony lisafunktsioone kliendina kasutada, kui olete systemd-timesyncd funktsionaalsusega rahul.

Veel üks märkus: te ei pea NTP juurutamiseks kasutama süsteemseid tööriistu. Võite kasutada ntpd, Chrony vanemat versiooni või mõnda muud NTP-rakendust. Systemd koosneb ju suurest hulgast teenustest; paljud neist on valikulised, nii et saate need välja lülitada ja kasutada nende asemel midagi muud. See pole tohutu monoliitne koletis. Süsteem või selle osad ei pruugi teile meeldida, kuid peaksite tegema teadliku otsuse.

Mulle meeldib systemd'i NTP juurutamine, kuid eelistan Chronyt, kuna see sobib paremini minu vajadustega. See on Linux, kallis -)

Reklaamide õiguste kohta

VDSina pakub serverid mis tahes ülesande jaoks, tohutu valik operatsioonisüsteeme automaatseks installimiseks, on võimalik installida mis tahes OS omast ISO, mugav juhtpaneel enda arendamine ja igapäevane tasumine. Tuletage meelde, et meil on igavesed serverid, mis on kindlasti ajatud 😉

Linuxi aja sünkroonimine: NTP, Chrony ja systemd-timesyncd

Allikas: www.habr.com

Lisa kommentaar