Sinhronizacija vremena u Linuxu: NTP, Chrony i systemd-timesyncd

Sinhronizacija vremena u Linuxu: NTP, Chrony i systemd-timesyncd
Večina ljudi spremlja čas. Vstanemo pravočasno, da opravimo naše jutranje rituale, gremo na delo, naredimo odmor za kosilo, se držimo rokov projekta, proslavimo rojstne dneve in praznike, odletimo in tako naprej.

Poleg tega: nekateri izmed nas so obseden z vremenom. Moje ure delujejo na sončno energijo in prejemajo točen čas iz Nacionalnega inštituta za standarde in tehnologijo (NIST) v Fort Collinsu (Colorado) preko dolgovalovne radijske postaje. WWVBČasi se sinhronizirajo z atomsko uro, ki je prav tako locirana v Fort Collinsu. Moj Fitbit se sinhronizira z mojim telefonom, ki se sinhronizira s strežnikom NTP, ki se na koncu sinhronizira z atomicnimi urami.

Tudi naprave spremljajo čas.

Obstaja mnogo razlogov, zakaj naše naprave in računalniki potrebujejo točen čas. Na primer, v bančništvu, na borzah in drugih finančnih institucijah morajo transakcije potekati v pravilnem zaporedju in točno časovno zaporedje je ključno.

Naši telefoni, tablični računalniki, avtomobili, GPS sistemi in računalniki zahtevajo natančno nastavitev časa in datuma. Želim, da moje namizne ure pokažejo pravilen čas. Želim, da se opomniki v mojem lokalnem koledarju prikažejo ob pravem času. Pravi čas prav tako zagotavlja, da se naloge cron in systemd izvajajo ob pravem času.

Datum in čas sta prav tako pomembna za beleženje, zato je nekoliko lažje najti določene dogodke ob določenem datumu in času. Na primer, nekoč sem delal v DevOpsu (takrat ga še nisi imenoval tako) in nastavljal sistem elektronske pošte v Severni Karolini. Včasih smo obdelali več kot 20 milijonov e-poštnih sporočil na dan. Sledenje elektronski pošti skozi niz strežnikov ali določitev natančnega zaporedja dogodkov z uporabo dnevniških datotek na geografsko razpršenih gostiteljih je lahko veliko lažje, če so ustrezni računalniki sinhronizirani po času.

Čas je en, ure pa so mnoge.

Linux gostitelji morajo upoštevati, da obstaja sistemski čas in RTC čas. RTC (Real Time Clock — ure v realnem času) je nekoliko nenavadno in ne prav natančno ime za strojne ure.

Strojni uri delujejo neprekinjeno, tudi ko je računalnik izklopljen, z uporabo baterije na matični plošči sistema. Glavna funkcija RTC je shranjevanje časa, ko povezava s časovnim strežnikom ni na voljo. V časih, ko ni bilo mogoče povezati z časovnim strežnikom prek interneta, je moral imeti vsak računalnik natančne notranje ure. Operacijski sistemi so se morali ob nalaganju obrniti na RTC, uporabnik pa je moral ročno nastaviti sistemski čas z uporabo strojnega vmesnika za konfiguracijo BIOS, da se zagotovi, da je pravilen.

Strojni uri ne razumejo koncepta časovnih pasov; v RTC je shranjen samo čas, ne pa tudi časovni pas ali odmik od UTC (koordiniranega univerzalnega časa, znanega tudi kot GMT ali srednji čas po Greenwichu). RTC lahko nastavite s pomočjo orodja, o katerem bom spregovoril kasneje v tem članku.

Sistemski čas je čas, ki ga operacijski sistem prikazuje na urah GUI na vašem namizju, v izhodu ukaza date in v oznakah časa dnevnikov. To se nanaša tudi na čas ustvarjanja, spremembe in odpiranja datotek.

Na strani man za rtc je popoln opis RTC in sistemskih ur.

Kaj pa NTP?

Računalniki po vsem svetu uporabljajo NTP (omrežni protokol časa) za sinhronizacijo svojega časa z standardnimi referenčnimi urami prek interneta z uporabo hierarhije NTP strežnikov. Glavni časovni strežniki so na ravni 1 in so neposredno povezani z različnimi nacionalnimi časovnimi službami na ravni 0 prek satelitov, radia ali celo modemov po telefonskih linijah. Časovne službe na ravni 0 so lahko atomske ure, radijski sprejemnik, nastavljen na signale, ki jih oddajajo atomske ure, ali sprejemnik GPS, ki uporablja visoko natančne signale ur, ki jih oddajajo sateliti GPS.

Na večini referenčnih strežnikov je odprtih več tisoč javnih strežnikov NTP stratum 2, ki so dostopni vsem. Mnoge organizacije in uporabniki (vključno z mano), ki imajo veliko gostiteljev, ki potrebujejo NTP strežnik, raje namestijo svoje lastne časovne strežnike, zato se le en lokalni gostitelj poveže s stratum 2 ali 3. Nato nastavijo preostale vozlišča v omrežju, da uporabljajo lokalni časovni strežnik. V mojem domačem omrežju je to strežnik ravni 3.

Različne implementacije NTP

Prva implementacija NTP je ntpd. Nato sta ji pridružena še dva novejša, chronyd in systemd-timesyncd. Vsi trije sinhronizirajo čas lokalnega gostitelja s 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, da se sinhronizira s NTP strežnikom, ko se lokalni sistemski čas nekoliko premakne. Storitev systemd-timesync ne more biti uporabljena kot časovni strežnik.

Chrony — je implementacija NTP, ki vsebuje dva programa: demon chronyd in ukazno vrstico z imenom chronyc. Chrony ima nekatere funkcije, ki so v mnogih primerih preprosto nepogrešljive:

  • Chrony se lahko sinhronizira s časovnim strežnikom znatno hitreje kot stara storitev ntpd. To je dobro za prenosne računalnike ali namizne računalnike, ki ne delujejo neprekinjeno.
  • Lahko kompenzira nihanja taktskih frekvenc, na primer, ko gostitelj preklopi v način spanja ali ko se frekvenca spremeni zaradi nenadnega povečanja frekvence, ki upočasni taktske frekvence pri nizkih obremenitvah.
  • Rešuje težave s časom, povezane z nestabilnimi omrežnimi povezavami ali preobremenitvijo omrežja.
  • Upravlja zakasnitve v omrežju.
  • Po začetni časovni sinhronizaciji Chrony nikoli ne ustavi ur. To zagotavlja stabilne in usklajene časovne intervale za številne sistemske storitve in aplikacije.
  • Chrony lahko deluje tudi brez povezave v omrežje. V tem primeru je lokalni gostitelj ali strežnik mogoče ročno posodobiti.
  • Chrony lahko deluje kot NTP strežnik.

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

RPM paketi NTP, Chrony in systemd-timesyncd so na voljo v standardnih repozitorijih Fedora. RPM systemd-udev je manager dogodkov jedra, ki je v Fedori privzeto nameščen, vendar ni obvezen za uporabo.

Lahko namestite vse tri in preklapljate med njimi, toda to bo povzročilo dodatno glavobol. Bolje je, da tega ne počnete. Sodobne različice Fedore, CentOS in RHEL so prešle na Chrony kot standardno implementacijo, poleg tega pa imajo tudi systemd-timesyncd. Menim, da Chrony dobro deluje, ponuja boljšo uporabniško izkušnjo kot NTP storitev, zagotavlja veliko več informacij in povečuje nadzor, kar se bo sistemskim administratorjem gotovo zdelo všeč.

Onemogočanje NTP storitev

Morda na vašem gostitelju že teče NTP storitev. Če je tako, jo morate onemogočiti pred preklopom na kaj drugega. Imel sem zagnan chronyd, zato sem uporabil naslednje ukaze, da ga ustavim in onemogočim. Za katerega koli NTP demona, ki ga uporabljate na svojem gostitelju, zaženite ustrezne ukaze:

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

Preverite, da je storitev ustavljena in onemogočena:

[root@testvm1 ~]# systemctl status chronyd
● chronyd.service - NTP klijent/server
     Naloženo: naloženo (/usr/lib/systemd/system/chronyd.service; onemogočeno; tovarniški prednastavitev: omogočeno)
     Aktivno: neaktivno (mrtev)
       Dokumenti: man:chronyd(8)
             man:chrony.conf(5)
[root@testvm1 ~]#

Preverjanje stanja pred zagonom

Stanje sistemske sinhronizacije ur omogoča določiti, ali je NTP storitev aktivna. Ker še niste zagnali NTP, nam bo ukaz timesync-status na to namignil:

[root@testvm1 ~]# timedatectl timesync-status
Napaka pri poizvedbi strežnika: Ni mogoče aktivirati oddaljenega partnerja.

Neposredna poizvedba stanja daje pomembne informacije. Na primer, ukaz timedatectl brez argumentov ali parametrov izvaja podukaz status privzeto:

[root@testvm1 ~]# timedatectl status
           Lokalni čas: Pet 2020-05-15 08:43:10 EDT  
           Univerzalni čas: Pet 2020-05-15 12:43:10 UTC  
                 RTC čas: Pet 2020-05-15 08:43:08      
                Vremenska zona: America/New_York (EDT, -0400)
Sistemski sat sinhronizovan: ne                          
              NTP usluga: neaktivna                    
          RTC u lokalnom TZ: da                    

Upozorenje: Sistem je podešen da čita RTC vreme u lokalnom vremenskom zoni.
         Ovaj režim ne može biti u potpunosti podržan. To će stvoriti razne probleme
         sa promenama vremenskih zona i prilagođavanjima letnjeg računanja vremena. RTC
         vreme nikada nije ažurirano, oslanja se na eksterne usluge da ga održavaju.
         Ako je ikako moguće, koristite RTC u UTC pozivanjem
         'timedatectl set-local-rtc 0'.
[root@testvm1 ~]#

Tako ćete dobiti lokalno vreme za vaš host, vreme UTC i vreme RTC. U ovom slučaju, sistemsko vreme je podešeno na vremensku zonu America / New_York (TZ), RTC je podešen na vreme u lokalnoj vremenskoj zoni, a NTP usluga nije aktivna. Vreme RTC počinje malo da se odstupa od sistemskog vremena. To je normalno za sisteme čiji sati nisu sinhronizovani. Velicina odstupanja na hostu zavisi od vremena koje je prošlo od poslednje sinhronizacije sistema.

Takođe smo dobili upozorenje o korišćenju lokalnog vremena za RTC — ovo se odnosi na promene vremenskih zona i podešavanja letnjeg računanja vremena. Ako je računar isključen u trenutku kada je potrebno izvršiti promene, RTC vreme se neće promeniti. Međutim, za servere ili druge hostove koji rade 24/7, to uopšte nije problem. Osim toga, svaka usluga koja obezbeđuje NTP sinhronizaciju će ispraviti vreme hosta još u ranoj fazi pokretanja, tako da će nakon završetka pokretanja vreme ponovo postati ispravno.

Podešavanje vremenske zone

Obično, vremenska zona se podešava tokom procedure instalacije i nema potrebe da je menjate kasnije. Ipak, postoje situacije kada je potrebno promeniti vremensku zonu. Postoje nekoliko alata koji mogu pomoći. Da bi odredio lokalnu vremensku zonu, Linux koristi fajlove vremenskih zona. Ovi fajlovi se nalaze u direktorijumu /usr/share/zoneinfo. Po defaultu, za moju vremensku zonu, sistem piše ovo: /etc/ localtime -> ../usr/share/zoneinfo/America/New_York. Ali vam nije potrebno da znate te pojedinosti kako biste promenili vremensku zonu.

Najvažnije je znati zvanično ime vremenske zone za vašu lokaciju i odgovarajuću komandu. Recimo, želite da promenite vremensku zonu na Los Anđeles:


[root@testvm2 ~]# timedatectl list-timezones | column

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

Sedaj lahko nastavite časovni pas. Uporabil sem ukaz date za preverjanje sprememb, 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 ponovno spremenite časovni pas vašega strežnika na lokalni čas.

systemd-timesyncd

Demon systemd timesync nudi enostavno upravljanje NTP v okviru systemd. Privzeto je nameščen v Fedora in Ubuntu. Vendar se privzeto zažene le v Ubuntu. O drugih distribucijah nisem prepričan. Preverite to pri sebi:

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

Konfiguracija systemd-timesyncd

Konfiguracijska datoteka za systemd-timesyncd je /etc/systemd/timesyncd.conf. To je preprosta datoteka z manj vključenimi možnostmi kot pri starejših storitvah NTP in chronyd. Tukaj je vsebina te datoteke (brez dodatnih sprememb) na moji virtualni napravi s Fedora:

#  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 odsek, ki ga vsebuje poleg komentarjev, je [Time]. Vse ostale vrstice so zakomentirane. To so privzete vrednosti, ki jih ni treba spreminjati (razen če imate razlog za to). Če nimate NTP časovne strežnike, se privzeto uporablja rezervni časovni strežnik Fedora. Običajno dodam svoj časovni strežnik:

NTP=myntpserver

Zagon timesync

Za zagon in aktiviranje systemd-timesyncd lahko naredite 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 strojnih ur

Tako izgleda situacija po zagonu timesyncd:

[root@testvm2 systemd]# timedatectl
               Lokalni čas: Sat 2020-05-16 14:34:54 EDT  
           Univerzalni čas: Sat 2020-05-16 18:34:54 UTC  
                 RTC čas: Sat 2020-05-16 14:34:53      
                Časovni pas: America/New_York (EDT, -0400)
Sistemska ura sinhronizirana: yes                          
              NTP storitev: aktivna                      
          RTC v lokalnem TZ: ne    

Sprva razlika med RTC in lokalnim časom (EDT) ne presega sekunde, razlike pa se v naslednjih dneh povečajo še za nekaj sekund. Ker RTC ne pozna pojma časovnih pasov, mora ukaz timedatectl izvesti primerjavo, da določi pravilen časovni pas. Če RTC čas natančno ne ustreza lokalnemu času, potem tudi ne ustreza lokalnemu časovnemu pasu.

V iskanju dodatnih informacij sem preveril stanje systemd-timesync in našel naslednje:

[root@testvm2 systemd]# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Sinhronizacija omrežnega časa
     Naloženo: naloženo (/usr/lib/systemd/system/systemd-timesyncd.service; omogočeno; privzeta nastavitev prodajalca: onemogočeno)
     Aktivno: aktivno (deluje) od sob 2020-05-16 13:56:53 EDT; pred 18h
       Dokumenti: man:systemd-timesyncd.service(8)
   Glavni PID: 822 (systemd-timesyn)
     Status: "Prva sinhronizacija z časovnim strežnikom 163.237.218.19:123 (2.fedora.pool.ntp.org)."
      Naloge: 2 (omejitev: 10365)
     Pomnilnik: 2.8M
        CPU: 476ms
     CGroup: /system.slice/systemd-timesyncd.service
             └─822 /usr/lib/systemd/systemd-timesyncd

16. maj 09:57:24 testvm2.both.org systemd[1]: Začinjanje sinhronizacije omrežnega časa...
16. maj 09:57:24 testvm2.both.org systemd-timesyncd[822]: Čas sistemske ure ni nastavljen ali je nazaj skočil, obnavljanje iz zabeležene časovne oznake: sob 2020-05-16 13:56:53 EDT
16. maj 13:56:53 testvm2.both.org systemd[1]: Začeto je sinhronizacijo omrežnega časa.
16. maj 13:57:56 testvm2.both.org systemd-timesyncd[822]: Prva sinhronizacija z časovnim strežnikom 163.237.218.19:123 (2.fedora.pool.ntp.org).
[root@testvm2 systemd]#

Opozorite na sporočilo dnevnika, ki pravi, da sistemski čas ni nastavljen ali pa je bil povrnjen nazaj. Storitev Timesync nastavi sistemski čas na podlagi časovne oznake. Časovne oznake se podpirajo z daemonom timesync in se ustvarijo pri vsakem uspešnem sinhronizaciji.

Ukaz timedatectl nima možnosti, da bi prebral vrednost strojnih ur iz sistemskih ur. Nastavi lahko čas in datum samo iz vrednosti, vnesene v ukazni vrstici. RTC lahko nastavite na isto vrednost kot je sistemski čas, z uporabo ukaza hwclock:

[root@testvm2 ~]# /sbin/hwclock --systohc --localtime
[root@testvm2 ~]# timedatectl
               Lokalni čas: pon 2020-05-18 13:56:46 EDT  
           Univerzalni čas: pon 2020-05-18 17:56:46 UTC  
                 RTC čas: pon 2020-05-18 13:56:46      
                Časovni pas: Amerika/New_York (EDT, -0400)
Sistemska ura sinhronizirana: ja                          
              NTP storitev: aktivna                      
          RTC v lokalnem TZ: da

Možnost --localtime pomeni, da strojne ure prikazujejo lokalni čas in ne UTC.

Zakaj potrebujete RTC?

Vsaka implementacija NTP bo ob zagonu nastavila sistemske ure. Zakaj torej RTC? Ni čisto tako: to se bo zgodilo le, če imate omrežno povezavo s časovnim strežnikom. Vendar pa mnoge sisteme ni mogoče trajno povezati v omrežje, zato so strojne ure uporabne, da lahko Linux na njihovi podlagi nastavi sistemski čas. To je bolje kot ročno nastavitev časa, tudi če se ta lahko razlikuje od dejanskega časa.

Zaključek

V tem članku bomo obravnavali nekatere pripomočke za upravljanje datumov, časa in časovnih pasov. Orodje systemd-timesyncd nudi NTP-odjemalca, ki lahko sinhronizira čas na lokalnem gostitelju s NTP-strežnikom. Vendar systemd-timesyncd ne nudi strežniške storitve, zato, če potrebujete NTP-strežnik v svojem omrežju, morate uporabiti kaj drugega — na primer, Chrony, da deluje kot strežnik.

Raje imam eno samo implementacijo za vse storitve v svojem omrežju, zato uporabljam Chrony. Če ne potrebujete lokalnega NTP-strežnika ali če ne nasprotujete uporabi Chrony kot strežnika in systemd-timesyncd kot SNTP-odjemalca. Ni potrebe po dodatnih funkcijah Chrony kot odjemalca, če vas zadostuje funkcionalnost systemd-timesyncd.

Še ena opomba: niste dolžni uporabljati orodij systemd za implementacijo NTP. Lahko uporabite staro različico ntpd, Chrony ali drugo implementacijo NTP. Namreč, systemd se sestoji iz mnogih storitev; mnoge od njih so neobvezne, zato jih je mogoče onemogočiti in uporabiti kaj drugega. To ni ogromen monolitni pošast. Lahko ne marate systemd ali njegovih delov, vendar morate sprejeti razumen izbor.

Rad imam NTP implementacijo v systemd, vendar raje uporabljam Chrony, ker bolje ustreza mojim potrebam. To je Linux, punca -)

V okviru oglaševanja

VDSina ponuja strežniki za vse vrste nalog, široka izbira operacijskih sistemov za samodejno namestitev, možnost namestitve katerega koli OS s svojega ISO, udobno kontrolni panel lastnega razvoja in plačila na dan. Ne pozabite, imamo večne strežnike, ki določeno niso podvrženi času 😉

Sinhronizacija vremena u Linuxu: NTP, Chrony i systemd-timesyncd

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster