Sincronizzazione dell'ora di Linux: NTP, Chrony e systemd-timesyncd

Sincronizzazione dell'ora di Linux: NTP, Chrony e systemd-timesyncd
La maggior parte delle persone tiene traccia del tempo. Ci alziamo in tempo per completare i nostri rituali mattutini e andare al lavoro, fare una pausa pranzo, rispettare le scadenze dei progetti, festeggiare compleanni e festività, salire a bordo di un aereo e così via.

Inoltre: alcuni di noi sono ossessionati dal tempo. Il mio orologio è alimentato dall'energia solare e ottiene l'ora esatta dal National Institute of Standards and Technology (NIST) a Fort Collins, Colorado tramite radio a onde lunghe WWVB. I segnali orari sono sincronizzati con l'orologio atomico, anch'esso situato a Fort Collins. Il mio Fitbit si sta sincronizzando con il mio telefono che si sta sincronizzando con il server NTP, che alla fine si sincronizza con l'orologio atomico.

Anche i dispositivi tengono traccia del tempo

Ci sono molte ragioni per cui i nostri dispositivi e computer hanno bisogno di tempi precisi. Ad esempio, nelle banche, nei mercati azionari e in altre attività finanziarie, le transazioni devono essere eseguite nell'ordine corretto e le sequenze temporali accurate sono fondamentali per questo.

I nostri telefoni, tablet, automobili, sistemi GPS e computer richiedono impostazioni accurate di data e ora. Voglio che l'orologio sul desktop del mio computer indichi l'ora corretta. Voglio che i promemoria appaiano sul mio calendario locale al momento giusto. L'ora corretta garantisce inoltre che i processi cron e systemd vengano eseguiti all'ora corretta.

Anche la data e l'ora sono importanti per la registrazione, quindi è un po' più semplice trovare determinati registri in base alla data e all'ora. Ad esempio, una volta ho lavorato in DevOps (all'epoca non si chiamava così) e stavo configurando un sistema di posta elettronica nello stato della Carolina del Nord. Elaboravamo oltre 20 milioni di email al giorno. Il monitoraggio della posta elettronica attraverso una serie di server o la determinazione dell'esatta sequenza di eventi utilizzando i file di registro su host dislocati geograficamente può essere molto più semplice se i rispettivi computer sono sincronizzati nel tempo.

Una volta - molte ore

Gli host Linux devono tenere conto del fatto che esiste un'ora di sistema e un'ora RTC. RTC (Real Time Clock) è un nome un po' strano e poco preciso per un orologio hardware.

L'orologio hardware funziona continuamente anche quando il computer è spento, utilizzando la batteria sulla scheda madre del sistema. La funzione principale dell'RTC è memorizzare l'ora quando non è disponibile una connessione a un time server. Nei giorni in cui era impossibile connettersi a un time server su Internet, ogni computer doveva avere un orologio interno accurato. I sistemi operativi dovevano accedere all'RTC al momento dell'avvio e l'utente doveva impostare manualmente l'ora del sistema utilizzando l'interfaccia di configurazione hardware del BIOS per assicurarsi che fosse corretta.

Gli orologi hardware non comprendono il concetto di fuso orario; RTC memorizza solo l'ora, non il fuso orario o l'offset rispetto a UTC (Coordinated Universal Time, noto anche come GMT o Greenwich Mean Time). Puoi installare RTC usando uno strumento che tratterò più avanti in questo articolo.

L'ora di sistema è l'ora che il sistema operativo visualizza sull'orologio della GUI sul desktop, nell'output del comando date, nei timestamp dei registri. Questo vale anche quando i file vengono creati, modificati e aperti.

Sulla pagina uomo per rtc c'è una descrizione completa dell'RTC e dell'orologio di sistema.

Cos'è l'NTP?

I computer di tutto il mondo utilizzano NTP (Network Time Protocol) per sincronizzare l'ora con gli orologi di riferimento standard su Internet utilizzando una gerarchia di server NTP. I principali time server sono al livello 1 e sono direttamente collegati ai vari servizi orari nazionali al livello 0 via satellite, radio o anche modem su linee telefoniche. I servizi temporali di livello 0 possono essere un orologio atomico, un ricevitore radio sintonizzato sui segnali trasmessi da orologi atomici o un ricevitore GPS che utilizza segnali di clock estremamente accurati trasmessi dai satelliti GPS.

La stragrande maggioranza dei server di riferimento dispone di diverse migliaia di server pubblici NTP stratum 2 aperti al pubblico. Molte organizzazioni e utenti (me compreso) con molti host che necessitano di un server NTP scelgono di impostare i propri time server in modo che solo un host locale acceda allo strato 2 o 3. Quindi configurano i nodi rimanenti sulla rete per utilizzare il locale server del tempo. Nel caso della mia rete domestica, questo è un server di livello 3.

Varie implementazioni di NTP

L'implementazione originale di NTP è ntpd. È stato poi affiancato da due nuovi, chronyd e systemd-timesyncd. Tutti e tre sincronizzano l'ora dell'host locale con un time server NTP. Il servizio systemd-timesyncd non è affidabile come chronyd, ma è abbastanza buono per la maggior parte degli scopi. Se l'RTC non è sincronizzato, può regolare gradualmente l'ora del sistema per sincronizzarsi con il server NTP quando l'ora del sistema locale si sposta leggermente. Il servizio systemd-timesync non può essere utilizzato come time server.

Croni è un'implementazione di NTP che contiene due programmi: il demone chronyd e un'interfaccia a riga di comando chiamata chronyc. Chrony ha alcune caratteristiche indispensabili in molti casi:

  • Chrony può sincronizzarsi con un time server molto più velocemente del vecchio servizio ntpd. Questo è utile per laptop o desktop che non funzionano sempre.
  • Può compensare le fluttuazioni dell'orologio, ad esempio quando l'host va a dormire o entra in modalità di sospensione, o quando l'orologio cambia a causa del salto di frequenza, che rallenta i clock a bassi carichi.
  • Risolve i problemi di tempo relativi alla connessione di rete instabile o alla congestione della rete.
  • Regola i ritardi di rete.
  • Dopo la sincronizzazione dell'ora iniziale, Chrony non ferma mai l'orologio. Ciò fornisce intervalli di tempo stabili e coerenti per molti servizi e applicazioni di sistema.
  • Chrony può funzionare anche senza una connessione di rete. In questo caso, l'host o il server locale può essere aggiornato manualmente.
  • Chrony può fungere da server NTP.

Ancora una volta, NTP è un protocollo che può essere implementato su un host Linux usando Chrony o systemd-timesyncd.

Gli RPM NTP, Chrony e systemd-timesyncd sono disponibili nei repository Fedora standard. L'RPM systemd-udev è un gestore di eventi del kernel installato di default su Fedora, ma è facoltativo.

Puoi installarli tutti e tre e passare da uno all'altro, ma questo creerà un mal di testa in più. Quindi è meglio non farlo. Le versioni moderne di Fedora, CentOS e RHEL sono passate a Chrony come implementazione predefinita e hanno anche systemd-timesyncd. Trovo che Chrony funzioni bene, fornisca un'interfaccia migliore rispetto al servizio NTP, fornisca molte più informazioni e controllo, cosa che gli amministratori di sistema apprezzeranno sicuramente.

Disattivazione dei servizi NTP

Il servizio NTP potrebbe essere già in esecuzione sul tuo host. In tal caso, è necessario disabilitarlo prima di passare a qualcos'altro. Avevo chronyd in esecuzione, quindi ho usato i seguenti comandi per fermarlo e disabilitarlo. Esegui i comandi appropriati per qualsiasi demone NTP in esecuzione sul tuo host:

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

Verifica che il servizio sia fermo e disabilitato:

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

Controllo dello stato prima del lancio

Lo stato di sincronizzazione dell'orologio di sistema consente di determinare se il servizio NTP è in esecuzione. Poiché non hai ancora avviato NTP, il comando timesync-status suggerirà questo:

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

Una richiesta di stato diretta fornisce informazioni importanti. Ad esempio, il comando timedatectl senza argomenti o opzioni esegue il sottocomando status per impostazione predefinita:

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

Questo ti darà l'ora locale per il tuo host, l'ora UTC e l'ora RTC. In questo caso, l'ora del sistema è impostata sul fuso orario America/New_York (TZ), l'RTC è impostato sull'ora del fuso orario locale e il servizio NTP non è attivo. L'ora RTC ha iniziato a deviare leggermente dall'ora di sistema. Questo è normale per i sistemi i cui orologi non sono stati sincronizzati. La quantità di offset sull'host dipende dal tempo trascorso dall'ultima sincronizzazione del sistema.

Abbiamo anche ricevuto un avviso sull'utilizzo dell'ora locale per RTC, vale per le modifiche al fuso orario e le impostazioni dell'ora legale. Se il computer è spento quando è necessario apportare modifiche, l'RTC non cambierà. Ma per i server o altri host che funzionano XNUMX ore su XNUMX, questo non è affatto un problema. Inoltre, qualsiasi servizio che fornisce la sincronizzazione dell'ora NTP regolerà l'ora dell'host durante la fase di avvio iniziale, quindi l'ora sarà nuovamente corretta al termine dell'avvio.

Impostazione del fuso orario

Di solito si specifica il fuso orario durante la procedura di installazione e non si ha il compito di modificarlo successivamente. Tuttavia, ci sono momenti in cui è necessario modificare il fuso orario. Ci sono diversi strumenti che possono aiutare. Linux utilizza i file del fuso orario per determinare il fuso orario locale di un host. Questi file sono nella directory /usr/share/zoneinfo. Per impostazione predefinita, per il mio fuso orario, il sistema prescrive quanto segue: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Ma non è necessario conoscere tali sottigliezze per cambiare il fuso orario.

La cosa principale è conoscere il nome ufficiale del fuso orario per la tua posizione e il comando corrispondente. Supponiamo che tu voglia cambiare il fuso orario in 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>

Ora puoi impostare il fuso orario. Ho usato il comando date per verificare le modifiche, ma puoi anche usare 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 ~]#

Ora puoi riportare il fuso orario del tuo host all'ora locale.

systemd-timesyncd

Il demone systemd timesync fornisce un'implementazione NTP facile da gestire nel contesto systemd. È installato di default su Fedora e Ubuntu. Tuttavia, si avvia solo per impostazione predefinita su Ubuntu. Non sono sicuro di altre distribuzioni. Puoi verificare tu stesso:

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

Configurazione di systemd-timesyncd

Il file di configurazione per systemd-timesyncd è /etc/systemd/timesyncd.conf. Questo è un file semplice con meno opzioni abilitate rispetto ai vecchi servizi NTP e chronyd. Ecco il contenuto di questo file (senza ulteriori modifiche) sulla mia 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

L'unica sezione che contiene, oltre ai commenti, è [Time]. Tutte le altre righe sono commentate. Questi sono i valori predefiniti e non dovrebbero essere modificati (a meno che tu non abbia un motivo per farlo). Se non si dispone di un time server NTP definito nella riga NTP=, Fedora utilizza per impostazione predefinita un time server Fedora di fallback. Di solito aggiungo il mio time server:

NTP=myntpserver

Sincronizzazione tempi di esecuzione

Puoi avviare e rendere attivo systemd-timesyncd in questo modo:

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

Impostazione dell'orologio hardware

Ecco come appare la situazione dopo aver eseguito 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    

Inizialmente, la differenza tra RTC e ora locale (EDT) è inferiore a un secondo e la discrepanza aumenta di un altro paio di secondi nei giorni successivi. Poiché in RTC non esiste il concetto di fuso orario, il comando timedatectl deve eseguire un confronto per determinare il fuso orario corretto. Se l'ora RTC non corrisponde esattamente all'ora locale, allora non corrisponde nemmeno al fuso orario locale.

Alla ricerca di ulteriori informazioni, ho controllato lo stato di systemd-timesync e ho trovato questo:

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

Notare il messaggio di registro che indica che l'ora di sistema non è stata impostata o è stata reimpostata. Il servizio Timesync imposta l'ora di sistema in base al timestamp. I timestamp vengono gestiti dal demone timesync e vengono creati a ogni sincronizzazione riuscita.

Il comando timedatectl non ha modo di prendere il valore dell'orologio hardware dall'orologio di sistema. Può solo impostare l'ora e la data dal valore immesso nella riga di comando. È possibile impostare l'RTC sullo stesso valore dell'ora di sistema utilizzando il comando 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

L'opzione --localtime dice all'orologio hardware di mostrare l'ora locale, non UTC.

Perché hai bisogno di RTC?

Qualsiasi implementazione di NTP imposterà l'orologio di sistema all'avvio. E perché allora RTC? Questo non è del tutto vero: questo accadrà solo se si dispone di una connessione di rete al time server. Tuttavia, molti sistemi non hanno sempre accesso a una connessione di rete, quindi un orologio hardware è utile per Linux da utilizzare per impostare l'ora del sistema. È meglio che impostare manualmente l'ora, anche se potrebbe discostarsi dall'ora reale.

conclusione

Questo articolo ha esaminato alcuni strumenti per la manipolazione di data, ora e fusi orari. Lo strumento systemd-timesyncd fornisce un client NTP in grado di sincronizzare l'ora sull'host locale con un server NTP. Tuttavia, systemd-timesyncd non fornisce un servizio server, quindi se hai bisogno di un server NTP sulla tua rete, devi usare qualcos'altro, come Chrony, per fungere da server.

Preferisco avere un'unica implementazione per qualsiasi servizio sulla mia rete, quindi utilizzo Chrony. Se non hai bisogno di un server NTP locale, o se non ti dispiace usare Chrony come server e systemd-timesyncd come client SNTP. Dopotutto, non è necessario utilizzare le funzionalità aggiuntive di Chrony come client se si è soddisfatti della funzionalità di systemd-timesyncd.

Un'altra nota: non è necessario utilizzare gli strumenti systemd per implementare NTP. Puoi utilizzare una versione precedente di ntpd, Chrony o un'altra implementazione NTP. Dopotutto, systemd è costituito da un gran numero di servizi; molti di essi sono opzionali, quindi puoi disattivarli e utilizzare qualcos'altro. Questo non è un enorme mostro monolitico. Potrebbe non piacerti systemd o parti di esso, ma dovresti prendere una decisione informata.

Mi piace l'implementazione di NTP da parte di systemd, ma preferisco Chrony perché si adatta meglio alle mie esigenze. È Linux, piccola -)

Sui diritti della pubblicità

VDSina offre server per qualsiasi attività, una vasta selezione di sistemi operativi per l'installazione automatica, è possibile installare qualsiasi sistema operativo dal proprio ISO, comodo панель управления proprio sviluppo e pagamento giornaliero. Ricordiamo che abbiamo server eterni che sono decisamente senza tempo 😉

Sincronizzazione dell'ora di Linux: NTP, Chrony e systemd-timesyncd

Fonte: habr.com

Aggiungi un commento