Laika sinhronizācija Linux: NTP, Chrony un systemd-timesyncd

Laika sinhronizācija Linux: NTP, Chrony un systemd-timesyncd
Vairums cilvēku seko laikam. Mēs pieceļamies laikā, lai veiktu mūsu rīta rituālus un dotos uz darbu, paņemtu pusdienu pārtraukumu, ievērotu projekta termiņus, svinētu dzimšanas dienas un svētkus, lidotu un tā tālāk.

Turklāt: daži no mums ir apdullināti ar laiku. Manas pulksteņi darbojās ar saules enerģiju un saņem precīzu laiku no Nacionālā standartu un tehnoloģiju institūta (NIST) Fortkolinsā (Kolorādo štatā) caur garām viļņu radiostaciju WWVB. Laika signāli tiek sinhronizēti ar atomtēmekļiem, kas arī atrodas Fortkolinsā. Mans Fitbit sinhronizējas ar manu telefonu, kurš sinhronizējas ar serveri NTP, kas galu galā sinhronizējas ar atomtēmekļiem.

Ierīces arī seko laikam.

Ir daudz iemeslu, kāpēc mūsu ierīcēm un datoriem ir nepieciešams precīzs laiks. Piemēram, banku nozarē, akciju tirgos un citās finanšu iestādēs darījumi jāveic pareizā secībā, un tam ir kritiski svarīgas precīzas laika secības.

Mūsu telefoni, planšetdatori, automašīnas, GPS sistēmas un datori prasa precīzu laika un datuma iestatījumu. Es gribu, lai datora darba virsmas pulkstenis rādītu pareizu laiku. Es gribu, lai manā lokālajā kalendārā atgādinājumi parādītos pareizajā laikā. Pareizais laiks arī garantē, ka cron un systemd uzdevumi tiek uzsākti pareizajā laikā.

Datums un laiks ir svarīgi arī žurnālu veidošanā, tāpēc ir nedaudz vieglāk atrast noteiktus žurnālus, orientējoties pēc datuma un laika. Piemēram, kādu reizi es strādāju DevOps (tālaik to vēl nepareizi nosauca) un nodarbojos ar elektronisko pasta sistēmu iestatīšanu Ziemeļkarolīnā. Agrāk mēs apstrādājām vairāk nekā 20 miljonus ziņu dienā. Izsekošana elektroniskajiem pasta ziņojumiem caur sēriju serveriem vai precīzas notikumu secības noteikšana, izmantojot žurnālu failus ģeogrāfiski izkliedētos viesnīcās, var būt daudz vieglāka, ja attiecīgie datori ir sinhronizēti laikā.

Laiks ir vienāds, pulksteņi ir daudz.

Linux viesnīcām jāņem vērā, ka pastāv sistēmas laiks un RTC laiks. RTC (Real Time Clock - reālā laika pulksteņi) ir nedaudz dīvains un ne īpaši precīzs nosaukums aparatūras pulksteņiem.

Aparātu pulksteņi darbojas nepārtraukti, pat ja dators ir izslēgts, izmantojot sistēmas mātesplates akumulatoru. Galvenā RTC funkcija ir saglabāt laiku, kad savienojums ar laika serveri nav pieejams. Laikos, kad nebija iespējams pieslēgties laika serverim caur internetu, katram datoram vajadzēja būt precīziem iekšējiem pulksteņiem. Operētājsistēmām bija jāveic RTC piekļuve, kad dators tika ielādēts, un lietotājam manuāli bija jāpiesakās sistēmas laikam, izmantojot BIOS konfigurācijas aparatūras saskarni, lai pārliecinātos, ka tas ir pareizs.

Aparātu pulksteņi nesaprot laika joslu koncepciju; RTC tikai uzglabā laiku, nevis laika joslu vai novirzi no UTC (Koordinētā pasaules laika, kas arī pazīstams kā GMT vai Griniča vidējais laiks). Jūs varat iestatīt RTC, izmantojot rīku, par kuru es pastāstīšu vēlāk šajā rakstā.

Sistēmas laiks ir tas laiks, ko operētājsistēma attēlo GUI pulksteņos uz jūsu darbvirsmas, komandas date izejas rezultātos, žurnālu laika zīmēs. Tas attiecas arī uz failu izveides, izmaiņu un atvēršanas laiku.

Lapas sadaļā man par rtc ir pilnīgs RTC un sistēmas pulksteņu apraksts.

Kas ir NTP?

Datori visā pasaulē izmanto NTP (tīkla laika protokols), lai sinhronizētu savu laiku ar standartizētajiem atsauces pulksteņiem caur internetu, izmantojot NTP serveru hierarhiju. Galvenie laika serveri atrodas 1. līmenī, un tie ir tieši savienoti ar dažādām valsts laika pakalpojumiem 0. līmenī, izmantojot satelītu, radio vai pat modemus caur tālruņa līnijām. 0. līmeņa laika pakalpojumi var būt atomu pulksteņi, radio uztvērēji, kas iestatīti uz signāliem, ko pārraida atomu pulksteņi, vai GPS uztvērēji, kas izmanto augsti precīzus laika signālus, ko pārraida GPS satelīti.

Lielākajā daļā etalona serveru ir pieejami vairāki tūkstoši publisku NTP stratum 2 serveru, kas ir pieejami visiem. Daudzas organizācijas un lietotāji (tai skaitā es) ar daudziem viesu datoriem, kuriem nepieciešams NTP serveris, dod priekšroku uzstādīt savus laika serverus, tādējādi tikai viens vietējais viesdators apmeklē stratum 2 vai 3. Pārējie tīkli tiek konfigurēti, lai izmantotu vietējo laika serveri. Manā mājas tīklā tas ir 3. līmeņa serveris.

Atšķirīgas NTP īstenošanas

Sākotnējā NTP īstenošana ir ntpd. Pēc tam tam pievienojās divas jaunākas versijas, chronyd un systemd-timesyncd. Visi trīs sinhronizē vietējā viesdatora laiku ar NTP laika serveri. Pakalpojums systemd-timesyncd nav tik uzticams kā chronyd, taču tas ir pietiekami lielākajai daļai mērķu. Ja RTC nav sinhronizēts, tas var pakāpeniski koriģēt sistēmas laiku, lai sinhronizētos ar NTP serveri, kad vietējais sistēmas laiks nedaudz atkāpjas. Pakalpojums systemd-timesync nevar tikt izmantots kā laika serveris.

Chrony — ir NTP īstenošana, kas satur divas programmas: chronyd demon un komandrindas interfeisu, ko sauc par chronyc. Chrony ir dažas funkcijas, kas daudzu gadījumu dēļ ir vienkārši neaizvietojamas:

  • Chrony var sinhronizēties ar laika serveri daudz ātrāk nekā vecais ntpd pakalpojums. Tas ir labi portatīvajiem datoriem vai galddatoriem, kas nedarbojas nepārtraukti.
  • Tas var kompensēt pulksteņa frekvences svārstības, piemēram, kad viesdators pāriet uz miega režīmu vai kad frekvence mainās dēļ pēkšņas frekvences izmaiņas, kas palēnina pulksteņa frekvences zemas slodzes laikā.
  • Tas risina problēmas ar laiku, kas saistītas ar nestabilu tīkla savienojumu vai tīkla noslodzi.
  • Tas regulē aiztures tīklā.
  • Pēc sākotnējās laika sinhronizācijas Chrony nekad neapstājas. Tas nodrošina stabilus un saskaņotus laika intervālus daudzām sistēmas pakalpojumu un lietotņu vajadzībām.
  • Chrony var darboties pat bez tīkla savienojuma. Šajā gadījumā vietējo viesdatoru vai serveri var atjaunināt manuāli.
  • Chrony var darboties kā NTP serveris.

Vēlreiz: NTP ir protokols, ko var realizēt Linux hostā, izmantojot Chrony vai systemd-timesyncd.

RPM pakotnes NTP, Chrony un systemd-timesyncd ir pieejamas standarta Fedora repozitorijos. RPM systemd-udev ir kodola notikumu pārvaldnieks, kas Fedora noklusējuma iestatījumos ir instalēts, bet nav obligāts.

Jūs varat instalēt visus trīs un pāriet starp tiem, bet tas radīs liekas neērtības. Tādēļ labāk to nedarīt. Mūsdienu Fedora, CentOS un RHEL laidieni ir pārgājuši uz Chrony kā standarta realizāciju, un papildus tam viņiem ir arī systemd-timesyncd. Manuprāt, Chrony darbojas labi, nodrošina labāku saskarni nekā NTP pakalpojums, piedāvā daudz vairāk informācijas un palielina kontroli, kas noteikti patiks sistēmas administratoriem.

NTP pakalpojumu atspējošana

Iespējams, jūsu hostā jau darbojas NTP pakalpojums. Ja tā ir, jums tas jāatspējo pirms pāriešanas uz kaut ko citu. Man bijis palaists chronyd, tāpēc izmantoju šādas komandas, lai to apturētu un atspējotu. Palaižiet atbilstošās komandas jebkuram NTP demonam, ko izmantojat savā hostā:

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

Pārliecinieties, ka pakalpojums ir pārtraukts un atspējots:

[root@testvm1 ~]# systemctl status chronyd
● chronyd.service - NTP klients/serveris
     Ielādēts: ielādēts (/usr/lib/systemd/system/chronyd.service; atspējots; piegādātāja noklusējuma iestatījums: ieslēgts)
     Aktīvs: neaktīvs (miris)
       Dokumentācija: man:chronyd(8)
             man:chrony.conf(5)
[root@testvm1 ~]#

Statusa pārbaude pirms palaišanas

Sistēmas laika sinhronizācijas statuss ļauj noteikt, vai NTP pakalpojums darbojas. Tā kā jūs vēl neesat palaidis NTP, komanda timesync-status norādīs uz to:

[root@testvm1 ~]# timedatectl timesync-status
Neizdevās vaicāt serverim: nevarēja aktivizēt attālo partneri.

Tieša statusa vaicājuma izpilde sniedz svarīgu informāciju. Piemēram, komanda timedatectl bez argumentiem vai parametriem pēc noklusējuma izpilda apakškomandu 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 ~]#

Tādējādi jūs iegūsiet vietējo laiku jūsu hostam, UTC laiku un RTC laiku. Šajā gadījumā sistēmas laiks ir iestatīts uz laika joslu America/New_York (TZ), RTC ir iestatīts uz vietējo laika joslu, un NTP pakalpojums nav aktīvs. RTC laiks sāk nedaudz atšķirties no sistēmas laika. Tas ir normāli sistēmām, kuru pulksteņi nav sinhronizēti. Novirzes apjoms hostā ir atkarīgs no laika, kas pagājis kopš pēdējās sistēmas sinhronizācijas.

Mēs arī saņēmām brīdinājumu par vietējā laika izmantošanu RTC — tas attiecas uz laika joslas izmaiņām un vasaras laika iestatījumiem. Ja dators tiek izslēgts tajā brīdī, kad ir jāveic izmaiņas, RTC laiks nemainīsies. Taču serveriem vai citiem hostiem, kas darbojas visu diennakti, tas nemaz nav problēma. Turklāt jebkura NTP laika sinhronizācijas pakalpojums koriģēs hosta laiku jau sākuma fāzē, tādēļ pēc palaišanas laiks atkal kļūs pareizs.

Laika joslas iestatīšana

Parasti jūs norādāt laika joslu instalācijas laikā, un jums nav jāpārmaina tā vēlāk. Tomēr ir gadījumi, kad ir nepieciešams mainīt laika joslu. Ir vairāki rīki, kas var palīdzēt. Lai noteiktu vietējo laika joslu, Linux hosti izmanto laika joslu failus. Šie faili atrodas katalogā /usr/share/zoneinfo. Noklusējuma iestatījumos mana laika josla tiek ierakstīta šādi: /etc/ localtime -> ../usr/share/zoneinfo/America/New_York. Bet jums nav jāzina šādas nianses, lai mainītu laika joslu.

Galvenais ir zināt oficiālo laika joslas nosaukumu jūsu atrašanās vietai un attiecīgo komandu. Teiksim, jūs vēlaties mainīt laika joslu uz Losandželosu:


[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

Tagad jūs varat iestatīt laika joslu. Es izmantoju komandu date, lai pārbaudītu izmaiņas, bet jūs varat izmantot arī timedatectl:

[root@testvm2 ~]# date
Otr 19. maijs 2020 04:47:49 PM EDT
[root@testvm2 ~]# timedatectl set-timezone America/Los_Angeles
[root@testvm2 ~]# date
Otr 19. maijs 2020 01:48:23 PM PDT
[root@testvm2 ~]#

Tagad jūs varat mainīt sava hosta laika joslu uz vietējo laiku.

systemd-timesyncd

Systemd timesync demons nodrošina NTP īstenojumu, kuru ir viegli pārvaldīt systemd kontekstā. Tas tiek instalēts pēc noklusējuma Fedora un Ubuntu. Tomēr tas pēc noklusējuma tiek palaists tikai Ubuntu. Es neesmu pārliecināts par citiem distributīviem. Jūs varat to pārbaudīt pats:

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

Systemd-timesyncd konfigurēšana

Systemd-timesyncd konfigurācijas fails ir /etc/systemd/timesyncd.conf. Tas ir vienkāršs fails ar mazāku iekļauto opciju skaitu nekā vecajiem NTP un chronyd pakalpojumiem. Šeit ir šī faila saturs (bez papildu izmaiņām) manā Fedora virtuālajā mašīnā:

#  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

Vienīgā sadaļa, kas tajā ir iekļauta, izņemot komentārus, ir [Time]. Visas pārējās rindas ir komentētas. Tas ir noklusējuma vērtību kopums, ko nevajag mainīt (ja tam nav iemesla). Ja jums nav NTP laika servera, kas ir definēts NTP = rindā, Fedora pēc noklusējuma izmanto Fedora rezerves laika serveri. Es parasti pievienoju savu laika serveri:

NTP=myntpserver

Timesync palaišana

Palaist un aktivizēt systemd-timesyncd var šādi:

[root@testvm2 ~]# systemctl enable systemd-timesyncd.service
Izveidots symlink /etc/systemd/system/dbus-org.freedesktop.timesync1.service → /usr/lib/systemd/system/systemd-timesyncd.service.
Izveidots 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 ~]#

Datoru pulksteņu iestatīšana

Šādi izskatās situācija pēc timesyncd palaišanas:

[root@testvm2 systemd]# timedatectl
               Vietējais laiks: Sāt 2020-05-16 14:34:54 EDT  
           Universālais laiks: Sāt 2020-05-16 18:34:54 UTC  
                 RTC laiks: Sāt 2020-05-16 14:34:53      
                Laika josla: America/New_York (EDT, -0400)
Sistēmas pulkstenis sinhronizēts: jā                          
              NTP pakalpojums: aktīvs                      
          RTC vietējā TZ: nē    

Sākotnēji starp RTC un vietējo laiku (EDT) atšķirība nepārsniedz sekundi, un atkāpe pieaug vēl par dažām sekundēm nākamo dienu laikā. Ņemot vērā, ka RTC neatzīst laika zonas, komandai timedatectl jāveic salīdzināšana, lai noteiktu nepieciešamo laika zonu. Ja RTC laiks precīzi neatbilst vietējam laikam, tas nozīmē, ka tas neatbilst arī vietējai laika zonai.

Meklējot papildu informāciju, es pārbaudīju systemd-timesync stāvokli un atklāju sekojošo:

[root@testvm2 systemd]# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Tīkla laika sinhronizācija
     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: "Sākotnējā sinhronizācija uz laika serveri 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]: Sāk tīkla laika sinhronizāciju...
May 16 09:57:24 testvm2.both.org systemd-timesyncd[822]: Sistēmas pulksteņa laiks nav iestatīts vai samazināts, atjaunojot no ierakstītā laika zīmogiem: Sat 2020-05-16 13:56:53 EDT
May 16 13:56:53 testvm2.both.org systemd[1]: Sākta tīkla laika sinhronizācija.
May 16 13:57:56 testvm2.both.org systemd-timesyncd[822]: Sākotnējā sinhronizācija uz laika serveri 163.237.218.19:123 (2.fedora.pool.ntp.org).
[root@testvm2 systemd]#

Pievērsiet uzmanību žurnāla ziņojumam, kurā teikts, ka sistēmas laiks nav iestatīts vai atgriezts atpakaļ. Timesync serviss iestata sistēmas laiku, pamatojoties uz laika zīmogiem. Laika zīmogus atbalsta timesync demons un tie tiek izveidoti katru reizi, kad notiek veiksmīga sinhronizācija.

Komanda timedatectl nevar ņemt aparatūras pulksteņa vērtību no sistēmas pulksteņa. Tā var iestatīt laiku un datumu tikai no komandrindā ievadītās vērtības. Jūs varat iestatīt RTC uz to pašu vērtību kā sistēmas laiks, izmantojot komandu hwclock:

[root@testvm2 ~]# /sbin/hwclock --systohc --localtime
[root@testvm2 ~]# timedatectl
               Vietējais laiks: Mon 2020-05-18 13:56:46 EDT  
           Universālais laiks: Mon 2020-05-18 17:56:46 UTC  
                 RTC laiks: Mon 2020-05-18 13:56:46      
                Laika zona: America/New_York (EDT, -0400)
Sistēmas pulkstenis sinhronizēts: jā                          
              NTP serviss: aktīvs                      
          RTC lokalizētajā TZ: jā

Opcija —localtime norāda, ka aparatūras pulksteņi rāda vietējo laiku, nevis UTC.

Kāpēc jums vispār ir nepieciešams RTC?

Jebkura NTP īstenošana iestatīs sistēmas pulksteņus palaišanas laikā. Un kāpēc tad RTC? Tas nav gluži tā: tas notiks tikai tad, ja jums ir tīkla savienojums ar laika serveri. Tomēr daudzas sistēmas nevar nodrošināt nepārtrauktu piekļuvi tīkla savienojumam, tāpēc aparatūras pulksteņi ir noderīgi, lai Linux varētu balstīties uz tiem, nosakot sistēmas laiku. Tas ir labāk nekā laika iestatīšana manuāli, pat ja tas var novirzīties no reālā laika.

Secinājums

Šajā rakstā tiek aplūkoti daži rīki datuma, laika un laika zonu pārvaldībai. Rīks systemd-timesyncd nodrošina NTP klientu, kurš var sinhronizēt laiku lokālajā datorā ar NTP serveri. Tomēr systemd-timesyncd nepiedāvā servera pakalpojumu, tāpēc, ja jums nepieciešams NTP serveris jūsu tīklā, jums jādara kaut kas cits — piemēram, jāizmanto Chrony, lai strādātu kā serveris.

Es dodu priekšroku tam, lai man būtu viena īstenošana visiem pakalpojumiem manā tīklā, tāpēc izmantoju Chrony. Ja jums nav nepieciešams lokāls NTP serveris vai ja neiebilstat izmantot Chrony kā serveri un systemd-timesyncd kā SNTP klientu. Galu galā nav nepieciešams izmantot Chrony kā klientam papildu iespējas, ja jūs esat apmierināts ar systemd-timesyncd funkcionalitāti.

Vēl viens piezīme: jums nav pienākuma izmantot systemd rīkus NTP īstenošanai. Jūs varat izmantot vecāku versiju ntpd, Chrony vai citu NTP īstenošanu. Galu galā systemd sastāv no daudziem pakalpojumiem; daudzus no tiem var izslēgt, un to vietā var izmantot ko citu. Tas nav milzīgs monolīts briesmonis. Jūs varat nepatikt systemd vai tā daļām, bet jums ir jāpieņem pamatots lēmums.

Man patīk NTP īstenošana systemd, bet es dodu priekšroku Chrony, jo tas labāk atbilst manām vajadzībām. Tas ir Linux, mazulīt -)

Reklāmas tiesībās

VDSina piedāvā serverus jebkuriem uzdevumiem, milzīgu operētājsistēmu izvēli automātiskai instalēšanai, ir iespēja instalēt jebkuru OS no sava ISO, ērta vadības paneļa pašu izstrāde un maksājums pa dienām. Atgādinām, ka mums ir mūžīgie serveri, kas noteikti nav laika varā 😉

Laika sinhronizācija Linux: NTP, Chrony un systemd-timesyncd

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster