Linux Tidssynkronisering: NTP, Chrony och systemd-timesyncd

Linux Tidssynkronisering: NTP, Chrony och systemd-timesyncd
De flesta håller koll på tiden. Vi går upp i tid för att slutföra våra morgonritualer och går till jobbet, tar en lunchrast, håller projektdeadlines, firar födelsedagar och helgdagar, går ombord på ett flygplan och så vidare.

Dessutom: några av oss är besatta av tid. Min klocka drivs av solenergi och får exakt tid från National Institute of Standards and Technology (NIST) till Fort Collins, Colorado via långvågsradio WWVB. Tidssignalerna är synkroniserade med atomklockan, som också finns vid Fort Collins. Min Fitbit synkroniserar med min telefon som synkroniserar med servern NTP, som så småningom synkroniseras med atomklockan.

Enheter håller också koll på tiden

Det finns många anledningar till varför våra enheter och datorer behöver exakt tid. Till exempel inom banker, aktiemarknader och andra finansiella företag måste transaktioner utföras i rätt ordning, och korrekta tidssekvenser är avgörande för detta.

Våra telefoner, surfplattor, bilar, GPS-system och datorer kräver alla exakta tid- och datuminställningar. Jag vill att klockan på min dators skrivbord ska visa rätt tid. Jag vill att påminnelser ska visas i min lokala kalender vid rätt tidpunkt. Rätt tid säkerställer också att cron- och systemd-jobben körs vid rätt tidpunkt.

Datum och tid är också viktigt för loggning, så det är lite lättare att hitta vissa loggar utifrån datum och tid. Till exempel arbetade jag en gång i DevOps (det hette inte så på den tiden) och satte upp ett e-postsystem i delstaten North Carolina. Vi brukade behandla över 20 miljoner e-postmeddelanden om dagen. Att spåra e-post genom en serie servrar, eller bestämma den exakta sekvensen av händelser med hjälp av loggfiler på geografiskt spridda värdar, kan vara mycket lättare om respektive datorer synkroniseras i tid.

En gång - många timmar

Linux-värdar måste ta hänsyn till att det finns en systemtid och en RTC-tid. RTC (Real Time Clock) är ett lite konstigt och inte särskilt exakt namn på en hårdvaruklocka.

Hårdvaruklockan går kontinuerligt även när datorn är avstängd, med batteriet på systemets moderkort. Huvudfunktionen hos RTC är att lagra tid när en anslutning till en tidsserver inte är tillgänglig. På den tiden då det var omöjligt att ansluta till en tidsserver via Internet, var varje dator tvungen att ha en korrekt intern klocka. Operativsystem var tvungna att komma åt RTC vid uppstart, och användaren var tvungen att manuellt ställa in systemtiden med hjälp av BIOS-hårdvarukonfigurationsgränssnittet för att säkerställa att det var korrekt.

Hårdvaruklockor förstår inte konceptet med tidszoner; RTC lagrar bara tiden, inte tidszonen eller offset från UTC (Coordinated Universal Time, även känd som GMT eller Greenwich Mean Time). Du kan installera RTC med hjälp av ett verktyg som jag kommer att täcka senare i den här artikeln.

Systemtiden är den tid som operativsystemet visar på GUI-klockan på ditt skrivbord, i utgången av datumkommandot, i loggarnas tidsstämplar. Detta gäller även när filer skapas, ändras och öppnas.

På sidan man för rtc det finns en fullständig beskrivning av RTC och systemklockan.

Vad är det med NTP?

Datorer över hela världen använder NTP (Network Time Protocol) för att synkronisera sin tid med standardreferensklockor över Internet med hjälp av en hierarki av NTP-servrar. Huvudtidsservrarna finns på lager 1 och de är direkt anslutna till olika nationella tidstjänster på lager 0 via satellit, radio eller till och med modem över telefonlinjer. Tidstjänster på lager 0 kan vara en atomklocka, en radiomottagare som är inställd på signaler som sänds av atomur, eller en GPS-mottagare som använder mycket exakta klocksignaler som sänds av GPS-satelliter.

Den stora majoriteten av referensservrarna har flera tusen offentliga NTP stratum 2-servrar öppna för allmänheten. Många organisationer och användare (inklusive jag själv) med många värdar som behöver en NTP-server väljer att sätta upp sina egna tidsservrar så att endast en lokal värd kommer åt stratum 2 eller 3. De konfigurerar sedan de återstående noderna på nätverket för att använda den lokala tidsserver. När det gäller mitt hemnätverk är detta en lager 3-server.

Olika implementeringar av NTP

Den ursprungliga implementeringen av NTP är ntpd. Den fick sedan sällskap av två nyare, chronyd och systemd-timesyncd. Alla tre synkroniserar den lokala värdtiden med en NTP-tidsserver. Tjänsten systemd-timesyncd är inte lika pålitlig som chronyd, men den är tillräckligt bra för de flesta ändamål. Om RTC:n inte är synkroniserad, kan den gradvis justera systemtiden för att synkronisera med NTP-servern när den lokala systemets tid avviker något. Tjänsten systemd-timesync kan inte användas som en tidsserver.

Chrony är en implementering av NTP som innehåller två program: chronyd-demonen och ett kommandoradsgränssnitt som kallas chronyc. Chrony har några funktioner som är oumbärliga i många fall:

  • Chrony kan synkronisera med en tidsserver mycket snabbare än den gamla ntpd-tjänsten. Detta är bra för bärbara eller stationära datorer som inte fungerar hela tiden.
  • Den kan kompensera för klockfluktuationer, som när värden går i viloläge eller går in i viloläge, eller när klockan ändras på grund av frekvenshopp, vilket saktar ner klockorna vid låga belastningar.
  • Det löser tidsproblem relaterade till instabil nätverksanslutning eller nätverksstockning.
  • Den reglerar nätverksförseningar.
  • Efter den första tidssynkroniseringen stoppar Chrony aldrig klockan. Detta ger stabila och konsekventa tidsluckor för många systemtjänster och applikationer.
  • Chrony kan fungera även utan nätverksanslutning. I det här fallet kan den lokala värden eller servern uppdateras manuellt.
  • Chrony kan fungera som en NTP-server.

Återigen är NTP ett protokoll som kan implementeras på en Linux-värd med Chrony eller systemd-timesyncd.

RPM:erna för NTP, Chrony och systemd-timesyncd är tillgängliga i Fedoras standardarkiv. Systemd-udev RPM är en kärnhändelsehanterare som är installerad som standard på Fedora, men är valfri.

Du kan installera alla tre och växla mellan dem, men detta kommer att skapa en extra huvudvärk. Så det är bättre att låta bli. Moderna utgåvor av Fedora, CentOS och RHEL har flyttat till Chrony som standardimplementering, och de har också systemd-timesyncd. Jag tycker att Chrony fungerar bra, ger ett bättre gränssnitt än NTP-tjänsten, ger mycket mer information och kontroll, vilket systemadministratörer säkert kommer att njuta av.

Inaktiverar NTP-tjänster

NTP-tjänsten kanske redan körs på din värd. Om så är fallet måste du inaktivera det innan du byter till något annat. Jag hade chronyd igång så jag använde följande kommandon för att stoppa och inaktivera den. Kör lämpliga kommandon för alla NTP-demoner som du kör på din värd:

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

Kontrollera att tjänsten är stoppad och inaktiverad:

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

Statuskontroll före lansering

Systemets klocksynkroniseringsstatus låter dig avgöra om NTP-tjänsten körs. Eftersom du inte har startat NTP än, kommer kommandot timesync-status att antyda detta:

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

En direkt statusbegäran ger viktig information. Till exempel, kommandot timedatectl utan argument eller alternativ kör underkommandot status som standard:

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

Detta ger dig lokal tid för din värd, UTC-tid och RTC-tid. I det här fallet är systemtiden inställd på tidszonen America/New_York (TZ), RTC är inställd på tiden i den lokala tidszonen och NTP-tjänsten är inte aktiv. RTC-tiden har börjat avvika något från systemtiden. Detta är normalt för system vars klockor inte har synkroniserats. Mängden offset på värden beror på tiden som har gått sedan systemet senast synkroniserades.

Vi fick också en varning om att använda lokal tid för RTC – detta gäller tidszonsändringar och sommartid. Om datorn stängs av när ändringar behöver göras kommer RTC inte att ändras. Men för servrar eller andra värdar som körs dygnet runt är detta inget problem alls. Dessutom kommer alla tjänster som tillhandahåller NTP-tidssynkronisering att justera värdens tid under den inledande startfasen, så att tiden blir korrekt igen efter att uppstarten är klar.

Ställa in tidszonen

Vanligtvis anger du tidszonen under installationsproceduren och du har inte till uppgift att ändra den senare. Det finns dock tillfällen då du behöver ändra tidszonen. Det finns flera verktyg som kan hjälpa. Linux använder tidszonsfiler för att bestämma den lokala tidszonen för en värd. Dessa filer finns i katalogen /usr/share/zoneinfo. Som standard, för min tidszon, föreskriver systemet detta: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Men du behöver inte känna till sådana finesser för att ändra tidszonen.

Det viktigaste är att känna till det officiella tidszonnamnet för din plats och motsvarande kommando. Låt oss säga att du vill ändra tidszonen till 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>

Nu kan du ställa in tidszonen. Jag använde kommandot date för att leta efter ändringar, men du kan också använda 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 ~]#

Nu kan du ändra din värds tidszon tillbaka till lokal tid.

systemd-timesyncd

Systemd timesync-demonen tillhandahåller en NTP-implementering som är lätt att hantera i systemd-sammanhang. Det är installerat som standard på Fedora och Ubuntu. Den startar dock bara som standard på Ubuntu. Jag är inte säker på andra distributioner. Du kan själv kontrollera:

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

Konfigurerar systemd-timesyncd

Konfigurationsfilen för systemd-timesyncd är /etc/systemd/timesyncd.conf. Detta är en enkel fil med färre alternativ aktiverade än de gamla NTP- och chronyd-tjänsterna. Här är innehållet i den här filen (utan ytterligare ändringar) på min 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

Det enda avsnittet det innehåller, förutom kommentarer, är [Tid]. Alla andra rader kommenteras bort. Dessa är standardvärdena och behöver inte ändras (såvida du inte har en anledning till det). Om du inte har en NTP-tidsserver definierad i NTP=-raden, är Fedora som standard en reserv Fedora-tidsserver. Jag brukar lägga till min tidsserver:

NTP=myntpserver

Kör tidssynkronisering

Du kan starta och göra systemd-timesyncd aktiv så här:

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

Ställa hårdvaruklockan

Så här ser situationen ut efter att ha kört 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    

Inledningsvis är skillnaden mellan RTC och lokal tid (EDT) mindre än en sekund, och avvikelsen ökar med ytterligare ett par sekunder under de närmaste dagarna. Eftersom det inte finns något koncept för tidszoner i RTC, måste timedatectl-kommandot utföra en jämförelse för att bestämma rätt tidszon. Om RTC-tiden inte exakt matchar den lokala tiden, så stämmer den inte heller överens med den lokala tidszonen.

Jag letade efter mer information och kollade statusen för systemd-timesync och hittade detta:

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

Lägg märke till loggmeddelandet som säger att systemtiden inte har ställts in eller har återställts. Tjänsten Timesync ställer in systemtiden baserat på tidsstämpeln. Tidsstämplar underhålls av tidssynk-demonen och skapas vid varje lyckad synkronisering.

Kommandot timedatectl har inget sätt att ta värdet på hårdvaruklockan från systemklockan. Den kan bara ställa in tid och datum från värdet som anges på kommandoraden. Du kan ställa in RTC till samma värde som systemtiden med kommandot 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

Alternativet --localtime talar om för hårdvaruklockan att visa lokal tid, inte UTC.

Varför behöver du RTC överhuvudtaget?

Varje implementering av NTP kommer att ställa in systemklockan vid starttid. Och varför då RTC? Detta är inte helt sant: detta händer bara om du har en nätverksanslutning till tidsservern. Men många system har inte alltid tillgång till en nätverksanslutning, så en hårdvaruklocka är användbar för Linux att använda för att ställa in systemtiden. Detta är bättre än att manuellt ställa in tiden, även om den kan avvika från realtid.

Slutsats

Den här artikeln har granskat några verktyg för att manipulera datum, tid och tidszoner. Verktyget systemd-timesyncd tillhandahåller en NTP-klient som kan synkronisera tiden på den lokala värden med en NTP-server. Systemd-timesyncd tillhandahåller dock ingen servertjänst, så om du behöver en NTP-server i ditt nätverk måste du använda något annat, som Chrony, för att fungera som server.

Jag föredrar att ha en enda implementering för alla tjänster i mitt nätverk, så jag använder Chrony. Om du inte behöver en lokal NTP-server, eller om du inte har något emot att använda Chrony som server och systemd-timesyncd som SNTP-klient. Det finns trots allt inget behov av att använda de extra funktionerna i Chrony som klient om du är nöjd med funktionaliteten hos systemd-timesyncd.

En annan anmärkning: du behöver inte använda systemverktygen för att implementera NTP. Du kan använda en äldre version av ntpd, Chrony eller en annan NTP-implementering. Systemd består trots allt av ett stort antal tjänster; många av dem är valfria, så du kan stänga av dem och använda något annat istället. Detta är inte ett enormt monolitiskt monster. Du kanske inte gillar systemd eller delar av det, men du bör fatta ett välgrundat beslut.

Jag gillar systemds implementering av NTP, men jag föredrar Chrony eftersom det passar mina behov bättre. Det är Linux, baby -)

Om reklamens rättigheter

VDSina erbjuder servrar för alla uppgifter, ett stort urval av operativsystem för automatisk installation, är det möjligt att installera vilket operativsystem som helst från ditt eget ISO, bekvämt панель управления egen utveckling och daglig betalning. Kom ihåg att vi har eviga servrar som definitivt är tidlösa 😉

Linux Tidssynkronisering: NTP, Chrony och systemd-timesyncd

Källa: will.com

Lägg en kommentar