Linuxová synchronizácia času: NTP, Chrony a systemd-timesyncd

Linuxová synchronizácia času: NTP, Chrony a systemd-timesyncd
Väčšina ľudí sleduje čas. Vstávame načas, aby sme dokončili ranné rituály a ideme do práce, urobíme si obednú prestávku, dodržíme termíny projektov, oslávime narodeniny a sviatky, nastúpime do lietadla atď.

Navyše: niektorí z nás sú posadnutí časom. Moje hodinky sú poháňané solárnou energiou a získavajú presný čas od Národného inštitútu pre štandardy a technológie (NIST) do Fort Collins, Colorado cez dlhovlnné rádio WWVB. Časové signály 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 synchronizujú s atómovými hodinami.

Zariadenia tiež sledujú čas

Existuje mnoho dôvodov, prečo naše zariadenia a počítače potrebujú presný čas. Napríklad v bankovníctve, na akciových trhoch a iných finančných podnikoch musia byť transakcie vykonávané v správnom poradí a presné časové sekvencie sú pre to rozhodujúce.

Naše telefóny, tablety, autá, systémy GPS a počítače vyžadujú presné nastavenie času a dátumu. Chcem, aby hodiny na pracovnej ploche môjho počítača ukazovali správny čas. Chcem, aby sa pripomienky zobrazovali v mojom miestnom kalendári v správnom čase. Správny čas tiež zaisťuje, že úlohy cron a systemd bežia v správnom čase.

Dátum a čas sú tiež dôležité pre protokolovanie, takže je o niečo jednoduchšie nájsť určité protokoly na základe dátumu a času. Raz som napríklad pracoval v DevOps (vtedy sa to tak nevolalo) a zakladal som emailový systém v štáte Severná Karolína. Kedysi sme spracovávali viac ako 20 miliónov e-mailov denne. Sledovanie e-mailov cez sériu serverov alebo určenie presnej postupnosti udalostí pomocou súborov denníka na geograficky rozptýlených hostiteľoch môže byť oveľa jednoduchšie, ak sú príslušné počítače synchronizované v čase.

Raz - veľa hodín

Hostitelia Linuxu musia brať do úvahy, že existuje systémový čas a čas RTC. RTC (Real Time Clock) je trochu zvláštny a nie príliš presný názov pre hardvérové ​​hodiny.

Hardvérové ​​hodiny bežia nepretržite, aj keď je počítač vypnutý, a to pomocou batérie na základnej doske systému. Hlavnou funkciou RTC je ukladanie času, keď nie je dostupné spojenie s časovým serverom. V časoch, keď nebolo možné pripojiť sa k časovému serveru cez internet, musel mať každý počítač presné vnútorné hodiny. Operačné systémy museli pristupovať k RTC v čase zavádzania a používateľ musel manuálne nastaviť systémový čas pomocou rozhrania hardvérovej konfigurácie systému BIOS, aby sa uistil, že je správny.

Hardvérové ​​hodiny nerozumejú konceptu časových pásiem; RTC ukladá iba čas, nie časové pásmo ani posun od UTC (koordinovaný svetový čas, známy aj ako GMT alebo Greenwichský čas). RTC môžete nainštalovať pomocou nástroja, ktorému sa budem venovať neskôr v tomto článku.

Systémový čas je čas, ktorý OS zobrazuje na hodinách GUI na vašej pracovnej ploche, vo výstupe príkazu dátumu, v časových pečiatkach denníkov. To platí aj pre vytváranie, úpravu a otváranie súborov.

Na stránke muž pre rtc je tam úplný popis RTC a systémových hodín.

Čo je s NTP?

Počítače na celom svete používajú protokol NTP (Network Time Protocol) na synchronizáciu času so štandardnými referenčnými hodinami cez internet pomocou hierarchie serverov NTP. Hlavné časové servery sú na vrstve 1 a sú priamo pripojené k rôznym národným časovým službám na vrstve 0 cez satelit, rádio alebo dokonca modemy cez telefónne linky. Časovými službami vrstvy 0 môžu byť atómové hodiny, rádiový prijímač, ktorý je naladený na signály vysielané atómovými hodinami, alebo prijímač GPS, ktorý využíva vysoko presné hodinové signály vysielané satelitmi GPS.

Prevažná väčšina referenčných serverov má niekoľko tisíc verejných serverov NTP stratum 2 otvorených pre verejnosť. Mnohé organizácie a používatelia (vrátane mňa) s množstvom hostiteľov, ktorí potrebujú server NTP, sa rozhodnú nastaviť svoje vlastné časové servery, takže iba jeden lokálny hostiteľ má prístup k vrstve 2 alebo 3. Potom nakonfigurujú zostávajúce uzly v sieti na používanie časový server. V prípade mojej domácej siete ide o server vrstvy 3.

Rôzne implementácie NTP

Pôvodná implementácia NTP je ntpd. Potom sa k nemu pripojili dva novšie, chronyd a systemd-timesyncd. Všetky tri synchronizujú miestny čas hostiteľa s časovým serverom NTP. Služba systemd-timesyncd nie je taká spoľahlivá ako chronyd, ale na väčšinu účelov je dosť dobrá. Ak RTC nie je synchronizované, môže postupne upraviť systémový čas tak, aby sa synchronizoval so serverom NTP, keď sa lokálny systémový čas mierne posunie. Službu systemd-timesync nemožno použiť ako časový server.

Chrony je implementácia NTP, ktorá obsahuje dva programy: démona chronyd a rozhranie príkazového riadku nazývané chronyc. Chrony má niektoré funkcie, ktoré sú v mnohých prípadoch nevyhnutné:

  • Chrony sa dokáže synchronizovať s časovým serverom oveľa rýchlejšie ako stará služba ntpd. To je dobré pre notebooky alebo stolné počítače, ktoré nefungujú stále.
  • Dokáže kompenzovať kolísanie hodín, napríklad keď hostiteľ ide spať alebo vstúpi do režimu spánku, alebo keď sa hodiny menia v dôsledku frekvenčného skákania, čo spomaľuje hodiny pri nízkej záťaži.
  • Rieši časové problémy súvisiace s nestabilným sieťovým pripojením alebo preťažením siete.
  • Reguluje oneskorenia siete.
  • Po počiatočnej synchronizácii času Chrony nikdy nezastaví hodiny. To poskytuje stabilné a konzistentné časové úseky 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ť lokálny hostiteľ alebo server aktualizovaný manuálne.
  • Chrony môže fungovať ako server NTP.

Opäť platí, že NTP je protokol, ktorý možno implementovať na hostiteľovi Linuxu pomocou Chrony alebo systemd-timesyncd.

RPM NTP, Chrony a systemd-timesyncd sú dostupné v štandardných úložiskách Fedory. Systemd-udev RPM je správca udalostí jadra, ktorý je štandardne nainštalovaný vo Fedore, ale je voliteľný.

Môžete nainštalovať všetky tri a prepínať medzi nimi, čo však spôsobí ďalšie bolesti hlavy. Takže radšej nie. Moderné vydania Fedory, CentOS a RHEL sa presunuli do Chrony ako predvolenej implementácie a majú tiež systemd-timesyncd. Zistil som, že Chrony funguje dobre, poskytuje lepšie rozhranie ako služba NTP, poskytuje oveľa viac informácií a kontroly, čo správcov systému určite poteší.

Zakázanie služieb NTP

Služba NTP už môže byť spustená na vašom hostiteľovi. Ak áno, musíte ho pred prepnutím na niečo iné deaktivovať. Mal som spustený chronyd, takže som ho zastavil a deaktivoval pomocou nasledujúcich príkazov. Spustite príslušné príkazy pre ľubovoľného démona NTP, ktorý používate na svojom hostiteľovi:

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

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

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

Kontrola stavu pred spustením

Stav synchronizácie systémových hodín vám umožňuje určiť, či je spustená služba NTP. Keďže ste ešte nespustili NTP, príkaz timesync-status vám naznačí toto:

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

Priama žiadosť o stav poskytuje dôležité informácie. Napríklad príkaz timedatectl bez argumentu alebo volieb štandardne vykoná podpríkaz 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 ~]#

Získate tak miestny čas vášho hostiteľa, čas UTC a čas RTC. V tomto prípade je systémový čas nastavený na časové pásmo America / 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 mierne líšiť 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 aj upozornenie na používanie miestneho času pre RTC – týka sa to zmien časového pásma a nastavenia letného času. Ak je počítač vypnutý, keď je potrebné vykonať zmeny, RTC sa nezmení. Ale pre servery alebo iné hostiteľské počítače, ktoré bežia nepretržite, to vôbec nie je problém. Okrem toho každá služba, ktorá poskytuje synchronizáciu času NTP, upraví čas hostiteľa počas počiatočnej fázy spustenia, takže po dokončení spustenia bude čas opäť správny.

Nastavenie časového pásma

Obyčajne určíte časové pásmo počas inštalácie a nemáte za úlohu ho neskôr meniť. Sú však chvíle, keď potrebujete zmeniť časové pásmo. Existuje niekoľko nástrojov, ktoré vám môžu pomôcť. Linux používa súbory časového pásma na určenie lokálneho časového pásma hostiteľa. Tieto súbory sú v adresári /usr/share/zoneinfo. V predvolenom nastavení pre moje časové pásmo systém predpisuje toto: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Ale na zmenu časového pásma nepotrebujete poznať takéto jemnosti.

Hlavná vec je poznať oficiálny názov časového pásma pre vašu polohu a príslušný príkaz. Povedzme, že chcete zmeniť časové pásmo na 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>

Teraz môžete nastaviť časové pásmo. Na kontrolu zmien som použil príkaz date, ale môžete použiť aj 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 zmeniť časové pásmo svojho hostiteľa späť na miestny čas.

systemd-timesyncd

Démon systemd timesync poskytuje implementáciu NTP, ktorú je ľahké spravovať v kontexte systemd. Štandardne je nainštalovaný na Fedore a Ubuntu. Štandardne sa však spúšťa iba na Ubuntu. Nie som si istý inými distribúciami. Môžete sa presvedčiť sami:

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

Konfigurácia systemd-timesyncd

Konfiguračný súbor pre systemd-timesyncd je /etc/systemd/timesyncd.conf. Toto je jednoduchý súbor s menším počtom povolených možností ako staré služby NTP a chronyd. Tu je obsah tohto súboru (bez ďalších úprav) na mojom VM Fedora:

#  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 [Čas]. Všetky ostatné riadky sú zakomentované. Toto sú predvolené hodnoty a nemali by sa meniť (pokiaľ na to nemáte dôvod). Ak nemáte NTP časový server definovaný v riadku NTP=, Fedora predvolene použije záložný časový server Fedory. Zvyčajne pridávam svoj časový server:

NTP=myntpserver

Synchronizácia času behu

Systemd-timesyncd môžete spustiť a aktivovať takto:

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

Nastavenie hardvérových hodín

Takto vyzerá situácia po spustení 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    

Na začiatku je rozdiel medzi RTC a miestnym časom (EDT) menší ako sekunda a v priebehu niekoľkých nasledujúcich dní sa tento rozdiel zväčší o ďalších pár sekúnd. Keďže v RTC neexistuje koncept časových pásiem, príkaz timedatectl musí vykonať porovnanie, aby určil správne časové pásmo. Ak sa čas RTC presne nezhoduje s miestnym časom, nezhoduje sa ani s miestnym časovým pásmom.

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

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

Všimnite si správu denníka, ktorá hovorí, že systémový čas nebol nastavený alebo bol resetovaný. Služba Timesync nastavuje systémový čas na základe časovej pečiatky. Časové pečiatky spravuje démon timesync a vytvárajú sa pri každej úspešnej synchronizácii.

Príkaz timedatectl nemá žiadny spôsob, ako prevziať hodnotu hardvérových hodín zo systémových hodín. Môže nastaviť len čas a dátum z hodnoty zadanej na príkazovom riadku. RTC môžete nastaviť na rovnakú hodnotu ako systémový čas pomocou príkazu 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

Voľba --localtime hovorí, že hardvérové ​​hodiny majú zobrazovať miestny čas, nie UTC.

Prečo vôbec potrebujete RTC?

Akákoľvek implementácia NTP nastaví systémové hodiny pri spustení. A prečo potom RTC? Nie je to úplne pravda: stane sa to iba vtedy, ak máte sieťové pripojenie k časovému serveru. Mnoho systémov však nemá vždy prístup k sieťovému pripojeniu, takže hardvérové ​​hodiny sú pre Linux užitočné na nastavenie systémového času. Je to lepšie ako manuálne nastavovanie času, aj keď sa môže líšiť od reálneho času.

Záver

Tento článok obsahuje prehľad niektorých nástrojov na manipuláciu s dátumom, časom a časovými pásmami. Nástroj systemd-timesyncd poskytuje klienta NTP, ktorý dokáže synchronizovať čas na lokálnom hostiteľovi so serverom NTP. Systemd-timesyncd však neposkytuje službu servera, takže ak potrebujete server NTP vo svojej sieti, musíte použiť niečo iné, napríklad Chrony, aby ste fungovali ako server.

Preferujem jedinú implementáciu pre akúkoľvek službu v mojej sieti, takže používam Chrony. Ak nepotrebujete lokálny server NTP, alebo ak vám nevadí použiť Chrony ako server a systemd-timesyncd ako klienta SNTP. Koniec koncov, nie je potrebné používať dodatočné funkcie Chrony ako klienta, ak ste spokojní s funkčnosťou systemd-timesyncd.

Ďalšia poznámka: na implementáciu NTP nemusíte používať nástroje systemd. Môžete použiť staršiu verziu ntpd, Chrony alebo inú implementáciu NTP. Systemd totiž pozostáva z veľkého množstva služieb; mnohé z nich sú voliteľné, takže ich môžete vypnúť a použiť namiesto nich niečo iné. Toto nie je obrovské monolitické monštrum. Systemd alebo jeho časti sa vám nemusia páčiť, ale mali by ste urobiť informované rozhodnutie.

Páči sa mi implementácia NTP od systemd, ale preferujem Chrony, pretože lepšie vyhovuje mojim potrebám. Je to Linux, zlatko -)

O právach reklamy

VDSina ponúka servery pre akúkoľvek úlohu, obrovský výber operačných systémov pre automatickú inštaláciu, je možné nainštalovať ľubovoľný OS z vlastného ISO, pohodlné ovládací panel vlastný vývoj a denná platba. Pripomeňme, že máme večné servery, ktoré sú rozhodne nadčasové 😉

Linuxová synchronizácia času: NTP, Chrony a systemd-timesyncd

Zdroj: hab.com

Pridať komentár