Linux laiko sinchronizavimas: NTP, Chrony ir systemd-timesyncd

Linux laiko sinchronizavimas: NTP, Chrony ir systemd-timesyncd
Dauguma žmonių seka laiką. Keliamės laiku, kad atliktume rytinius ritualus ir eitume į darbą, padarome pietų pertrauką, laikomės projekto terminų, švenčiame gimtadienius ir šventes, sėdame į lėktuvą ir t.t.

Be to: kai kurie iš mūsų esame apsėsti laiko. Mano laikrodis maitinamas saulės energija ir tiksliai rodo laiką iš Nacionalinio standartų ir technologijų instituto (NIST) į Fort Collins, Koloradas per ilgųjų bangų radiją WWVB. Laiko signalai sinchronizuojami su atominiu laikrodžiu, kuris taip pat yra Fort Collins. Mano „Fitbit“ sinchronizuojasi su mano telefonu, kuris sinchronizuojasi su serveriu NTP, kuris galiausiai sinchronizuojasi su atominiu laikrodžiu.

Prietaisai taip pat seka laiką

Yra daug priežasčių, kodėl mūsų įrenginiams ir kompiuteriams reikia tikslaus laiko. Pavyzdžiui, bankininkystėje, akcijų rinkose ir kitose finansinėse įmonėse operacijos turi būti atliekamos tinkama tvarka, todėl tikslios laiko sekos yra labai svarbios.

Mūsų telefonams, planšetiniams kompiuteriams, automobiliams, GPS sistemoms ir kompiuteriams reikalingi tikslūs laiko ir datos nustatymai. Noriu, kad laikrodis mano kompiuterio darbalaukyje rodytų teisingą laiką. Noriu, kad priminimai vietiniame kalendoriuje būtų rodomi tinkamu laiku. Tinkamas laikas taip pat užtikrina, kad cron ir systemd užduotys būtų vykdomos tinkamu laiku.

Data ir laikas taip pat svarbūs registruojant žurnalą, todėl šiek tiek lengviau rasti tam tikrus žurnalus pagal datą ir laiką. Pavyzdžiui, kažkada dirbau „DevOps“ (tuo metu ji taip dar nebuvo vadinama) ir kūriau el. pašto sistemą Šiaurės Karolinos valstijoje. Per dieną apdorodavome daugiau nei 20 milijonų el. laiškų. Stebėti el. paštą per daugybę serverių arba nustatyti tikslią įvykių seką naudojant žurnalo failus, esančius geografiškai išsklaidytuose pagrindiniuose kompiuteriuose, gali būti daug lengviau, jei atitinkami kompiuteriai sinchronizuojami laiku.

Vieną kartą – daug valandų

„Linux“ prieglobos turi atsižvelgti į tai, kad yra sistemos laikas ir RTC laikas. RTC (Real Time Clock) yra šiek tiek keistas ir nelabai tikslus aparatinės įrangos laikrodžio pavadinimas.

Aparatūros laikrodis veikia nuolat, net kai kompiuteris yra išjungtas, naudojant sistemos pagrindinės plokštės bateriją. Pagrindinė RTC funkcija yra saugoti laiką, kai nėra ryšio su laiko serveriu. Tais laikais, kai nebuvo įmanoma prisijungti prie laiko serverio internetu, kiekvienas kompiuteris turėjo turėti tikslų vidinį laikrodį. Operacinės sistemos turėjo pasiekti RTC įkrovos metu, o vartotojas turėjo rankiniu būdu nustatyti sistemos laiką naudodamas BIOS aparatinės įrangos konfigūracijos sąsają, kad įsitikintų, jog jis teisingas.

Aparatinės įrangos laikrodžiai nesupranta laiko juostų sąvokos; RTC išsaugo tik laiką, o ne laiko juostą ar nuokrypį nuo UTC (koordinuotasis pasaulinis laikas, taip pat žinomas kaip GMT arba Grinvičo laikas). Galite įdiegti RTC naudodami įrankį, kurį aptarsiu vėliau šiame straipsnyje.

Sistemos laikas yra laikas, kurį OS rodo GUI laikrodyje darbalaukyje, datos komandos išvestyje, žurnalų laiko žymose. Tai taip pat taikoma, kai failai kuriami, modifikuojami ir atidaromi.

Puslapyje vyras už rtc yra pilnas RTC ir sistemos laikrodžio aprašymas.

Kas su NTP?

Kompiuteriai visame pasaulyje naudoja NTP (Network Time Protocol), kad sinchronizuotų savo laiką su standartiniais atskaitos laikrodžiais internetu, naudojant NTP serverių hierarchiją. Pagrindiniai laiko serveriai yra 1 lygyje ir yra tiesiogiai prijungti prie įvairių nacionalinių laiko tarnybų 0 lygyje per palydovą, radiją ar net modemus per telefono linijas. 0 sluoksnio laiko paslaugos gali būti atominis laikrodis, radijo imtuvas, suderintas pagal atominių laikrodžių siunčiamus signalus, arba GPS imtuvas, kuris naudoja labai tikslius GPS palydovų perduodamus laikrodžio signalus.

Didžioji dauguma atskaitos serverių turi kelis tūkstančius viešųjų NTP stratum 2 serverių, atvirų visuomenei. Daugelis organizacijų ir vartotojų (taip pat ir aš), turinčių daug pagrindinių kompiuterių, kuriems reikia NTP serverio, nusprendžia nustatyti savo laiko serverius, kad tik vienas vietinis kompiuteris pasiektų 2 arba 3 sluoksnį. Tada jie sukonfigūruoja likusius tinklo mazgus, kad naudotų vietinį laiko serveris. Mano namų tinklo atveju tai yra 3 lygio serveris.

Įvairūs NTP diegimai

Pradinis NTP įgyvendinimas yra ntpd. Tada prie jo prisijungė du naujesni, chronyd ir systemd-timesyncd. Visi trys sinchronizuoja vietinį pagrindinio kompiuterio laiką su NTP laiko serveriu. „Systemd-timesyncd“ paslauga nėra tokia patikima kaip „chronyd“, tačiau ji yra pakankamai gera daugeliui tikslų. Jei RTC nesinchronizuojamas, jis gali palaipsniui koreguoti sistemos laiką, kad sinchronizuotųsi su NTP serveriu, kai vietinės sistemos laikas šiek tiek nukrypsta. „Systemd-timesync“ paslauga negali būti naudojama kaip laiko serveris.

Chrony yra NTP diegimas, kuriame yra dvi programos: chronyd demonas ir komandų eilutės sąsaja, vadinama chronyc. Chrony turi keletą funkcijų, kurios yra būtinos daugeliu atvejų:

  • Chrony gali sinchronizuoti su laiko serveriu daug greičiau nei senoji ntpd paslauga. Tai tinka nešiojamiesiems ar staliniams kompiuteriams, kurie neveikia visą laiką.
  • Jis gali kompensuoti laikrodžio svyravimus, pvz., kai šeimininkas eina miegoti arba pereina miego režimą, arba kai laikrodis keičiasi dėl dažnio šuolio, dėl kurio laikrodžiai sulėtėja esant mažoms apkrovoms.
  • Jis išsprendžia laiko problemas, susijusias su nestabiliu tinklo ryšiu arba tinklo perkrova.
  • Jis reguliuoja tinklo vėlavimą.
  • Po pradinio laiko sinchronizavimo Chrony niekada nesustabdo laikrodžio. Tai suteikia stabilius ir nuoseklius daugelio sistemos paslaugų ir programų laiko intervalus.
  • Chrony gali veikti net be tinklo ryšio. Tokiu atveju vietinį pagrindinį kompiuterį arba serverį galima atnaujinti rankiniu būdu.
  • Chrony gali veikti kaip NTP serveris.

Vėlgi, NTP yra protokolas, kurį galima įdiegti Linux pagrindiniame kompiuteryje naudojant Chrony arba systemd-timesyncd.

NTP, Chrony ir systemd-timesyncd RPM yra standartinėse Fedora saugyklose. Systemd-udev RPM yra branduolio įvykių tvarkyklė, kuri yra įdiegta pagal numatytuosius nustatymus Fedoroje, bet yra neprivaloma.

Galite įdiegti visus tris ir perjungti juos, bet tai sukels papildomą galvos skausmą. Taigi geriau to nedaryti. Šiuolaikiniai „Fedora“, „CentOS“ ir „RHEL“ leidimai buvo perkelti į „Chrony“ kaip numatytąjį diegimą, be to, jie turi „systemd-timesyncd“. Manau, kad Chrony veikia gerai, suteikia geresnę sąsają nei NTP paslauga, suteikia daug daugiau informacijos ir valdymo, o tai tikrai patiks sistemos administratoriams.

NTP paslaugų išjungimas

NTP paslauga gali jau veikti jūsų pagrindiniame kompiuteryje. Jei taip, prieš pereidami prie kažko kito, turite jį išjungti. „Chronyd“ veikė, todėl naudoju šias komandas, kad sustabdyčiau ir išjungčiau. Vykdykite atitinkamas komandas bet kuriam NTP demonui, kurį naudojate savo pagrindiniame kompiuteryje:

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

Patikrinkite, ar paslauga sustabdyta ir išjungta:

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

Būsenos patikrinimas prieš paleidimą

Sistemos laikrodžio sinchronizavimo būsena leidžia nustatyti, ar veikia NTP paslauga. Kadangi dar nepaleidote NTP, komanda timeync-status parodys tai:

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

Tiesioginė būsenos užklausa suteikia svarbios informacijos. Pavyzdžiui, komanda timedatectl be argumentų ar parinkčių pagal numatytuosius nustatymus vykdo būsenos antrinę komandą:

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

Taip gausite vietos prieglobos laiką, UTC laiką ir RTC laiką. Šiuo atveju sistemos laikas nustatomas pagal Amerikos / Niujorko (TZ) laiko juostą, RTC nustatytas pagal vietos laiko juostą, o NTP paslauga neaktyvi. RTC laikas pradėjo šiek tiek skirtis nuo sistemos laiko. Tai normalu sistemoms, kurių laikrodžiai nebuvo sinchronizuoti. Pagrindinio kompiuterio kompensavimo dydis priklauso nuo laiko, praėjusio nuo paskutinio sistemos sinchronizavimo.

Taip pat gavome įspėjimą apie vietinio laiko naudojimą RTC – tai taikoma keičiant laiko juostą ir DST nustatymus. Jei kompiuteris išjungiamas, kai reikia atlikti pakeitimus, RTC nepasikeis. Tačiau serveriams ar kitiems pagrindiniams kompiuteriams, kurie veikia visą parą, tai nėra problema. Be to, bet kuri paslauga, teikianti NTP laiko sinchronizavimą, koreguoja pagrindinio kompiuterio laiką pradinio paleidimo fazės metu, todėl laikas vėl bus teisingas, kai paleidimas bus baigtas.

Laiko juostos nustatymas

Paprastai laiko juostą nurodote diegimo metu, o vėliau jos keisti nebereikia. Tačiau kartais reikia pakeisti laiko juostą. Yra keletas įrankių, kurie gali padėti. „Linux“ naudoja laiko juostos failus, kad nustatytų vietinę pagrindinio kompiuterio laiko juostą. Šie failai yra kataloge /usr/share/zoneinfo. Pagal numatytuosius nustatymus mano laiko juostai sistema nurodo taip: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Tačiau norint pakeisti laiko juostą, tokių subtilybių žinoti nereikia.

Svarbiausia žinoti oficialų savo vietos laiko juostos pavadinimą ir atitinkamą komandą. Tarkime, kad norite pakeisti laiko juostą į Los Andželą:


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

Dabar galite nustatyti laiko juostą. Pakeitimams patikrinti naudojau komandą date, bet taip pat galite naudoti 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 ~]#

Dabar galite pakeisti šeimininko laiko juostą atgal į vietos laiką.

systemd-timesyncd

Sistemos laiko sinchronizavimo demonas suteikia NTP diegimą, kurį lengva valdyti sistemos kontekste. Pagal numatytuosius nustatymus jis įdiegtas „Fedora“ ir „Ubuntu“. Tačiau pagal numatytuosius nustatymus jis paleidžiamas tik Ubuntu. Nesu tikras dėl kitų platinimų. Galite patikrinti patys:

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

Konfigūruojama systemd-timesyncd

Systemd-timesyncd konfigūracijos failas yra /etc/systemd/timesyncd.conf. Tai paprastas failas su mažiau įjungtų parinkčių nei senosios NTP ir chronyd paslaugos. Štai šio failo turinys (be papildomų pakeitimų) mano 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

Vienintelis skyrius, kuriame, be komentarų, yra [Laikas]. Visos kitos eilutės komentuojamos. Tai yra numatytosios reikšmės ir neturėtų būti keičiamos (nebent turite priežasčių). Jei neturite NTP laiko serverio, apibrėžto NTP= eilutėje, „Fedora“ pagal numatytuosius nustatymus pasirenka atsarginį „Fedora“ laiko serverį. Paprastai pridedu savo laiko serverį:

NTP=myntpserver

Veikia laiko sinchronizavimas

Galite paleisti ir suaktyvinti systemd-timesyncd taip:

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

Aparatūros laikrodžio nustatymas

Štai kaip atrodo situacija paleidus timeyncd:

[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    

Iš pradžių skirtumas tarp RTC ir vietinio laiko (EDT) yra mažesnis nei sekundė, o per ateinančias kelias dienas neatitikimas padidėja dar pora sekundžių. Kadangi RTC nėra laiko juostų sąvokos, komanda timedatectl turi atlikti palyginimą, kad nustatytų teisingą laiko juostą. Jei RTC laikas tiksliai nesutampa su vietiniu laiku, jis taip pat nesutampa su vietine laiko juosta.

Ieškodamas daugiau informacijos, patikrinau systemd-timesync būseną ir radau tai:

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

Atkreipkite dėmesį į žurnalo pranešimą, kuriame sakoma, kad sistemos laikas nenustatytas arba nustatytas iš naujo. „Timesync“ paslauga nustato sistemos laiką pagal laiko žymą. Laiko žymes palaiko laiko sinchronizavimo demonas ir jos sukuriamos kiekvieną kartą sėkmingai sinchronizuojant.

Komanda timedatectl negali paimti aparatūros laikrodžio vertės iš sistemos laikrodžio. Jis gali nustatyti tik komandinėje eilutėje įvestą laiką ir datą. Galite nustatyti RTC tokią pačią reikšmę kaip ir sistemos laikas, naudodami komandą 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

Parinktis --localtime nurodo aparatūros laikrodiui rodyti vietinį laiką, o ne UTC.

Kam išvis reikalingas RTC?

Bet koks NTP diegimas nustatys sistemos laikrodį paleidimo metu. Ir kodėl tada RTC? Tai nėra visiškai tiesa: taip atsitiks tik tuo atveju, jei turėsite tinklo ryšį su laiko serveriu. Tačiau daugelis sistemų ne visada turi prieigą prie tinklo ryšio, todėl aparatinės įrangos laikrodis yra naudingas Linux sistemoje nustatant sistemos laiką. Tai geriau nei nustatyti laiką rankiniu būdu, net jei jis gali nukrypti nuo realaus laiko.

išvada

Šiame straipsnyje apžvelgti kai kurie įrankiai, skirti manipuliuoti data, laiku ir laiko juostomis. Systemd-timesyncd įrankis suteikia NTP klientą, kuris gali sinchronizuoti laiką vietiniame pagrindiniame kompiuteryje su NTP serveriu. Tačiau systemd-timesyncd neteikia serverio paslaugos, todėl jei tinkle reikia NTP serverio, turite naudoti ką nors kitą, pvz., Chrony, kad veiktų kaip serveris.

Norėčiau, kad bet kuri tinklo paslauga būtų įdiegta vieną kartą, todėl naudoju Chrony. Jei jums nereikia vietinio NTP serverio arba jei neprieštaraujate naudoti Chrony kaip serverį ir systemd-timesyncd kaip SNTP klientą. Galų gale, nereikia naudoti papildomų Chrony funkcijų kaip klientui, jei esate patenkinti systemd-timesyncd funkcionalumu.

Kita pastaba: NTP įdiegti nereikia naudoti sisteminių įrankių. Galite naudoti senesnę ntpd, Chrony ar kitą NTP versiją. Juk systemd susideda iš daugybės paslaugų; daugelis jų yra neprivalomi, todėl galite juos išjungti ir vietoj jų naudoti ką nors kita. Tai nėra didžiulis monolitinis monstras. Jums gali nepatikti sistema ar jos dalys, tačiau turėtumėte priimti pagrįstą sprendimą.

Man patinka systemd įdiegtas NTP, bet man labiau patinka Chrony, nes jis labiau atitinka mano poreikius. Tai Linux, vaikeli -)

Dėl reklamos teisių

VDSina siūlo serveriai bet kokiai užduočiai atlikti, didžiulis operacinių sistemų pasirinkimas automatiniam diegimui, galima įdiegti bet kurią OS iš savo ISO, patogus valdymo pultas savo vystymąsi ir kasdienį mokėjimą. Prisiminkite, kad turime amžinus serverius, kurie tikrai yra nesenstantys 😉

Linux laiko sinchronizavimas: NTP, Chrony ir systemd-timesyncd

Šaltinis: www.habr.com

Добавить комментарий