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

Linuxová synchronizace času: NTP, Chrony a systemd-timesyncd
Většina lidí sleduje čas. Vstáváme včas, abychom dokončili ranní rituály a jdeme do práce, uděláme si přestávku na oběd, dodržíme termíny projektů, oslavíme narozeniny a svátky, nastoupíme do letadla a tak dále.

Navíc: někteří z nás jsou posedlí časem. Moje hodinky jsou poháněny solární energií a získávají přesný čas od Národního institutu pro standardy a technologie (NIST) do Fort Collins, Colorado přes dlouhovlnné rádio WWVB. Časové signály jsou synchronizovány s atomovými hodinami, které se také nacházejí ve Fort Collins. Můj Fitbit se synchronizuje s mým telefonem, který se synchronizuje se serverem NTP, které se nakonec synchronizují s atomovými hodinami.

Zařízení také sledují čas

Existuje mnoho důvodů, proč naše zařízení a počítače potřebují přesný čas. Například v bankovnictví, na akciových trzích a v jiných finančních podnicích musí být transakce prováděny ve správném pořadí a přesné časové sekvence jsou pro to rozhodující.

Naše telefony, tablety, auta, systémy GPS a počítače vyžadují přesné nastavení času a data. Chci, aby hodiny na ploše mého počítače ukazovaly správný čas. Chci, aby se připomenutí objevovala v mém místním kalendáři ve správný čas. Správný čas také zajišťuje, že úlohy cron a systemd běží ve správný čas.

Datum a čas jsou také důležité pro protokolování, takže je o něco jednodušší najít určité protokoly podle data a času. Kdysi jsem například pracoval v DevOps (tehdy se to tak nejmenovalo) a zakládal e-mailový systém ve státě Severní Karolína. Dříve jsme zpracovávali přes 20 milionů e-mailů denně. Sledování e-mailů prostřednictvím řady serverů nebo určení přesné sekvence událostí pomocí souborů protokolu na geograficky rozptýlených hostitelích může být mnohem snazší, pokud jsou příslušné počítače synchronizovány včas.

Jednou - mnoho hodin

Hostitelé Linuxu musí vzít v úvahu, že existuje systémový čas a čas RTC. RTC (Real Time Clock) je trochu zvláštní a nepříliš přesné označení pro hardwarové hodiny.

Hardwarové hodiny běží nepřetržitě, i když je počítač vypnutý, pomocí baterie na základní desce systému. Hlavní funkcí RTC je ukládat čas, když není k dispozici připojení k časovému serveru. V dobách, kdy nebylo možné připojit se k časovému serveru přes internet, musel mít každý počítač přesné vnitřní hodiny. Operační systémy musely přistupovat k RTC při spouštění a uživatel musel ručně nastavit systémový čas pomocí rozhraní hardwarové konfigurace systému BIOS, aby se ujistil, že je správný.

Hardwarové hodiny nerozumí konceptu časových pásem; RTC ukládá pouze čas, nikoli časové pásmo nebo posun od UTC (Coordinated Universal Time, také známý jako GMT nebo Greenwichský čas). RTC můžete nainstalovat pomocí nástroje, kterému se budu věnovat později v tomto článku.

Systémový čas je čas, který OS zobrazuje na hodinách GUI na vaší ploše, ve výstupu příkazu date, v časových razítkách protokolů. To platí také pro vytváření, úpravu a otevírání souborů.

Na stránce muž pro rtc je zde úplný popis RTC a systémových hodin.

Co je s NTP?

Počítače na celém světě používají protokol NTP (Network Time Protocol) k synchronizaci času se standardními referenčními hodinami přes internet pomocí hierarchie serverů NTP. Hlavní časové servery jsou na vrstvě 1 a jsou přímo připojeny k různým národním časovým službám na vrstvě 0 přes satelit, rádio nebo dokonce modemy přes telefonní linky. Časovými službami vrstvy 0 mohou být atomové hodiny, rádiový přijímač, který je naladěn na signály vysílané atomovými hodinami, nebo přijímač GPS, který využívá vysoce přesné hodinové signály vysílané satelity GPS.

Naprostá většina referenčních serverů má několik tisíc veřejných NTP serverů stratum 2 otevřených veřejnosti. Mnoho organizací a uživatelů (včetně mě) s mnoha hostiteli, kteří potřebují NTP server, se rozhodne nastavit své vlastní časové servery, takže pouze jeden místní hostitel přistupuje ke vrstvě 2 nebo 3. Poté nakonfigurují zbývající uzly v síti tak, aby používaly místní časový server. V případě mé domácí sítě se jedná o server vrstvy 3.

Různé implementace NTP

Původní implementace NTP je ntpd. Poté se k němu připojily dva novější, chronyd a systemd-timesyncd. Všechny tři synchronizují místní čas hostitele s časovým serverem NTP. Služba systemd-timesyncd není tak spolehlivá jako chronyd, ale pro většinu účelů je dost dobrá. Pokud není RTC synchronizován, může postupně upravit systémový čas tak, aby se synchronizoval se serverem NTP, když se místní systémový čas mírně posune. Službu systemd-timesync nelze použít jako časový server.

Chrony je implementace NTP, která obsahuje dva programy: démona chronyd a rozhraní příkazového řádku zvané chronyc. Chrony má některé funkce, které jsou v mnoha případech nepostradatelné:

  • Chrony se dokáže synchronizovat s časovým serverem mnohem rychleji než stará služba ntpd. To je dobré pro notebooky nebo stolní počítače, které nefungují neustále.
  • Dokáže kompenzovat kolísání hodin, například když hostitel usne nebo přejde do režimu spánku, nebo když se hodiny změní kvůli přeskakování frekvence, což zpomaluje hodiny při nízké zátěži.
  • Řeší časové problémy související s nestabilním síťovým připojením nebo přetížením sítě.
  • Reguluje zpoždění sítě.
  • Po počáteční synchronizaci času Chrony nikdy nezastaví hodiny. To poskytuje stabilní a konzistentní časové úseky pro mnoho systémových služeb a aplikací.
  • Chrony může fungovat i bez připojení k síti. V tomto případě lze místního hostitele nebo server aktualizovat ručně.
  • Chrony může fungovat jako server NTP.

Ještě jednou, NTP je protokol, který lze implementovat na hostiteli Linuxu pomocí Chrony nebo systemd-timesyncd.

RPM NTP, Chrony a systemd-timesyncd jsou dostupné ve standardních úložištích Fedory. Systemd-udev RPM je správce událostí jádra, který je standardně nainstalován na Fedoře, ale je volitelný.

Můžete nainstalovat všechny tři a přepínat mezi nimi, ale způsobí to další bolesti hlavy. Takže je lepší ne. Moderní verze Fedory, CentOS a RHEL se přesunuly do Chrony jako výchozí implementace a mají také systemd-timesyncd. Zjistil jsem, že Chrony funguje dobře, poskytuje lepší rozhraní než služba NTP, poskytuje mnohem více informací a ovládání, což si správci systému jistě užijí.

Zakázání služeb NTP

Služba NTP již na vašem hostiteli možná běží. Pokud ano, musíte jej před přechodem na něco jiného deaktivovat. Měl jsem spuštěný chronyd, takže jsem ho zastavil a deaktivoval pomocí následujících příkazů. Spusťte příslušné příkazy pro libovolného démona NTP, který používáte na svém hostiteli:

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

Zkontrolujte, zda je služba zastavena a deaktivována:

[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 před spuštěním

Stav synchronizace systémových hodin vám umožňuje určit, zda je spuštěna služba NTP. Protože jste ještě nespustili NTP, příkaz timesync-status vám napoví:

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

Přímý požadavek na stav poskytuje důležité informace. Například příkaz timedatectl bez argumentu nebo voleb provede ve výchozím nastavení dílčí pří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 ~]#

Tím získáte místní čas vašeho hostitele, čas UTC a čas RTC. V tomto případě je systémový čas nastaven na časové pásmo America / New_York (TZ), RTC je nastaven na čas v místním časovém pásmu a služba NTP není aktivní. Čas RTC se začal mírně odchylovat od systémového času. To je normální u systémů, jejichž hodiny nebyly synchronizovány. Velikost offsetu na hostiteli závisí na době, která uplynula od poslední synchronizace systému.

Obdrželi jsme také upozornění na používání místního času pro RTC – to se týká změn časového pásma a nastavení DST. Pokud je počítač vypnutý, když je třeba provést změny, RTC se nezmění. Ale pro servery nebo jiné hostitele, kteří běží nepřetržitě, to není vůbec problém. Každá služba, která poskytuje synchronizaci času NTP, navíc upraví čas hostitele během počáteční fáze spouštění, takže po dokončení spouštění bude čas opět správný.

Nastavení časového pásma

Obvykle určíte časové pásmo během instalační procedury a nemáte za úkol jej později měnit. Jsou však chvíle, kdy potřebujete změnit časové pásmo. Existuje několik nástrojů, které mohou pomoci. Linux používá soubory časového pásma k určení místního časového pásma hostitele. Tyto soubory jsou v adresáři /usr/share/zoneinfo. Ve výchozím nastavení pro mé časové pásmo systém předepisuje toto: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Ale pro změnu časového pásma nepotřebujete znát takové jemnosti.

Hlavní věc je znát oficiální název časového pásma pro vaši polohu a odpovídající příkaz. Řekněme, že chcete změnit č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>

Nyní můžete nastavit časové pásmo. Použil jsem příkaz date ke kontrole změn, ale můžete také použít 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 ~]#

Nyní můžete změnit časové pásmo svého hostitele zpět na místní čas.

systemd-timesyncd

Démon systemd timesync poskytuje implementaci NTP, kterou lze snadno spravovat v kontextu systemd. Ve výchozím nastavení je nainstalován na Fedoře a Ubuntu. Ve výchozím nastavení se však spouští pouze na Ubuntu. U jiných distribucí si nejsem jistý. Můžete se sami přesvědčit:

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

Konfigurace systemd-timesyncd

Konfigurační soubor pro systemd-timesyncd je /etc/systemd/timesyncd.conf. Toto je jednoduchý soubor s méně povolenými možnostmi než staré služby NTP a chronyd. Zde je obsah tohoto souboru (bez dalších úprav) na mém 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á sekce, která obsahuje kromě komentářů, je [Čas]. Všechny ostatní řádky jsou zakomentovány. Toto jsou výchozí hodnoty a neměly by se měnit (pokud k tomu nemáte důvod). Pokud nemáte NTP časový server definovaný v řádku NTP=, Fedora jako výchozí použije záložní časový server Fedory. Obvykle přidávám svůj časový server:

NTP=myntpserver

Časová synchronizace běhu

Systemd-timesyncd můžete spustit a aktivovat 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 ~]#

Nastavení hardwarových hodin

Takto vypadá situace po spuštění 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    

Zpočátku je rozdíl mezi RTC a místním časem (EDT) menší než jedna sekunda a během několika příštích dnů se tento rozdíl zvýší o dalších několik sekund. Protože v RTC neexistuje žádná koncepce časových pásem, musí příkaz timedatectl provést porovnání, aby určil správné časové pásmo. Pokud se čas RTC přesně neshoduje s místním časem, neodpovídá ani místnímu časovému pásmu.

Při hledání dalších informací jsem zkontroloval stav systemd-timesync a našel 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šimněte si zprávy protokolu, která říká, že systémový čas nebyl nastaven nebo byl resetován. Služba Timesync nastavuje systémový čas na základě časového razítka. Časová razítka jsou udržována démonem timesync a jsou vytvářena při každé úspěšné synchronizaci.

Příkaz timedatectl nemá žádný způsob, jak převzít hodnotu hardwarových hodin ze systémových hodin. Může pouze nastavit čas a datum z hodnoty zadané na příkazovém řádku. RTC můžete nastavit na stejnou hodnotu jako systémový čas pomocí pří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

Volba --localtime říká hardwarovým hodinám, aby ukazovaly místní čas, nikoli UTC.

Proč vůbec potřebujete RTC?

Jakákoli implementace NTP nastaví systémové hodiny při spuštění. A proč tedy RTC? Není to tak úplně pravda: k tomu dojde pouze v případě, že máte síťové připojení k časovému serveru. Mnoho systémů však nemá vždy přístup k síťovému připojení, takže pro Linux je užitečné použít hardwarové hodiny k nastavení systémového času. Je to lepší než ruční nastavování času, i když se může lišit od reálného času.

Závěr

Tento článek obsahuje přehled některých nástrojů pro manipulaci s datem, časem a časovými pásmy. Nástroj systemd-timesyncd poskytuje klienta NTP, který může synchronizovat čas na místním hostiteli se serverem NTP. Systemd-timesyncd však neposkytuje službu serveru, takže pokud potřebujete server NTP ve své síti, musíte jako server použít něco jiného, ​​například Chrony.

Preferuji mít jedinou implementaci pro jakoukoli službu v mé síti, takže používám Chrony. Pokud nepotřebujete místní NTP server nebo pokud vám nevadí používat Chrony jako server a systemd-timesyncd jako klienta SNTP. Koneckonců, není třeba používat další funkce Chrony jako klienta, pokud jste spokojeni s funkčností systemd-timesyncd.

Další poznámka: k implementaci NTP nemusíte používat nástroje systemd. Můžete použít starší verzi ntpd, Chrony nebo jinou implementaci NTP. Systemd se totiž skládá z velkého množství služeb; mnoho z nich je volitelných, takže je můžete vypnout a použít místo nich něco jiného. Toto není obrovské monolitické monstrum. Systemd nebo jeho části se vám nemusí líbit, ale měli byste učinit informované rozhodnutí.

Líbí se mi implementace NTP od systemd, ale preferuji Chrony, protože lépe vyhovuje mým potřebám. Je to Linux, zlato -)

Jako reklama

VDSina nabízí servery pro jakýkoli úkol, obrovský výběr operačních systémů pro automatickou instalaci, je možné nainstalovat jakýkoli OS z vlastního ISO, pohodlné ovládací panel vlastní vývoj a denní platba. Připomeňme, že máme věčné servery, které jsou rozhodně nadčasové 😉

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

Zdroj: www.habr.com

Přidat komentář