Sincronizare oră Linux: NTP, Chrony și systemd-timesyncd

Sincronizare oră Linux: NTP, Chrony și systemd-timesyncd
Majoritatea oamenilor țin evidența timpului. Ne trezim la timp pentru a ne îndeplini ritualurile de dimineață și mergem la muncă, luăm o pauză de masă, respectăm termenele limită ale proiectului, sărbătorim zilele de naștere și sărbătorile, ne îmbarcăm într-un avion și așa mai departe.

Mai mult: unii dintre noi suntem obsedați de timp. Ceasul meu este alimentat de energie solară și primește ora exactă de la Institutul Național de Standarde și Tehnologie (NIST) către Fort Collins, Colorado prin radio cu undă lungă WWVB. Semnalele de timp sunt sincronizate cu ceasul atomic, situat tot la Fort Collins. Fitbit-ul meu se sincronizează cu telefonul meu care se sincronizează cu serverul NTP, care se sincronizează în cele din urmă cu ceasul atomic.

De asemenea, dispozitivele țin evidența timpului

Există multe motive pentru care dispozitivele și computerele noastre au nevoie de timp precis. De exemplu, în sectorul bancar, pe piețele de valori și în alte afaceri financiare, tranzacțiile trebuie efectuate în ordinea corectă, iar secvențele de timp precise sunt esențiale în acest sens.

Telefoanele, tabletele, mașinile, sistemele GPS și computerele noastre necesită setări precise de oră și dată. Vreau ca ceasul de pe desktopul computerului meu să arate ora corectă. Doresc ca mementourile să apară în calendarul meu local la momentul potrivit. Ora corectă asigură, de asemenea, că joburile cron și systemd rulează la momentul corect.

Data și ora sunt, de asemenea, importante pentru înregistrare, așa că este puțin mai ușor să găsiți anumite jurnale bazate pe dată și oră. De exemplu, am lucrat odată în DevOps (nu se numea așa pe atunci) și am creat un sistem de e-mail în statul Carolina de Nord. Obișnuiam să procesăm peste 20 de milioane de e-mailuri pe zi. Urmărirea e-mailului printr-o serie de servere sau determinarea secvenței exacte a evenimentelor folosind fișiere jurnal pe gazde dispersate geografic, poate fi mult mai ușoară dacă computerele respective sunt sincronizate în timp.

O singură dată - multe ore

Gazdele Linux trebuie să țină cont de faptul că există o oră de sistem și o oră RTC. RTC (Real Time Clock) este un nume ușor ciudat și nu foarte precis pentru un ceas hardware.

Ceasul hardware rulează continuu chiar și atunci când computerul este oprit, folosind bateria de pe placa de bază a sistemului. Funcția principală a RTC este de a stoca timpul atunci când o conexiune la un server de timp nu este disponibilă. În vremurile în care era imposibil să se conecteze la un server de timp prin Internet, fiecare computer trebuia să aibă un ceas intern precis. Sistemele de operare trebuiau să acceseze RTC în momentul pornirii, iar utilizatorul trebuia să seteze manual ora sistemului utilizând interfața de configurare hardware BIOS pentru a se asigura că este corectă.

Ceasurile hardware nu înțeleg conceptul de fus orar; RTC stochează doar ora, nu fusul orar sau decalajul față de UTC (Timp universal coordonat, cunoscut și sub numele de GMT sau Greenwich Mean Time). Puteți instala RTC folosind un instrument pe care îl voi trata mai târziu în acest articol.

Ora sistemului este timpul pe care sistemul de operare îl afișează pe ceasul GUI de pe desktop, în ieșirea comenzii date, în marcajele de timp ale jurnalelor. Acest lucru se aplică și atunci când fișierele sunt create, modificate și deschise.

Pagină om pentru rtc există o descriere completă a RTC și a ceasului sistemului.

Ce e cu NTP?

Calculatoarele din întreaga lume folosesc NTP (Network Time Protocol) pentru a-și sincroniza ora cu ceasurile de referință standard prin Internet folosind o ierarhie de servere NTP. Principalele servere de timp sunt la nivelul 1 și sunt conectate direct la diferite servicii naționale de timp la nivelul 0 prin satelit, radio sau chiar modemuri prin linii telefonice. Serviciile de timp de nivel 0 pot fi un ceas atomic, un receptor radio care este reglat la semnalele transmise de ceasurile atomice sau un receptor GPS care utilizează semnale de ceas foarte precise transmise de sateliții GPS.

Marea majoritate a serverelor de referință au câteva mii de servere publice NTP stratul 2 deschise publicului. Multe organizații și utilizatori (inclusiv eu) cu o mulțime de gazde care au nevoie de un server NTP aleg să-și configureze propriile servere de timp, astfel încât o singură gazdă locală accesează stratul 2 sau 3. Apoi configurează nodurile rămase din rețea pentru a utiliza sistemul local. server de timp. În cazul rețelei mele de acasă, acesta este un server de nivel 3.

Diverse implementări ale NTP

Implementarea originală a NTP este ntpd. I s-au alăturat apoi două altele mai noi, chronyd și systemd-timesyncd. Toate trei sincronizează ora gazdă locală cu un server de timp NTP. Serviciul systemd-timesyncd nu este la fel de fiabil ca chronyd, dar este suficient de bun pentru majoritatea scopurilor. Dacă RTC nu este sincronizat, poate ajusta treptat ora sistemului pentru a se sincroniza cu serverul NTP atunci când ora sistemului local variază ușor. Serviciul systemd-timesync nu poate fi utilizat ca server de timp.

Cronia este o implementare a NTP care conține două programe: demonul chronyd și o interfață de linie de comandă numită chronyc. Chrony are câteva caracteristici care sunt indispensabile în multe cazuri:

  • Chrony se poate sincroniza cu un server de timp mult mai rapid decât vechiul serviciu ntpd. Acest lucru este bun pentru laptopuri sau desktop-uri care nu funcționează tot timpul.
  • Poate compensa fluctuațiile ceasului, cum ar fi atunci când gazda intră în stare de repaus sau intră în modul de repaus sau când ceasul se schimbă din cauza saltului de frecvență, care încetinește ceasurile la sarcini reduse.
  • Rezolvă problemele de timp legate de conexiunea instabilă la rețea sau de congestionarea rețelei.
  • Reglează întârzierile rețelei.
  • După sincronizarea inițială a orei, Chrony nu oprește niciodată ceasul. Aceasta oferă intervale de timp stabile și consecvente pentru multe servicii și aplicații de sistem.
  • Chrony poate funcționa chiar și fără o conexiune la rețea. În acest caz, gazda locală sau serverul poate fi actualizat manual.
  • Chrony poate acționa ca un server NTP.

Încă o dată, NTP este un protocol care poate fi implementat pe o gazdă Linux folosind Chrony sau systemd-timesyncd.

RPM-urile NTP, Chrony și systemd-timesyncd sunt disponibile în depozitele standard Fedora. Systemd-udev RPM este un manager de evenimente kernel care este instalat implicit pe Fedora, dar este opțional.

Puteți să le instalați pe toate trei și să comutați între ele, dar acest lucru va crea o durere de cap suplimentară. Deci mai bine nu. Versiunile moderne ale Fedora, CentOS și RHEL s-au mutat la Chrony ca implementare implicită și au, de asemenea, systemd-timesyncd. Consider că Chrony funcționează bine, oferă o interfață mai bună decât serviciul NTP, oferă mult mai multe informații și control, de care administratorii de sistem se vor bucura cu siguranță.

Dezactivarea serviciilor NTP

Este posibil ca serviciul NTP să ruleze deja pe gazda dvs. Dacă da, trebuie să-l dezactivați înainte de a trece la altceva. Am rulat chronyd, așa că am folosit următoarele comenzi pentru a-l opri și a-l dezactiva. Rulați comenzile adecvate pentru orice demon NTP pe care îl rulați pe gazda dvs.:

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

Verificați dacă serviciul este oprit și dezactivat:

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

Verificarea stării înainte de lansare

Starea de sincronizare a ceasului sistemului vă permite să determinați dacă serviciul NTP rulează. Deoarece nu ați pornit încă NTP, comanda timesync-status va sugera acest lucru:

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

O solicitare directă de stare oferă informații importante. De exemplu, comanda timedatectl fără argument sau opțiuni execută subcomanda de stare în mod implicit:

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

Acest lucru vă va oferi ora locală pentru gazda dvs., ora UTC și ora RTC. În acest caz, ora sistemului este setată la fusul orar America / New_York (TZ), RTC este setat la ora din fusul orar local și serviciul NTP nu este activ. Ora RTC a început să se abate ușor de la ora sistemului. Acest lucru este normal pentru sistemele ale căror ceasuri nu au fost sincronizate. Cantitatea de compensare pe gazdă depinde de timpul care a trecut de la ultima sincronizare a sistemului.

De asemenea, am primit un avertisment cu privire la utilizarea orei locale pentru RTC - acest lucru se aplică modificărilor fusului orar și setărilor DST. Dacă computerul este oprit când trebuie făcute modificări, RTC nu se va modifica. Dar pentru servere sau alte gazde care rulează non-stop, aceasta nu este deloc o problemă. În plus, orice serviciu care oferă sincronizare de timp NTP va ajusta ora gazdei în timpul fazei inițiale de pornire, astfel încât ora să fie corectă din nou după finalizarea pornirii.

Setarea fusului orar

De obicei, specificați fusul orar în timpul procedurii de instalare și nu aveți sarcina de a-l schimba ulterior. Cu toate acestea, există momente când trebuie să schimbați fusul orar. Există mai multe instrumente care vă pot ajuta. Linux folosește fișiere de fus orar pentru a determina fusul orar local al unei gazde. Aceste fișiere sunt în director /usr/share/zoneinfo. În mod implicit, pentru fusul meu orar, sistemul prescrie acest lucru: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Dar nu trebuie să cunoașteți astfel de subtilități pentru a schimba fusul orar.

Principalul lucru este să cunoașteți numele oficial al fusului orar pentru locația dvs. și comanda corespunzătoare. Să presupunem că doriți să schimbați fusul orar în 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>

Acum puteți seta fusul orar. Am folosit comanda date pentru a verifica modificările, dar puteți folosi ș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 ~]#

Acum puteți schimba fusul orar al gazdei dvs. înapoi la ora locală.

systemd-timesyncd

Daemonul systemd timesync oferă o implementare NTP care este ușor de gestionat în contextul systemd. Este instalat implicit pe Fedora și Ubuntu. Cu toate acestea, pornește numai implicit pe Ubuntu. Nu sunt sigur de alte distribuții. Puteți verifica singur:

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

Configurarea systemd-timesyncd

Fișierul de configurare pentru systemd-timesyncd este /etc/systemd/timesyncd.conf. Acesta este un fișier simplu cu mai puține opțiuni activate decât vechile servicii NTP și chronyd. Iată conținutul acestui fișier (fără alte modificări) pe 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

Singura secțiune pe care o conține, pe lângă comentarii, este [Timp]. Toate celelalte rânduri sunt comentate. Acestea sunt valorile implicite și nu trebuie modificate (cu excepția cazului în care aveți un motiv). Dacă nu aveți un server de timp NTP definit în linia NTP=, Fedora folosește implicit un server de timp Fedora alternativ. De obicei adaug serverul meu de timp:

NTP=myntpserver

Se execută sincronizarea timpului

Puteți porni și activa systemd-timesyncd astfel:

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

Setarea ceasului hardware

Iată cum arată situația după rularea 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    

Inițial, diferența dintre RTC și ora locală (EDT) este mai mică de o secundă, iar discrepanța crește cu încă câteva secunde în următoarele zile. Deoarece nu există un concept de fus orar în RTC, comanda timedatectl trebuie să efectueze o comparație pentru a determina fusul orar corect. Dacă ora RTC nu se potrivește exact cu ora locală, atunci nu se potrivește nici cu fusul orar local.

Căutând mai multe informații, am verificat starea systemd-timesync și am găsit asta:

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

Observați mesajul de jurnal care spune că ora sistemului nu a fost setată sau a fost resetată. Serviciul Timesync setează ora sistemului pe baza marcajului de timp. Marcajele de timp sunt menținute de demonul timesync și sunt create la fiecare sincronizare reușită.

Comanda timedatectl nu are nicio modalitate de a lua valoarea ceasului hardware din ceasul sistemului. Poate seta ora și data doar din valoarea introdusă pe linia de comandă. Puteți seta RTC la aceeași valoare ca și ora sistemului utilizând comanda 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

Opțiunea --localtime spune ceasului hardware să arate ora locală, nu UTC.

De ce ai nevoie de RTC?

Orice implementare a NTP va seta ceasul sistemului la momentul pornirii. Și atunci de ce RTC? Acest lucru nu este în întregime adevărat: acest lucru se va întâmpla numai dacă aveți o conexiune de rețea la serverul de timp. Cu toate acestea, multe sisteme nu au întotdeauna acces la o conexiune de rețea, așa că un ceas hardware este util pentru Linux pentru a seta ora sistemului. Acest lucru este mai bine decât setarea manuală a orei, chiar dacă se poate abate de la timpul real.

Concluzie

Acest articol a trecut în revistă câteva instrumente pentru manipularea datei, orei și fusurilor orare. Instrumentul systemd-timesyncd oferă un client NTP care poate sincroniza ora de pe gazda locală cu un server NTP. Cu toate acestea, systemd-timesyncd nu oferă un serviciu de server, așa că dacă aveți nevoie de un server NTP în rețea, trebuie să utilizați altceva, cum ar fi Chrony, pentru a acționa ca server.

Prefer să am o singură implementare pentru orice serviciu din rețeaua mea, așa că folosesc Chrony. Dacă nu aveți nevoie de un server NTP local sau dacă nu vă deranjează să utilizați Chrony ca server și systemd-timesyncd ca client SNTP. La urma urmei, nu este nevoie să utilizați funcțiile suplimentare ale Chrony ca client dacă sunteți mulțumit de funcționalitatea systemd-timesyncd.

O altă notă: nu vi se cere să utilizați instrumentele systemd pentru a implementa NTP. Puteți utiliza o versiune mai veche a ntpd, Chrony sau o altă implementare NTP. La urma urmei, systemd constă dintr-un număr mare de servicii; multe dintre ele sunt opționale, așa că le puteți dezactiva și utilizați altceva. Acesta nu este un monstru monolitic uriaș. Este posibil să nu vă placă systemd sau părți ale acestuia, dar ar trebui să luați o decizie în cunoștință de cauză.

Îmi place implementarea NTP de către systemd, dar prefer Chrony pentru că se potrivește mai bine nevoilor mele. Este Linux, iubito -)

Despre drepturile de publicitate

VDSina oferă servere pentru orice sarcină, o selecție uriașă de sisteme de operare pentru instalare automată, este posibil să instalați orice sistem de operare din propriul dvs ISO, confortabil panoul de control dezvoltare proprie si plata zilnica. Amintiți-vă că avem servere eterne care sunt cu siguranță atemporale 😉

Sincronizare oră Linux: NTP, Chrony și systemd-timesyncd

Sursa: www.habr.com

Adauga un comentariu