Časovna sinhronizacija Linuxa: NTP, Chrony in systemd-timesyncd

Časovna sinhronizacija Linuxa: NTP, Chrony in systemd-timesyncd
Večina ljudi spremlja čas. Vstajamo pravočasno, da opravimo svoje jutranje rituale in gremo v službo, si vzamemo odmor za kosilo, upoštevamo roke projektov, praznujemo rojstne dneve in praznike, se vkrcamo na letalo itd.

Še več: nekateri smo obsedeni s časom. Mojo uro napaja sončna energija in prejema točen čas od Nacionalnega inštituta za standarde in tehnologijo (NIST) v Fort Collins, Colorado prek dolgovalovnega radia WWVB. Časovni signali so sinhronizirani z atomsko uro, ki se prav tako nahaja v Fort Collinsu. Moj Fitbit se sinhronizira z mojim telefonom, ki se sinhronizira s strežnikom NTP, ki se na koncu sinhronizira z atomsko uro.

Naprave spremljajo tudi čas

Obstaja veliko razlogov, zakaj naše naprave in računalniki potrebujejo točen čas. Na primer, v bančništvu, borznih trgih in drugih finančnih poslih morajo biti transakcije izvedene v pravilnem vrstnem redu, točna časovna zaporedja pa so ključnega pomena za to.

Naši telefoni, tablice, avtomobili, sistemi GPS in računalniki zahtevajo natančne nastavitve časa in datuma. Želim, da ura na namizju mojega računalnika kaže točen čas. Želim, da se opomniki pojavijo na mojem lokalnem koledarju ob pravem času. Pravi čas tudi zagotavlja, da se opravila cron in systemd izvajajo ob pravem času.

Za beleženje sta pomembna tudi datum in čas, zato je nekoliko lažje najti določene dnevnike na podlagi datuma in časa. Na primer, nekoč sem delal v DevOps (takrat se ni tako imenoval) in postavljal e-poštni sistem v zvezni državi Severna Karolina. Včasih smo obdelali več kot 20 milijonov e-poštnih sporočil na dan. Sledenje e-pošti prek serije strežnikov ali določanje natančnega zaporedja dogodkov z uporabo dnevniških datotek na geografsko razpršenih gostiteljih je lahko veliko lažje, če so ustrezni računalniki pravočasno sinhronizirani.

Enkrat - veliko ur

Gostitelji Linuxa morajo upoštevati, da obstajata sistemski čas in čas RTC. RTC (Real Time Clock) je nekoliko nenavadno in premalo natančno ime za strojno uro.

Ura strojne opreme deluje neprekinjeno, tudi ko je računalnik izklopljen, pri čemer uporablja baterijo na matični plošči sistema. Glavna funkcija RTC je shranjevanje časa, ko povezava s časovnim strežnikom ni na voljo. V časih, ko se prek interneta ni bilo mogoče povezati s časovnim strežnikom, je moral imeti vsak računalnik natančno notranjo uro. Operacijski sistemi so morali dostopati do RTC ob zagonu in uporabnik je moral ročno nastaviti sistemski čas z vmesnikom za konfiguracijo strojne opreme BIOS, da se prepriča, da je pravilen.

Strojne ure ne razumejo koncepta časovnih pasov; RTC shranjuje samo čas, ne pa časovnega pasu ali odmika od UTC (koordinirani univerzalni čas, znan tudi kot GMT ali Greenwiški srednji čas). RTC lahko namestite z orodjem, ki ga bom obravnaval pozneje v tem članku.

Sistemski čas je čas, ki ga OS prikaže na uri grafičnega uporabniškega vmesnika na namizju, v izhodu datumskega ukaza, v časovnih žigih dnevnikov. To velja tudi za ustvarjanje, spreminjanje in odpiranje datotek.

Na strani človek za rtc tam je popoln opis RTC in sistemske ure.

Kaj je z NTP?

Računalniki po vsem svetu uporabljajo NTP (Network Time Protocol) za sinhronizacijo svojega časa s standardnimi referenčnimi urami prek interneta z uporabo hierarhije strežnikov NTP. Glavni časovni strežniki so na ravni 1 in so neposredno povezani z različnimi nacionalnimi časovnimi storitvami na ravni 0 prek satelita, radia ali celo modemov prek telefonskih linij. Časovne storitve ravni 0 so lahko atomska ura, radijski sprejemnik, ki je nastavljen na signale, ki jih oddajajo atomske ure, ali sprejemnik GPS, ki uporablja zelo natančne signale ure, ki jih oddajajo sateliti GPS.

Velika večina referenčnih strežnikov ima več tisoč javnih strežnikov NTP stratum 2, ki so odprti za javnost. Številne organizacije in uporabniki (vključno z mano) z veliko gostitelji, ki potrebujejo strežnik NTP, se odločijo za nastavitev lastnih časovnih strežnikov, tako da samo en lokalni gostitelj dostopa do stratuma 2 ali 3. Nato konfigurirajo preostala vozlišča v omrežju za uporabo lokalnih časovni strežnik. V primeru mojega domačega omrežja je to strežnik 3. sloja.

Različne izvedbe NTP

Prvotna izvedba NTP je ntpd. Nato sta se mu pridružila dva novejša, chronyd in systemd-timesyncd. Vsi trije sinhronizirajo čas lokalnega gostitelja s časovnim strežnikom NTP. Storitev systemd-timesyncd ni tako zanesljiva kot chronyd, vendar je dovolj dobra za večino namenov. Če RTC ni sinhroniziran, lahko postopoma prilagodi sistemski čas za sinhronizacijo s strežnikom NTP, ko lokalni sistemski čas nekoliko zaniha. Storitve systemd-timesync ni mogoče uporabiti kot časovni strežnik.

Chrony je implementacija NTP, ki vsebuje dva programa: demon chronyd in vmesnik ukazne vrstice, imenovan chronyc. Chrony ima nekaj funkcij, ki so nepogrešljive v mnogih primerih:

  • Chrony se lahko sinhronizira s časovnim strežnikom veliko hitreje kot stara storitev ntpd. To je dobro za prenosnike ali namizne računalnike, ki ne delujejo ves čas.
  • Lahko kompenzira nihanja ure, na primer ko gostitelj preide v stanje spanja ali vstopi v način mirovanja ali ko se ura spremeni zaradi frekvenčnega skakanja, kar upočasni uro pri nizkih obremenitvah.
  • Rešuje časovne težave, povezane z nestabilno omrežno povezavo ali prezasedenostjo omrežja.
  • Uravnava zakasnitve omrežja.
  • Po začetni časovni sinhronizaciji Chrony nikoli ne ustavi ure. To zagotavlja stabilne in dosledne časovne reže za številne sistemske storitve in aplikacije.
  • Chrony lahko deluje tudi brez omrežne povezave. V tem primeru lahko lokalnega gostitelja ali strežnik posodobite ročno.
  • Chrony lahko deluje kot strežnik NTP.

Še enkrat, NTP je protokol, ki ga je mogoče implementirati na gostitelju Linux z uporabo Chrony ali systemd-timesyncd.

RPM-ji NTP, Chrony in systemd-timesyncd so na voljo v standardnih repozitorijih Fedora. Systemd-udev RPM je upravljalnik dogodkov jedra, ki je privzeto nameščen v Fedori, vendar je neobvezen.

Lahko namestite vse tri in preklapljate med njimi, vendar bo to povzročilo dodaten glavobol. Zato je bolje, da ne. Sodobne izdaje Fedora, CentOS in RHEL so se preselile v Chrony kot privzeto implementacijo in imajo tudi systemd-timesyncd. Menim, da Chrony deluje dobro, zagotavlja boljši vmesnik kot storitev NTP, zagotavlja veliko več informacij in nadzora, v čemer bodo zagotovo uživali sistemski skrbniki.

Onemogočanje storitev NTP

Storitev NTP morda že deluje na vašem gostitelju. Če je tako, ga morate onemogočiti, preden preklopite na kaj drugega. Imel sem zagnan chronyd, zato sem uporabil naslednje ukaze, da sem ga zaustavil in onemogočil. Zaženite ustrezne ukaze za kateri koli demon NTP, ki ga izvajate na svojem gostitelju:

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

Preverite, ali je storitev ustavljena in onemogočena:

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

Preverjanje stanja pred zagonom

Stanje sinhronizacije sistemske ure vam omogoča, da ugotovite, ali se storitev NTP izvaja. Ker še niste zagnali NTP, bo ukaz timesync-status namignil na to:

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

Neposredna zahteva po statusu zagotavlja pomembne informacije. Na primer, ukaz timedatectl brez argumenta ali možnosti privzeto izvede podukaz status:

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

To vam bo dalo lokalni čas za vašega gostitelja, čas UTC in čas RTC. V tem primeru je sistemski čas nastavljen na časovni pas America/New_York (TZ), RTC je nastavljen na čas v lokalnem časovnem pasu in storitev NTP ni aktivna. Čas RTC je začel rahlo odstopati od sistemskega časa. To je običajno za sisteme, katerih ure niso bile sinhronizirane. Količina odmika na gostitelju je odvisna od časa, ki je pretekel od zadnje sinhronizacije sistema.

Prejeli smo tudi opozorilo o uporabi lokalnega časa za RTC – to velja za spremembe časovnega pasu in nastavitve poletnega časa. Če je računalnik izklopljen, ko je treba izvesti spremembe, se RTC ne bo spremenil. Toda za strežnike ali druge gostitelje, ki delujejo XNUMX ur na dan, to sploh ni problem. Poleg tega bo katera koli storitev, ki zagotavlja časovno sinhronizacijo NTP, prilagodila gostiteljev čas med začetno fazo zagona, tako da bo čas po končanem zagonu spet pravilen.

Nastavitev časovnega pasu

Običajno določite časovni pas med postopkom namestitve in vam ni treba spreminjati pozneje. Vendar pa obstajajo trenutki, ko morate spremeniti časovni pas. Obstaja več orodij, ki lahko pomagajo. Linux uporablja datoteke časovnih pasov za določanje lokalnega časovnega pasu gostitelja. Te datoteke so v imeniku /usr/share/zoneinfo. Privzeto za moj časovni pas sistem predpisuje tole: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Toda za spremembo časovnega pasu vam ni treba poznati takšnih tankosti.

Glavna stvar je vedeti uradno ime časovnega pasu za vašo lokacijo in ustrezen ukaz. Recimo, da želite spremeniti časovni pas v 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>

Zdaj lahko nastavite časovni pas. Za preverjanje sprememb sem uporabil ukaz date, lahko pa uporabite tudi 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 ~]#

Zdaj lahko spremenite časovni pas svojega gostitelja nazaj na lokalni čas.

systemd-timesyncd

Demon systemd timesync zagotavlja izvedbo NTP, ki jo je enostavno upravljati v kontekstu systemd. Privzeto je nameščen v sistemih Fedora in Ubuntu. Vendar se privzeto zažene samo v Ubuntuju. Za druge distribucije nisem prepričan. Lahko preverite sami:

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

Konfiguriranje systemd-timesyncd

Konfiguracijska datoteka za systemd-timesyncd je /etc/systemd/timesyncd.conf. To je preprosta datoteka z manj omogočenimi možnostmi kot stari storitvi NTP in Chronyd. Tukaj je vsebina te datoteke (brez nadaljnjih sprememb) na mojem Fedora VM:

#  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

Edini razdelek, ki ga vsebuje, poleg komentarjev, je [Čas]. Vse druge vrstice so komentirane. To so privzete vrednosti in jih ne smete spreminjati (razen če imate za to razlog). Če v vrstici NTP= nimate definiranega časovnega strežnika NTP, Fedora privzeto nastavi nadomestni časovni strežnik Fedora. Ponavadi dodam svoj časovni strežnik:

NTP=myntpserver

Sinhronizacija časov teka

Systemd-timesyncd lahko zaženete in aktivirate tako:

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

Nastavitev strojne ure

Tako izgleda situacija po zagonu timesyncd:

[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    

Na začetku je razlika med RTC in lokalnim časom (EDT) manjša od sekunde, v naslednjih nekaj dneh pa se razlika poveča še za nekaj sekund. Ker v RTC ni koncepta časovnih pasov, mora ukaz timedatectl izvesti primerjavo za določitev pravilnega časovnega pasu. Če se čas RTC ne ujema natančno z lokalnim časom, potem se ne ujema niti z lokalnim časovnim pasom.

Ko sem iskal več informacij, sem preveril stanje systemd-timesync in našel tole:

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

Bodite pozorni na sporočilo dnevnika, ki pravi, da sistemski čas ni bil nastavljen ali pa je bil ponastavljen. Storitev Timesync nastavi sistemski čas na podlagi časovnega žiga. Časovne žige vzdržuje demon timesync in se ustvarijo ob vsaki uspešni sinhronizaciji.

Ukaz timedatectl ne more vzeti vrednosti strojne ure iz sistemske ure. Nastavi lahko samo čas in datum iz vrednosti, vnesene v ukazno vrstico. Z ukazom hwclock lahko RTC nastavite na isto vrednost kot sistemski čas:

[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

Možnost --localtime pove strojni uri, naj prikazuje lokalni čas, ne UTC.

Zakaj sploh potrebuješ RTC?

Vsaka implementacija NTP bo nastavila sistemsko uro ob času zagona. In zakaj potem RTC? To ni povsem res: to se bo zgodilo le, če imate omrežno povezavo s časovnim strežnikom. Vendar pa mnogi sistemi nimajo vedno dostopa do omrežne povezave, zato je za Linux uporabna strojna ura za nastavitev sistemskega časa. To je bolje kot ročna nastavitev časa, čeprav lahko odstopa od realnega časa.

Zaključek

Ta članek je pregledal nekaj orodij za spreminjanje datuma, časa in časovnih pasov. Orodje systemd-timesyncd ponuja odjemalca NTP, ki lahko sinhronizira čas na lokalnem gostitelju s strežnikom NTP. Vendar systemd-timesyncd ne zagotavlja strežniške storitve, tako da, če potrebujete strežnik NTP v svojem omrežju, morate uporabiti nekaj drugega, kot je Chrony, ki bo deloval kot strežnik.

Raje imam eno samo izvedbo za katero koli storitev v svojem omrežju, zato uporabljam Chrony. Če ne potrebujete lokalnega strežnika NTP ali če vas ne moti uporaba Chrony kot strežnika in systemd-timesyncd kot odjemalca SNTP. Navsezadnje vam ni treba uporabljati dodatnih funkcij Chrony kot odjemalca, če ste zadovoljni s funkcionalnostjo systemd-timesyncd.

Še ena opomba: za implementacijo NTP vam ni treba uporabljati orodij systemd. Uporabite lahko starejšo različico ntpd, Chrony ali drugo izvedbo NTP. Navsezadnje je systemd sestavljen iz velikega števila storitev; veliko jih je neobveznih, zato jih lahko izklopite in namesto njih uporabite kaj drugega. To ni ogromna monolitna pošast. Morda vam ni všeč systemd ali njegovi deli, vendar se morate odločiti na podlagi informacij.

Všeč mi je sistemska implementacija NTP, vendar imam raje Chrony, ker bolj ustreza mojim potrebam. To je Linux, srček -)

O pravicah oglaševanja

VDSina ponuja strežniki za katero koli nalogo, velika izbira operacijskih sistemov za samodejno namestitev, možna je namestitev katerega koli OS iz lastnega ISO, udobno nadzorna plošča lasten razvoj in dnevno plačilo. Spomnimo se, da imamo večne strežnike, ki so zagotovo brezčasni 😉

Časovna sinhronizacija Linuxa: NTP, Chrony in systemd-timesyncd

Vir: www.habr.com

Dodaj komentar