Sinkronizimi i kohës Linux: NTP, Chrony dhe systemd-timesyncd

Sinkronizimi i kohës Linux: NTP, Chrony dhe systemd-timesyncd
Shumica e njerëzve mbajnë gjurmët e kohës. Ngrihemi në kohë për të përfunduar ritualet tona të mëngjesit dhe shkojmë në punë, bëjmë një pushim dreke, përmbushim afatet e projektit, festojmë ditëlindjet dhe festat, hipim në një aeroplan etj.

Për më tepër: disa prej nesh janë të fiksuar pas kohës. Ora ime mundësohet nga energjia diellore dhe merr kohën e saktë nga Instituti Kombëtar i Standardeve dhe Teknologjisë (NIST) në Fort Collins, Kolorado nëpërmjet radios me valë të gjata WWVB. Sinjalet e kohës sinkronizohen me orën atomike, e vendosur gjithashtu në Fort Collins. Fitbit im po sinkronizohet me telefonin tim i cili po sinkronizohet me serverin NTP, e cila përfundimisht sinkronizohet me orën atomike.

Pajisjet gjithashtu mbajnë gjurmët e kohës

Ka shumë arsye pse pajisjet dhe kompjuterët tanë kanë nevojë për kohë të saktë. Për shembull, në banka, tregjet e aksioneve dhe biznese të tjera financiare, transaksionet duhet të kryhen në rendin e duhur dhe sekuencat e sakta kohore janë kritike për këtë.

Telefonat, tabletët, makinat, sistemet GPS dhe kompjuterët tanë kërkojnë cilësime të sakta të orës dhe datës. Dua që ora në desktopin e kompjuterit tim të tregojë kohën e duhur. Dua që përkujtuesit të shfaqen në kalendarin tim lokal në kohën e duhur. Koha e saktë siguron gjithashtu që punët cron dhe systemd të funksionojnë në kohën e duhur.

Data dhe ora janë gjithashtu të rëndësishme për regjistrimin, kështu që është pak më e lehtë për të gjetur regjistra të caktuar bazuar në datën dhe kohën. Për shembull, dikur kam punuar në DevOps (nuk quhej kështu në atë kohë) dhe po krijoja një sistem emaili në shtetin e Karolinës së Veriut. Dikur përpunonim mbi 20 milionë emaile në ditë. Ndjekja e postës elektronike përmes një sërë serverësh, ose përcaktimi i sekuencës së saktë të ngjarjeve duke përdorur skedarë log në hostet e shpërndarë gjeografikisht, mund të jetë shumë më e lehtë nëse kompjuterët përkatës sinkronizohen në kohë.

Një herë - shumë orë

Pritësit e Linux duhet të marrin parasysh që ka një kohë sistemi dhe një kohë RTC. RTC (Real Time Clock) është një emër paksa i çuditshëm dhe jo shumë i saktë për një orë harduerike.

Ora e harduerit funksionon vazhdimisht edhe kur kompjuteri është i fikur, duke përdorur baterinë në motherboard të sistemit. Funksioni kryesor i RTC është të ruajë kohën kur një lidhje me një server të kohës nuk është e disponueshme. Në ditët kur ishte e pamundur të lidheshim me një server të kohës nëpërmjet internetit, çdo kompjuter duhej të kishte një orë të brendshme të saktë. Sistemet operative duhej të hynin në RTC në kohën e nisjes dhe përdoruesi duhej të caktonte manualisht kohën e sistemit duke përdorur ndërfaqen e konfigurimit të harduerit BIOS për t'u siguruar që ishte e saktë.

Orët e harduerit nuk e kuptojnë konceptin e zonave kohore; RTC ruan vetëm orën, jo zonën kohore ose zhvendosjen nga UTC (Koha e Koordinuar Universale, e njohur gjithashtu si GMT ose Koha mesatare e Greenwich). Mund të instaloni RTC duke përdorur një mjet që do ta trajtoj më vonë në këtë artikull.

Koha e sistemit është koha që OS shfaq në orën GUI në desktopin tuaj, në daljen e komandës së datës, në vulat kohore të regjistrave. Kjo vlen edhe kur skedarët krijohen, modifikohen dhe hapen.

Në faqe njeri për rtc ka një përshkrim të plotë të RTC dhe orës së sistemit.

Çfarë është me NTP?

Kompjuterët në të gjithë botën përdorin NTP (Network Time Protocol) për të sinkronizuar kohën e tyre me orët standarde të referencës në internet duke përdorur një hierarki të serverëve NTP. Serverët kryesorë të kohës janë në shtresën 1 dhe janë të lidhur direkt me shërbime të ndryshme kombëtare të kohës në shtresën 0 nëpërmjet satelitit, radios apo edhe modemit nëpërmjet linjave telefonike. Shërbimet kohore të shtresës 0 mund të jenë një orë atomike, një marrës radio që është i sintonizuar me sinjalet e transmetuara nga orët atomike ose një marrës GPS që përdor sinjale të orës shumë të sakta të transmetuara nga satelitët GPS.

Shumica dërrmuese e serverëve të referencës kanë disa mijëra serverë publikë NTP të shtresës 2 të hapur për publikun. Shumë organizata dhe përdorues (përfshirë veten time) me shumë host që kanë nevojë për një server NTP, zgjedhin të konfigurojnë serverët e tyre të kohës, kështu që vetëm një host lokal i qaset shtresës 2 ose 3. Ata më pas konfigurojnë nyjet e mbetura në rrjet për të përdorur lokalin serveri i kohës. Në rastin e rrjetit tim në shtëpi, ky është një server me shtresa 3.

Implementime të ndryshme të NTP

Implementimi origjinal i NTP është ntpd. Më pas u bashkua nga dy më të reja, chronyd dhe systemd-timesyncd. Të tre sinkronizojnë kohën lokale të pritjes me një server të kohës NTP. Shërbimi systemd-timesyncd nuk është aq i besueshëm sa chronyd, por është mjaft i mirë për shumicën e qëllimeve. Nëse RTC është jashtë sinkronizimit, ai mund të rregullojë gradualisht kohën e sistemit për t'u sinkronizuar me serverin NTP kur koha e sistemit lokal zvogëlohet pak. Shërbimi systemd-timesync nuk mund të përdoret si server i kohës.

Kronike është një implementim i NTP që përmban dy programe: chronyd daemon dhe një ndërfaqe të linjës komanduese të quajtur chronyc. Chrony ka disa veçori që janë të domosdoshme në shumë raste:

  • Chrony mund të sinkronizohet me një server kohe shumë më shpejt se shërbimi i vjetër ntpd. Kjo është e mirë për laptopët ose desktopët që nuk punojnë gjatë gjithë kohës.
  • Mund të kompensojë luhatjet e orës, të tilla si kur hosti shkon në gjumë ose hyn në modalitetin e gjumit, ose kur ora ndryshon për shkak të kërcimeve të frekuencës, gjë që ngadalëson orët në ngarkesa të ulëta.
  • Zgjidh problemet kohore që lidhen me lidhjen e paqëndrueshme të rrjetit ose bllokimin e rrjetit.
  • Ai rregullon vonesat e rrjetit.
  • Pas sinkronizimit fillestar të kohës, Chrony nuk e ndal kurrë orën. Kjo siguron hapësira kohore të qëndrueshme dhe të qëndrueshme për shumë shërbime dhe aplikacione të sistemit.
  • Chrony mund të funksionojë edhe pa një lidhje rrjeti. Në këtë rast, hosti ose serveri lokal mund të përditësohet manualisht.
  • Chrony mund të veprojë si një server NTP.

Edhe një herë, NTP është një protokoll që mund të zbatohet në një host Linux duke përdorur Chrony ose systemd-timesyncd.

RPM-të NTP, Chrony dhe systemd-timesyncd janë të disponueshme në magazinat standarde të Fedora-s. Systemd-udev RPM është një menaxher i ngjarjeve të kernelit që instalohet si parazgjedhje në Fedora, por është opsional.

Mund t'i instaloni të treja dhe të kaloni mes tyre, por kjo do të krijojë një dhimbje koke shtesë. Kështu që është më mirë të mos. Publikimet moderne të Fedora, CentOS dhe RHEL janë zhvendosur në Chrony si zbatimi i paracaktuar, dhe ato gjithashtu kanë systemd-timesyncd. Mendoj se Chrony funksionon mirë, ofron një ndërfaqe më të mirë se shërbimi NTP, ofron shumë më tepër informacion dhe kontroll, gjë që sigurisht do t'i pëlqejë administratorëve të sistemit.

Çaktivizimi i shërbimeve NTP

Shërbimi NTP mund të funksionojë tashmë në hostin tuaj. Nëse po, duhet ta çaktivizoni përpara se të kaloni në diçka tjetër. Unë kisha chronyd running kështu që përdora komandat e mëposhtme për ta ndaluar dhe çaktivizuar atë. Ekzekutoni komandat e duhura për çdo daemon NTP që po ekzekutoni në hostin tuaj:

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

Kontrolloni që shërbimi është ndalur dhe çaktivizuar:

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

Kontrolli i statusit përpara nisjes

Statusi i sinkronizimit të orës së sistemit ju lejon të përcaktoni nëse shërbimi NTP po funksionon. Meqenëse nuk e keni nisur ende NTP-në, komanda timesync-status do të sugjerojë këtë:

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

Një kërkesë e drejtpërdrejtë për status ofron informacion të rëndësishëm. Për shembull, komanda timedatectl pa argument ose opsione ekzekuton nënkomandën e statusit si parazgjedhje:

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

Kjo do t'ju japë kohën lokale për hostin tuaj, kohën UTC dhe kohën RTC. Në këtë rast, ora e sistemit caktohet në zonën kohore të Amerikës / New_York (TZ), RTC caktohet në orën në zonën kohore lokale dhe shërbimi NTP nuk është aktiv. Koha RTC ka filluar të devijojë pak nga koha e sistemit. Kjo është normale për sistemet, orët e të cilave nuk janë sinkronizuar. Shuma e kompensimit në host varet nga koha që ka kaluar që nga sinkronizimi i fundit i sistemit.

Ne morëm gjithashtu një paralajmërim për përdorimin e orës lokale për RTC - kjo vlen për ndryshimet e zonës kohore dhe cilësimet e DST. Nëse kompjuteri fiket kur duhet të bëhen ndryshime, RTC nuk do të ndryshojë. Por për serverët ose hostet e tjerë që funksionojnë gjatë gjithë kohës, ky nuk është aspak problem. Përveç kësaj, çdo shërbim që ofron sinkronizimin e kohës NTP do të rregullojë kohën e hostit gjatë fazës fillestare të nisjes, kështu që koha do të jetë përsëri e saktë pas përfundimit të nisjes.

Vendosja e zonës kohore

Zakonisht, ju specifikoni zonën kohore gjatë procedurës së instalimit dhe nuk keni për detyrë ta ndryshoni atë më vonë. Sidoqoftë, ka raste kur duhet të ndryshoni zonën kohore. Ka disa mjete që mund të ndihmojnë. Linux përdor skedarët e zonës kohore për të përcaktuar zonën kohore lokale të një hosti. Këto skedarë janë në drejtori /usr/share/zoneinfo. Si parazgjedhje, për zonën time kohore, sistemi përshkruan këtë: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Por nuk keni nevojë të dini hollësi të tilla për të ndryshuar zonën kohore.

Gjëja kryesore është të dini emrin zyrtar të zonës kohore për vendndodhjen tuaj dhe komandën përkatëse. Le të themi se dëshironi të ndryshoni zonën kohore në 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>

Tani mund të vendosni zonën kohore. Kam përdorur komandën data për të kontrolluar ndryshimet, por ju gjithashtu mund të përdorni 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 ~]#

Tani mund ta kthesh zonën kohore të hostit në kohën lokale.

systemd-timesyncd

Daemon systemd timesync ofron një zbatim NTP që është i lehtë për t'u menaxhuar në kontekstin systemd. Është instaluar si parazgjedhje në Fedora dhe Ubuntu. Sidoqoftë, ai fillon vetëm si parazgjedhje në Ubuntu. Nuk jam i sigurt për shpërndarjet e tjera. Ju mund të kontrolloni vetë:

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

Sistemid-timesyncd po konfigurohet

Skedari i konfigurimit për systemd-timesyncd është /etc/systemd/timesyncd.conf. Ky është një skedar i thjeshtë me më pak opsione të aktivizuara sesa shërbimet e vjetra NTP dhe chronyd. Këtu është përmbajtja e këtij skedari (pa modifikime të mëtejshme) në Fedora VM tim:

#  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

Seksioni i vetëm që përmban, përveç komenteve, është [Koha]. Të gjitha rreshtat e tjera janë komentuar. Këto janë vlerat e paracaktuara dhe nuk duhet të ndryshohen (nëse nuk keni arsye). Nëse nuk keni një server kohor NTP të përcaktuar në rreshtin NTP=, Fedora vendos si një server tjetër me kohë Fedora. Unë zakonisht shtoj serverin tim të kohës:

NTP=myntpserver

Sinkronizimi i kohës së ekzekutimit

Mund të filloni dhe ta aktivizoni systemd-timesyncd si kjo:

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

Vendosja e orës së harduerit

Ja se si duket situata pas ekzekutimit të 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    

Fillimisht, diferenca midis RTC dhe kohës lokale (EDT) është më pak se një sekondë dhe mospërputhja rritet me disa sekonda të tjera gjatë ditëve të ardhshme. Meqenëse nuk ka koncept të zonave kohore në RTC, komanda timedatectl duhet të kryejë një krahasim për të përcaktuar zonën e saktë kohore. Nëse ora RTC nuk përputhet saktësisht me orën lokale, atëherë nuk përputhet as me zonën kohore lokale.

Duke kërkuar për më shumë informacion, kontrollova statusin e systemd-timesync dhe gjeta këtë:

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

Vini re mesazhin e regjistrit që thotë se koha e sistemit nuk është vendosur ose është rivendosur. Shërbimi Timesync cakton kohën e sistemit bazuar në vulën kohore. Vula kohore mbahen nga daemon timesync dhe krijohen në çdo sinkronizim të suksesshëm.

Komanda timedatectl nuk ka asnjë mënyrë për të marrë vlerën e orës së harduerit nga ora e sistemit. Mund të vendosë vetëm kohën dhe datën nga vlera e futur në vijën e komandës. Mund ta vendosni RTC në të njëjtën vlerë si koha e sistemit duke përdorur komandën 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

Opsioni --localtime i tregon orës së harduerit të tregojë kohën lokale, jo UTC.

Pse keni nevojë fare për RTC?

Çdo zbatim i NTP do të vendosë orën e sistemit në kohën e fillimit. Dhe pse atëherë RTC? Kjo nuk është plotësisht e vërtetë: kjo do të ndodhë vetëm nëse keni një lidhje rrjeti me serverin e kohës. Megjithatë, shumë sisteme nuk kanë gjithmonë akses në një lidhje rrjeti, kështu që një orë harduerike është e dobishme për Linux për t'u përdorur për të vendosur kohën e sistemit. Kjo është më mirë sesa caktimi manual i kohës, edhe pse mund të devijojë nga koha reale.

Përfundim

Ky artikull ka shqyrtuar disa mjete për manipulimin e datës, orës dhe zonave kohore. Mjeti systemd-timesyncd ofron një klient NTP që mund të sinkronizojë kohën në hostin lokal me një server NTP. Sidoqoftë, systemd-timesyncd nuk ofron një shërbim serveri, kështu që nëse keni nevojë për një server NTP në rrjetin tuaj, duhet të përdorni diçka tjetër, si Chrony, për të vepruar si server.

Preferoj të kem një implementim të vetëm për çdo shërbim në rrjetin tim, ndaj përdor Chrony. Nëse nuk keni nevojë për një server lokal NTP, ose nëse nuk keni problem të përdorni Chrony si server dhe systemd-timesyncd si klient SNTP. Në fund të fundit, nuk ka nevojë të përdorni veçoritë shtesë të Chrony si klient nëse jeni të kënaqur me funksionalitetin e systemd-timesyncd.

Një tjetër shënim: nuk ju kërkohet të përdorni mjetet systemd për të zbatuar NTP. Mund të përdorni një version më të vjetër të ntpd, Chrony ose një zbatim tjetër NTP. Në fund të fundit, systemd përbëhet nga një numër i madh shërbimesh; shumë prej tyre janë opsionale, kështu që mund t'i fikni dhe të përdorni diçka tjetër në vend të tyre. Ky nuk është një përbindësh i madh monolit. Mund të mos ju pëlqejë sistemi ose pjesë të tij, por duhet të merrni një vendim të informuar.

Më pëlqen implementimi i NTP nga systemd, por preferoj Chrony sepse i përshtatet më mirë nevojave të mia. Është Linux, fëmijë -)

Për të Drejtat e Reklamimit

VDSina ofron serverë për çdo detyrë, një përzgjedhje e madhe e sistemeve operative për instalim automatik, është e mundur të instaloni çdo OS nga vetja juaj ISO, komode paneli i kontrollit zhvillimin e vet dhe pagesën ditore. Kujtojmë që ne kemi serverë të përjetshëm që janë padyshim të përjetshëm 😉

Sinkronizimi i kohës Linux: NTP, Chrony dhe systemd-timesyncd

Burimi: www.habr.com

Shto një koment