Synchronizácia času v Linuxe: NTP, Chrony a systemd-timesyncd

Synchronizácia času v Linuxe: NTP, Chrony a systemd-timesyncd
Väčšina ľudí sleduje čas. Vstávame načas, aby sme vykonali naše ranné rituály a vyrazili do práce, urobili si prestávku na obed, dodržali termíny projektov, oslavovali narodeniny a sviatky, nastúpili na let a tak ďalej.

Navyše: niektorí z nás sú posadnutí časom. Moje hodinky sú napájané solárnou energiou a získavajú presný čas z Národného inštitútu štandardov a technológií (NIST) vo Fort Collins (štát Colorado) prostredníctvom dlhých vlnových rádiových signálov. WWVB. Signály času sú synchronizované s atómovými hodinami, ktoré sa tiež nachádzajú vo Fort Collins. Môj Fitbit sa synchronizuje s mojím telefónom, ktorý sa synchronizuje so serverom NTP, ktorý sa nakoniec synchronizuje s atómovými hodinami.

Zariadenia tiež sledujú čas.

Existuje množstvo dôvodov, prečo naše zariadenia a počítače potrebujú presný čas. Napríklad v bankovníctve, na burzách a v iných finančných podnikoch musia byť transakcie vykonávané v správnom poradí, a k tomu sú kriticky dôležité presné časové sekvencie.

Naše telefóny, tablety, automobily, GPS systémy a počítače vyžadujú presné nastavenie času a dátumu. Chcem, aby hodiny na ploche môjho počítača ukazovali správny čas. Chcem, aby sa v mojom lokálnom kalendári pripomienky objavili v správnom čase. Správny čas tiež zabezpečuje, že úlohy cron a systemd sa spúšťajú v správnom čase.

Dátum a čas sú tiež dôležité pre zaznamenávanie, čím je o niečo jednoduchšie nájsť určité logy na základe dátumu a času. Napríklad raz som pracoval v DevOps (v tom čase sa to tak ešte nenazývalo) a venoval som sa nastaveniu e-mailového systému v Severnej Karolíne. Predtým sme spracovávali viac ako 20 miliónov e-mailov denne. Sledovať e-maily cez sériu serverov alebo určiť presný sled udalostí pomocou súborov logov na geograficky rozptýlených hostiteľoch môže byť omnoho jednoduchšie, ak sú príslušné počítače synchronizované po čase.

Čas je jeden — hodín je mnoho.

Linuxové hostiteľské systémy musia brať do úvahy, že existuje systémový čas a RTC čas. RTC (Real Time Clock — hodiny reálneho času) je trochu zvláštne a nie veľmi presné označenie pre hardvérové hodiny.

Hardwarové hodiny pracujú nepretržite, aj keď je počítač vypnutý, používajúc batériu na základnej doske systému. Hlavnou funkciou RTC je uchovávať čas, keď nie je dostupné pripojenie k časovému serveru. V časoch, keď nebolo možné pripojiť sa k časovému serveru cez internet, mal každý počítač mať presné vnútorné hodiny. Operačné systémy museli pri štarte pristupovať k RTC a používateľ musel manuálne nastaviť systémový čas pomocou hardvérového rozhrania konfigurácie BIOS, aby sa zabezpečilo, že je správny.

Hardwarové hodiny nechápu koncept časových pásiem; v RTC sa uchováva iba čas, nie časové pásmo alebo odchýlka od UTC (univerzálny koordinovaný čas, ktorý je tiež známy ako GMT alebo stredný čas greenwichský). RTC môžete nastaviť pomocou nástroja, o ktorom poviem neskôr v tomto článku.

Systémový čas je čas, ktorý operačný systém zobrazuje na hodinách GUI na vašej pracovnej ploche, vo výstupoch príkazu date, v časových pečiatkach protokolov. Týka sa to aj času vytvorenia, zmeny a otvorenia súborov.

Na stránke man pre rtc existuje úplný popis RTC a systémových hodín.

Čo je s NTP?

Počítače po celom svete používajú NTP (protokol synchronizácie času) na synchronizáciu svojho času so štandardnými referenčnými hodinami cez internet pomocou hierarchie serverov NTP. Hlavné časové servery sú na úrovni 1 a sú priamo pripojené k rôznym národným časovým službám na úrovni 0 cez satelit, rádio alebo dokonca modemy cez telefónne linky. Služby času na úrovni 0 môžu byť atómové hodiny, rádiový prijímač, ktorý je nastavený na signály prenášané atómovými hodinami, alebo GPS prijímač používajúci vysoko presné signály hodín prenášané satelitmi GPS.

Na prevažne väčšine referenčných serverov je otvorených niekoľko tisíc verejných NTP serverov stratum 2, ktoré sú dostupné pre všetkých. Mnohé organizácie a používatelia (vrátane mňa) s veľkým počtom hostiteľov, ktorí potrebujú NTP server, preferujú nastavenie vlastných časových serverov, takže len jeden miestny hostiteľ sa pripája k stratum 2 alebo 3. Potom nastavujú zvyšné uzly v sieti na používanie miestneho časového servera. V prípade mojej domácej siete je to server úrovne 3.

Rôzne implementácie NTP

Pôvodná implementácia NTP je ntpd. Potom sa k nej pridali dve novšie, chronyd a systemd-timesyncd. Všetky tri synchronizujú čas lokálneho hostiteľa so serverom času NTP. Služba systemd-timesyncd nie je taká spoľahlivá ako chronyd, ale je dostatočná pre väčšinu účelov. Ak RTC nie je synchronizovaný, môže postupne upraviť systémový čas, aby sa synchronizoval so serverom NTP, keď sa lokálny systémový čas mierne posunie. Služba systemd-timesync nemôže byť použitá ako časový server.

Chrony — je implementácia NTP, ktorá obsahuje dva programy: démon chronyd a príkazový riadok nazvaný chronyc. Chrony má niektoré funkcie, ktoré sú v mnohých prípadoch prakticky nenahraditeľné:

  • Chrony sa môže synchronizovať so serverom času oveľa rýchlejšie ako stará služba ntpd. To je dobré pre prenosné počítače alebo stolové počítače, ktoré nepracujú nepretržite.
  • Môže kompenzovať kolísania taktovacích frekvencií, napríklad keď sa hostiteľ prepne do režimu spánku alebo keď taktovacia frekvencia kolíše v dôsledku skokových zmien frekvencie, ktoré spomaľujú taktovacie frekvencie pri nízkych záťažiach.
  • Rieši problémy s časom spojené s nestabilným sieťovým pripojením alebo preťažením siete.
  • Reguluje oneskorenia v sieti.
  • Po počiatočnej synchronizácii času Chrony nikdy nezastaví hodiny. To zabezpečuje stabilné a konzistentné časové intervaly pre mnohé systémové služby a aplikácie.
  • Chrony môže fungovať aj bez pripojenia k sieti. V tomto prípade môže byť miestny hostiteľ alebo server aktualizovaný manuálne.
  • Chrony môže fungovať ako NTP server.

Ešte raz: NTP je protokol, ktorý môže byť implementovaný na hostiteľovi Linux pomocou Chrony alebo systemd-timesyncd.

RPM balíky NTP, Chrony a systemd-timesyncd sú dostupné v štandardných repozitároch Fedora. RPM systemd-udev je správca udalostí jadra, ktorý je vo Fedore predvolene nainštalovaný, ale nie je povinný na použitie.

Môžete nainštalovať všetky tri a prepínať medzi nimi, ale to prinesie zbytočné komplikácie. Takže by sa to nemalo robiť. Moderné verzie Fedory, CentOS a RHEL prešli na Chrony ako štandardnú implementáciu a navyše majú systemd-timesyncd. Myslím si, že Chrony funguje dobre, poskytuje lepšie rozhranie ako služba NTP, ponúka oveľa viac informácií a zvyšuje kontrolu, čo bezpochyby poteší systémových administrátorov.

Vypnutie služieb NTP

Možno je na vašom hostiteľovi už spustená služba NTP. Ak je to tak, musíte ju vypnúť pred prechodom na niečo iné. Mal som spustený chronyd, preto som použil nasledujúce príkazy, aby som ho zastavil a vypol. Spustite príslušné príkazy pre akýkoľvek demon NTP, ktorý používate na svojom hostiteľovi:

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

Skontrolujte, či je služba zastavená a vypnutá:

[root@testvm1 ~]# systemctl status chronyd
● chronyd.service - NTP klient/server
     Načítané: načítané (/usr/lib/systemd/system/chronyd.service; vypnuté; predvoľba dodávateľa: povolené)
     Aktívne: neaktívne (mŕtve)
       Doky: man:chronyd(8)
             man:chrony.conf(5)
[root@testvm1 ~]#

Kontrola stavu pred spustením

Stav systémovej synchronizácie hodín umožňuje zistiť, či je služba NTP spustená. Keďže NTP ste ešte nespustili, príkaz timesync-status na to naznačí:

[root@testvm1 ~]# timedatectl timesync-status
Nepodarilo sa dotazovať server: Nepodarilo sa aktivovať vzdialeného partnera.

Priamy dotaz na stav poskytuje dôležité informácie. Napríklad príkaz timedatectl bez argumentu alebo parametrov vykonáva podpríkaz status predvolene:

[root@testvm1 ~]# timedatectl status
           Lokálny čas: Pi 2020-05-15 08:43:10 EDT  
           Univerzálny čas: Pi 2020-05-15 12:43:10 UTC  
                 RTC čas: Pi 2020-05-15 08:43:08      
                Časové pásmo: Amerika/New_York (EDT, -0400)
Synchronizácia systémového času: nie                          
              NTP služba: neaktívna                    
          RTC v miestnom TZ: áno                    

Upozornenie: Systém je nakonfigurovaný tak, aby čítal RTC čas v miestnom časovom pásme.
         Tento režim nemôže byť plne podporovaný. Môže spôsobiť rôzne problémy
         so zmenami časových pásiem a úpravami letného času. RTC
         čas sa nikdy neaktualizuje, závisí na externých zariadeniach na jeho udržovanie.
         Pokiaľ je to možné, používajte RTC v UTC volaním
         'timedatectl set-local-rtc 0'.
[root@testvm1 ~]#

Takto dostanete miestny čas pre váš hostiteľ, čas UTC a čas RTC. V tomto prípade je systémový čas nastavený na časové pásmo Amerika/New_York (TZ), RTC je nastavené na čas v miestnom časovom pásme a služba NTP nie je aktívna. Čas RTC sa začal trochu odchýliť od systémového času. To je normálne pre systémy, ktorých hodiny neboli synchronizované. Veľkosť posunu na hostiteľovi závisí od času, ktorý uplynul od poslednej synchronizácie systému.

Dostali sme tiež upozornenie na používanie miestneho času pre RTC — to sa týka zmien časového pásma a nastavení letného času. Ak je počítač vypnutý v okamihu, keď je potrebné vykonať zmeny, RTC čas sa nezmení. Ale pre servery alebo iných hostiteľov, ktorí fungujú nepretržite, to vôbec nie je problém. Navyše akákoľvek služba, ktorá zabezpečuje synchronizáciu času NTP, koriguje čas hostiteľa ešte na začiatku spustenia, takže po dokončení spustenia sa čas opäť stane správnym.

Nastavenie časového pásma

Obvykle zadáte časové pásmo počas inštalačného procesu a nemáte úlohu ho neskôr meniť. Avšak sú prípady, keď je potrebné zmeniť časové pásmo. Existuje niekoľko nástrojov, ktoré môžu pomôcť. Na určenie miestneho časového pásma hostiteľa Linux používa súbory časových pásiem. Tieto súbory sa nachádzajú v adresári /usr/share/zoneinfo. V predvolenom nastavení pre moje časové pásmo systém zapisuje toto: /etc/ localtime -> ../usr/share/zoneinfo/America/New_York. Ale nemusíte poznať také detaily na zmenu časového pásma.

Hlavné je poznať oficiálny názov časového pásma pre vašu lokalitu a príslušný príkaz. Povedzme, že chcete zmeniť časové pásmo na Los Angeles:


[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

Teraz môžete nastaviť časové pásmo. Použil som príkaz date na kontrolu zmien, ale môžete tiež použiť 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 ~]#

Teraz môžete opäť zmeniť časové pásmo svojho hosta na miestny čas.

systemd-timesyncd

Demon systemd timesync poskytuje implementáciu NTP, ktorú je ľahké spravovať v kontexte systemd. Predvolene sa inštaluje na Fedora a Ubuntu. Avšak predvolene sa spúšťa len na Ubuntu. Nie som si istý ohľadom ostatných distribúcií. Môžete si to skontrolovať sami:

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

Konfigurácia systemd-timesyncd

Konfiguračný súbor pre systemd-timesyncd je /etc/systemd/timesyncd.conf. Je to jednoduchý súbor s menším počtom zapnutých možností ako v starších službách NTP a chronyd. Tu je obsah tohto súboru (bez ďalších zmien) na mojej virtuálnej mašine s Fedour:

#  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

Jediná sekcia, ktorú obsahuje okrem komentárov, je [Time]. Všetky ostatné riadky sú zakomentované. Toto sú predvolené hodnoty, ktoré nie je potrebné meniť (pokiaľ na to nemáte dôvod). Ak nemáte server NTP určený v riadku NTP =, predvolene sa na Fedora používa záložný časový server Fedora. Zvyčajne pridávam svoj časový server:

NTP=myntpserver

Spustenie synchronizácie času

Čas môžete spustiť a aktivovať systemd-timesyncd takto:

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

Nastavenie hardvérových hodín

Takto vyzerá situácia po spustení timesyncd:

[root@testvm2 systemd]# timedatectl
               Lokálny čas: So 2020-05-16 14:34:54 EDT  
           Univerzálny čas: So 2020-05-16 18:34:54 UTC  
                 RTC čas: So 2020-05-16 14:34:53      
                Časové pásmo: America/New_York (EDT, -0400)
Systémový čas synchronizovaný: áno                          
              NTP služba: aktívna                      
          RTC v miestnom TZ: nie    

Pôvodne je rozdiel medzi RTC a miestnym časom (EDT) maximálne sekunda a odchýlka sa v nasledujúcich dňoch zvyšuje o pár sekúnd. Keďže v RTC nie sú žiadne časové pásma, príkaz timedatectl musí vykonať porovnanie, aby určil požadované časové pásmo. Ak čas RTC presne nezodpovedá miestnemu času, znamená to, že nezodpovedá ani miestnemu časovému pásmu.

Pri hľadaní ďalších informácií som skontroloval stav systemd-timesync a zistil toto:

[root@testvm2 systemd]# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Synchronizácia času po sieti
     Načítané: načítané (\/usr\/lib\/systemd\/system\/systemd-timesyncd.service; povolené; predvoľba predajcu: zakázané)
     Aktívne: aktívne (beží) od So 2020-05-16 13:56:53 EDT; pred 18 hodinami
       Dokumenty: man:systemd-timesyncd.service(8)
   Hlavný PID: 822 (systemd-timesyn)
     Stav: "Počiatočná synchronizácia so serverom času 163.237.218.19:123 (2.fedora.pool.ntp.org)."
      Úlohy: 2 (limit: 10365)
     Pamäť: 2.8M
        CPU: 476ms
     CSkupina: \/system.slice\/systemd-timesyncd.service
             └─822 \/usr\/lib\/systemd\/systemd-timesyncd

16. máj 09:57:24 testvm2.both.org systemd[1]: Spúšťam synchronizáciu času po sieti...
16. máj 09:57:24 testvm2.both.org systemd-timesyncd[822]: Čas systémovej hodiny nie je nastavený alebo bol posunutý späť, obnovuje sa zo zaznamenaného časového razítka: So 2020-05-16 13:56:53 EDT
16. máj 13:56:53 testvm2.both.org systemd[1]: Spustená synchronizácia času po sieti.
16. máj 13:57:56 testvm2.both.org systemd-timesyncd[822]: Počiatočná synchronizácia so serverom času 163.237.218.19:123 (2.fedora.pool.ntp.org).
[root@testvm2 systemd]#

Všimnite si hlásenie v denníku, ktoré uvádza, že systémový čas nie je nastavený alebo bol posunutý späť. Služba Timesync nastavuje systémový čas na základe časovej značky. Časové značky spravuje démon timesync a vytvárajú sa pri každej úspešnej synchronizácii.

Príkaz timedatectl nemá možnosť získať hodnotu hardvérových hodiniek zo systémových hodín. Môže nastaviť čas a dátum iba na základe hodnoty zadané v príkazovom riadku. Môžete nastaviť RTC na rovnakú hodnotu, akú má systémový čas, pomocou príkazu hwclock:

[root@testvm2 ~]# \/sbin\/hwclock --systohc --localtime
[root@testvm2 ~]# timedatectl
               Miestny čas: Po 2020-05-18 13:56:46 EDT  
           Univerzálny čas: Po 2020-05-18 17:56:46 UTC  
                 RTC čas: Po 2020-05-18 13:56:46      
                Časové pásmo: Amerika\/New_York (EDT, -0400)
Systémové hodiny synchronizované: áno                          
              NTP služba: aktívna                      
          RTC v miestnom TZ: áno

Možnosť —localtime uvádza, že hardvérové hodiny ukazujú miestny čas, nie UTC.

Načo potrebujete RTC?

Akákoľvek implementácia NTP nastaví systémový čas pri spustení. A načo potom RTC? Nie je to celkom tak: k tomu dôjde iba v prípade, ak máte sieťové pripojenie k časovému serveru. Mnoho systémov však nemá stály prístup k sieťovému pripojeniu, preto sú hardvérové hodiny užitočné, aby mohol Linux nastaviť systémový čas na ich základe. Je to lepšie, ako nastavenie času ručne, aj keď sa môže od skutočného času odchýliť.

Záver

V tomto článku sa prediskutujú niektoré nástroje na správu dátumu, času a časových pásiem. Nástroj systemd-timesyncd poskytuje NTP klienta, ktorý môže synchronizovať čas na lokálnom hostiteľovi s NTP serverom. Avšak systemd-timesyncd neposkytuje serverovú službu, takže ak potrebujete NTP server vo vašej sieti, musíte použiť niečo iné — napríklad Chrony, aby fungoval ako server.

Preferujem mať jedinečnú implementáciu pre akékoľvek služby vo svojej sieti, preto používam Chrony. Ak nepotrebujete lokálny NTP server alebo ak vám nevadí používať Chrony ako server a systemd-timesyncd ako SNTP klienta. Predsa len nie je potrebné využiť doplnkové funkcie Chrony ako klienta, ak vám vyhovuje funkcionalita systemd-timesyncd.

Ešte jedna poznámka: nie ste povinní používať nástroje systemd na implementáciu NTP. Môžete použiť staršiu verziu ntpd, Chrony alebo inú implementáciu NTP. Predsa len systemd pozostáva z veľkého množstva služieb; mnohé z nich sú voliteľné, takže ich môžete vypnúť a namiesto nich použiť niečo iné. Nie je to obrovský monolitický monštrum. Môžete nemilovať systemd alebo jeho časti, ale musíte prijať dobre odôvodnené rozhodnutie.

Páči sa mi implementácia NTP v systemd, ale preferujem Chrony, pretože lepšie vyhovuje mojim potrebám. Toto je Linux, zlato -)

Na základe reklamy

VDSina ponúka servery pre akékoľvek úlohy, obrovský výber operačných systémov na automatické inštalovanie, je možnosť nainštalovať akýkoľvek OS z vlastného ISO, pohodlné ovládací panel vlastného vývoja a denné platenie. Pripomíname, že máme večné servery, ktoré sú presne mimo času 😉

Synchronizácia času v Linuxe: NTP, Chrony a systemd-timesyncd

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster