Linux Tiidsyngronisaasje: NTP, Chrony en systemd-timesyncd

Linux Tiidsyngronisaasje: NTP, Chrony en systemd-timesyncd
De measte minsken hâlde de tiid by. Wy steane op tiid op om ús moarnsrituelen te foltôgjen en nei it wurk te gean, brek foar lunch, foldwaan oan projektdeadlines, fiere jierdeis en feestdagen, stappe op in fleantúch, ensfh.

Boppedat: guon fan ús binne obsedearre mei tiid. Myn horloazje wurdt oandreaun troch sinne en krijt syn krekte tiid fan it National Institute of Standards and Technology (NIST) nei Fort Collins, Kolorado fia langegolfradio WWVB. Tiidsinjalen wurde syngronisearre mei in atoomklok ek by Fort Collins. Myn Fitbit syngronisearret mei myn tillefoan, dy't syngronisearret mei de server NTP, dy't úteinlik syngronisearret mei de atoomklok.

Apparaten hâlde ek de tiid by.

D'r binne in protte redenen wêrom't ús apparaten en kompjûters krekte tiid nedich binne. Bygelyks, yn bankieren, oandielmerken en oare finansjele bedriuwen moatte transaksjes wurde útfierd yn 'e juste folchoarder, en krekte tiidsekwinsjes binne kritysk foar dit.

Us tillefoans, tablets, auto's, GPS-systemen en kompjûters fereaskje krekte tiid- en datumynstellingen. Ik wol dat de klok op myn kompjûterburoblêd de juste tiid toant. Ik wol dat herinneringen op it krekte momint yn myn lokale kalinder ferskine. Korrekte timing soarget der ek foar dat cron- en systemd-banen op 'e juste tiid begjinne.

Datum en tiid binne ek wichtich foar logging, dus it is in bytsje makliker om bepaalde logs te finen basearre op datum en tiid. Ik haw bygelyks ienris yn DevOps wurke (dat neamden se it doe net) it opsetten fan in e-postsysteem by North Carolina State. Wy ferwurke eartiids mear dan 20 miljoen e-mails deis. It opspoaren fan e-post oer in searje servers of it bepalen fan 'e krekte folchoarder fan eveneminten mei logbestannen op geografysk ferspraat hosts kin folle makliker wêze as de oerienkommende kompjûters tiidsyngronisearre binne.

Ien kear - in protte oeren

Linux-hosts moatte bewust wêze dat d'r systeemtiid en RTC-tiid is. RTC (Real Time Clock) is in bytsje frjemd en net bysûnder krekte namme foar in hardware klok.

De hardwareklok rint kontinu, sels as de kompjûter is útskeakele, mei de batterij op it moederbord fan it systeem. De haadfunksje fan RTC is om tiid te bewarjen as in ferbining mei in tiidtsjinner net beskikber is. Yn dy dagen dat it ûnmooglik wie om te ferbinen mei in tiidtsjinner fia it ynternet, moast elke kompjûter in krekte ynterne klok hawwe. Bestjoeringssystemen moasten tagong krije ta de RTC by it opstarten, en de brûker moast de systeemtiid manuell ynstelle mei de BIOS-hardware-konfiguraasje-ynterface om te soargjen dat it korrekt wie.

Hardwareklokken begripe it konsept fan tiidsônes net; RTC bewarret allinich tiid, net tiidsône of offset fan UTC (Koördinearre Universele Tiid, dy't ek bekend is as GMT of Greenwich Mean Time). Jo kinne RTC ynstallearje mei in ark dat ik letter yn dit artikel sil beprate.

Systeemtiid is de tiid dy't it OS werjaan yn 'e GUI-klok op jo buroblêd, yn' e útfier fan it datumkommando, yn log-timestamps. Dit jildt ek foar de tiden dat bestannen wurde oanmakke, wizige en iepene.

Op pagina man foar rtc der is in folsleine beskriuwing fan de RTC en systeem klok.

Wat is der mei NTP?

Kompjûters oer de hiele wrâld brûke NTP (Network Time Protocol) om har tiid te syngronisearjen mei standert referinsjeklokken oer it ynternet mei in hiërargy fan NTP-tsjinners. De wichtichste tiid tsjinners lizze yn Laach 1, en se binne direkt ferbûn mei de ferskate nasjonale tiid tsjinsten yn Laach 0 fia satellyt, radio, of sels modems oer telefoan rigels. Tiidtsjinsten op nivo 0 kinne in atoomklok wêze, in radio-ûntfanger dy't is ôfstimd op sinjalen dy't troch atoomklokken oerbrocht wurde, of in GPS-ûntfanger dy't hege presyzje kloksinjalen brûkt dy't troch GPS-satelliten oerbrocht wurde.

De grutte mearderheid fan referinsjeservers hat ferskate tûzen iepenbiere NTP-stratum 2-tsjinners iepen foar elkenien. In protte organisaasjes en brûkers (mysels ynbegrepen) mei in grut oantal hosts dy't in NTP-tsjinner nedich binne kieze har eigen tiidservers te ynstallearjen, sadat mar ien lokale host tagong hat ta stratum 2 of 3. Se konfigurearje dan de oerbleaune hosts op it netwurk om de lokale tiid tsjinner. Yn it gefal fan myn thúsnetwurk is dit in laach 3-tsjinner.

Ferskate NTP-ymplemintaasjes

De oarspronklike ymplemintaasje fan NTP is ntpd. It waard doe gearfoege troch twa nijere, chronyd en systemd-timesyncd. Alle trije syngronisearje lokale hosttiid mei in NTP-tiidtsjinner. De systemd-timesyncd-tsjinst is net sa betrouber as chronyd, mar it is genôch foar de measte doelen. As de RTC net syngronisearre is, kin it de systeemtiid stadichoan oanpasse om te syngronisearjen mei de NTP-tsjinner as de lokale systeemtiid in bytsje beweecht. De systemd-timesync-tsjinst kin net brûkt wurde as tiidtsjinner.

Chrony is in NTP-ymplemintaasje dy't twa programma's befettet: de chronyd-daemon en in kommandorigelynterface neamd chronyc. Chrony hat guon funksjes dy't yn in protte gefallen gewoan ûnmisber binne:

  • Chrony kin syngronisearje mei in tiidtsjinner folle flugger dan de âlde ntpd-tsjinst. Dit is goed foar laptops as buroblêden dy't net altyd rinne.
  • It kin kompensearje foar fluktuaasjes yn kloksnelheden, lykas wannear't de host sliept of yn 'e sliepmodus komt, of as de kloksnelheid feroaret troch frekwinsjehopping, wat de kloksnelheden ûnder lege loads fertraget.
  • It lost timingproblemen op yn ferbân mei instabiele netwurkferbining as netwurkcongestie.
  • It regelet netwurk latency.
  • Nei de earste tiidsyngronisaasje stoppet Chrony de klok noait. Dit soarget foar stabile en konsekwinte timing foar in protte systeemtsjinsten en applikaasjes.
  • Chrony kin sels wurkje sûnder in netwurkferbining. Yn dit gefal kin de lokale host of server manuell bywurke wurde.
  • Chrony kin fungearje as in NTP-tsjinner.

Nochris is NTP in protokol dat kin wurde ymplementearre op in Linux-host mei Chrony of systemd-timesyncd.

De NTP-, Chrony- en systemd-timesyncd RPM-pakketten binne beskikber yn 'e standert Fedora-repositories. De systemd-udev RPM is in kernel-evenemintbehearder dy't standert is ynstalleare op Fedora, mar is net nedich foar gebrûk.

Jo kinne alle trije ynstallearje en tusken har wikselje, mar dit sil ûnnedige hoofdpijn meitsje. Dus it is better net te dwaan. Moderne releases fan Fedora, CentOS en RHEL binne oerskeakele nei Chrony as standert ymplemintaasje, en boppedat hawwe se systemd-timesyncd. Ik tink dat Chrony wurket goed, jout in bettere ynterface as de NTP tsjinst, jout folle mear ynformaasje en grutter kontrôle, dat sil grif in berop dwaan op systeembehearders.

NTP-tsjinsten útskeakelje

Jo host kin al in NTP-tsjinst rinne. As dat sa is, moatte jo it útskeakelje foardat jo oerstappe nei wat oars. Ik hie chronyd rinnen, dus ik brûkte de folgjende kommando's om it te stopjen en út te skeakeljen. Laad de passende kommando's foar elke NTP-daemon dy't jo op jo host útfiere:

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

Kontrolearje dat de tsjinst is stoppe en útskeakele:

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

Kontrolearje de status foardat jo begjinne

De systeemkloksyngronisaasjestatus lit jo bepale oft de NTP-tsjinst rint. Om't jo NTP noch net begon binne, sil it kommando timesync-status dit hingje:

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

In direkte statusfersyk jout wichtige ynformaasje. Bygelyks, it kommando timedatectl sûnder argumint of parameters fiert standert de status subkommando út:

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

Dit sil jo de lokale tiid, UTC-tiid en RTC-tiid fan jo host jaan. Yn dit gefal is de systeemtiid ynsteld op 'e tiidsône Amearika / New_York (TZ), de RTC is ynsteld op' e lokale tiidsône, en de NTP-tsjinst is net aktyf. De RTC-tiid is in bytsje begûn te ôfwike fan 'e systeemtiid. Dit is normaal foar systemen wêrfan de klokken net binne syngronisearre. It bedrach fan offset op 'e host hinget ôf fan' e tiid dy't ferrûn is sûnt it systeem foar it lêst syngronisearre is.

Wy hawwe ek in warskôging krigen oer it brûken fan lokale tiid foar RTC - dit jildt foar feroaringen fan tiidsône en ynstellings foar simmertiid. As de kompjûter is útskeakele as feroarings moatte wurde makke, de RTC tiid sil net feroarje. Mar foar servers of oare hosts dy't wurkje rûn de klok, dit is hielendal gjin probleem. Derneist sil elke tsjinst dy't NTP-tiidsyngronisaasje leveret de tiid fan 'e host oanpasse yn' e earste opstartfaze, sadat ienris it opstarten foltôge is, de tiid wer korrekt is.

It ynstellen fan de tiidsône

Typysk spesifisearje jo de tiidsône tidens de ynstallaasjeproseduere, en jo moatte it letter net feroarje. D'r binne lykwols tiden dat jo jo tiidsône moatte feroarje. D'r binne ferskate ark dy't kinne helpe. Linux brûkt tiidsônebestannen om de lokale tiidsône fan de host te bepalen. Dizze bestannen lizze yn 'e map /usr/share/zoneinfo. Standert, foar myn tiidsône, skriuwt it systeem dit: /etc/ localtime -> ../usr/share/zoneinfo/America/New_York. Mar jo hoege sokke subtiliteiten net te kennen om jo tiidsône te feroarjen.

De kaai is om de offisjele tiidsône namme te kennen foar jo lokaasje en it byhearrende kommando. Litte wy sizze dat jo de tiidsône feroarje wolle nei 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>

No kinne jo jo tiidsône ynstelle. Ik brûkte it kommando date om te kontrolearjen op feroaringen, mar jo kinne ek timedatectl brûke:

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

Jo kinne no de tiidsône fan jo host feroarje nei lokale tiid.

systemd-timesyncd

De systemd timesync daemon leveret in NTP-ymplemintaasje dy't maklik te behearjen is yn in systemd kontekst. It is standert ynstalleare op Fedora en Ubuntu. It rint lykwols standert allinich op Ubuntu. Ik bin der net wis fan oer oare distribúsjes. Jo kinne sels kontrolearje:

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

Systemd-timesyncd konfigurearje

It konfiguraasjetriem foar systemd-timesyncd is /etc/systemd/timesyncd.conf. Dit is in ienfâldich bestân mei minder opsjes ynskeakele dan de âlde NTP- en chronyd-tsjinsten. Hjir is de ynhâld fan dit bestân (sûnder ekstra wizigingen) op myn Fedora firtuele masine:

#  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

De ienige seksje dy't it befettet oars as opmerkings is [Tiid]. Alle oare rigels wurde kommentearre út. Dit binne de standertwearden en hoege net te feroarjen (útsein as jo in reden hawwe om dit te dwaan). As jo ​​gjin NTP-tiidtsjinner hawwe definieare yn 'e NTP=-rigel, set Fedora standert op de Fedora-fallback-tiidtsjinner. Ik foegje normaal myn tiidserver ta:

NTP=myntpserver

Timesync útfiere

Jo kinne systemd-timesyncd sa aktyf begjinne en meitsje:

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

It ynstellen fan de hardwareklok

Dit is hoe't de situaasje derút sjocht nei it útfieren fan 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    

Yn earste ynstânsje is it ferskil tusken RTC en lokale tiid (EDT) minder dan in sekonde, en de diskrepânsje nimt de kommende dagen mei noch in pear sekonden ta. Sûnt RTC hat gjin konsept fan tiidsônes, moat it kommando timedatectl in ferliking útfiere om de juste tiidsône te bepalen. As de RTC-tiid net krekt oerienkomt mei lokale tiid, dan komt it net oerien mei de lokale tiidsône.

Op syk nei mear ynformaasje, kontrolearre ik de status fan systemd-timesync en fûn dit:

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

Notysje it logberjocht dat seit dat de systeemtiid net ynsteld is of is weromset. De Timesync-tsjinst stelt de systeemtiid yn op basis fan in tiidstempel. Tiidstempels wurde ûnderhâlden troch de timesync-daemon en wurde makke elke kear as in suksesfolle syngronisaasje optreedt.

It kommando timedatectl hat net de mooglikheid om de hardwareklokwearde fan 'e systeemklok te nimmen. It kin allinich de tiid en datum ynstelle fan 'e wearde ynfierd op' e kommandorigel. Jo kinne de RTC op deselde wearde ynstelle as de systeemtiid mei it kommando 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

De opsje --localtime fertelt de hardwareklok om lokale tiid te sjen ynstee fan UTC.

Wêrom hawwe jo RTC hielendal nedich?

Elke NTP-ymplemintaasje sil de systeemklok ynstelle by it opstarten. En wêrom dan RTC? Dit is net hielendal wier: dit sil allinich barre as jo in netwurkferbining hawwe mei de tiidtsjinner. In protte systemen hawwe lykwols gjin konstante tagong ta in netwurkferbining, sadat in hardwareklok nuttich is, sadat Linux de systeemtiid op basis dêrfan ynstelle kin. Dit is better dan de tiid manuell yn te stellen, ek al kin it ôfwike fan echte tiid.

konklúzje

Dit artikel behannelt guon ark foar it behearen fan datum, tiid en tiidsônes. It systemd-timesyncd-ark biedt in NTP-kliïnt dy't de tiid op 'e lokale host syngronisearje kin mei in NTP-tsjinner. Systemd-timesyncd leveret lykwols gjin tsjinnertsjinst, dus as jo in NTP-tsjinner op jo netwurk nedich binne, moatte jo wat oars brûke - lykas Chrony - om as tsjinner op te treden.

Ik leaver in inkele ymplemintaasje te hawwen foar elke tsjinst op myn netwurk, dus ik brûk Chrony. As jo ​​​​gjin lokale NTP-tsjinner nedich hawwe of as jo it net slim hawwe om Chrony te brûken as de tsjinner en systemd-timesyncd as de SNTP-kliïnt. D'r is ommers gjin ferlet om ekstra funksjes fan Chrony as klant te brûken as jo tefreden binne mei de funksjonaliteit fan systemd-timesyncd.

In oare opmerking: jo binne net ferplichte om systemd-ark te brûken om NTP te ymplementearjen. Jo kinne in âldere ferzje fan ntpd, Chrony, of in oare NTP-ymplemintaasje brûke. Systemd bestiet ommers út in grut tal tsjinsten; in protte fan harren binne opsjoneel, sadat jo kinne útskeakelje se en brûk wat oars ynstee. Dit is net in enoarme monolityske meunster. Jo meie net leuk systemd of dielen dêrfan, mar jo moatte meitsje in ynformearre beslút.

I like systemd syn NTP ymplemintaasje, mar ik leaver Chrony omdat it past by myn behoeften better. It is Linux, baby -)

Oer de rjochten fan 'e advertinsje

VDSina biedt servers foar elke taak, in enoarme seleksje fan bestjoeringssystemen foar automatyske ynstallaasje, is it mooglik om elke OS fan jo eigen te ynstallearjen ISO, noflik kontrôle paniel eigen ûntwikkeling en deistige betelling. Lit ús jo herinnerje dat wy ivige servers hawwe dy't perfoarst tiidleas binne 😉

Linux Tiidsyngronisaasje: NTP, Chrony en systemd-timesyncd

Boarne: www.habr.com

Add a comment