Sincronizarea timpului în Linux: NTP, Chrony și systemd-timesyncd

Sincronizarea timpului în Linux: NTP, Chrony și systemd-timesyncd
Cei mai mulți oameni își monitorizează timpul. Ne trezim la timp pentru a ne îndeplini ritualurile de dimineață și a pleca la serviciu, pentru a lua o pauză de prânz, a respecta termenele de proiect, a sărbători zile de naștere și sărbători, a urca într-un avion și așa mai departe.

Mai mult decât atât: unii dintre noi sunt obsedați de timp. Ceasurile mele funcționează cu energie solară și primesc ora exactă de la Institutul Național de Standarde și Tehnologie (NIST) din Fort Collins (Colorado) printr-o stație radio pe unde lungi. WWVB. Semnalele de timp sunt sincronizate cu ceasurile atomice, care sunt de asemenea situate în Fort Collins. Fitbit-ul meu se sincronizează cu telefonul meu, care se sincronizează cu serverul NTP, care în cele din urmă se sincronizează cu ceasurile atomice.

Dispozitivele monitorizează și ele timpul.

Există multe motive pentru care dispozitivele și computerele noastre au nevoie de timp exact. De exemplu, în sectorul bancar, pe piețele financiare și în alte întreprinderi financiare, tranzacțiile trebuie să se desfășoare în ordinea corectă, iar pentru aceasta succesiunile temporale exacte sunt esențiale.

Telefoanele noastre, tabletele, mașinile, sistemele GPS și computerele necesită o reglementare precisă a timpului și datei. Vreau ca ceasul de pe desktopul computerului meu să arate timpul corect. Vreau ca în calendarul meu local, mementourile să apară la momentul potrivit. Timpul corect garantează de asemenea că sarcinile cron și systemd sunt executate la timpul corect.

Data și timpul sunt, de asemenea, importante pentru jurnalizare, astfel încât este puțin mai ușor să găsești anumite loguri, orientându-te după dată și timp. De exemplu, odată am lucrat în DevOps (pe atunci nu se numea așa) și configuram un sistem de email în Carolina de Nord. În trecut, procesam mai mult de 20 de milioane de emailuri pe zi. Urmărirea emailurilor printr-o serie de servere sau determinarea succesiunii exacte a evenimentelor utilizând fișierele jurnal pe gazde geografic distribuite poate fi mult mai ușoară dacă computerele respective sunt sincronizate din punct de vedere al timpului.

Un timp există – ceasuri sunt multe.

Gazdele Linux trebuie să ia în considerare că există timpul sistemului și timpul RTC. RTC (Real Time Clock — Ceas în timp real) este un nume puțin ciudat și nu prea precis pentru ceasurile hardware.

Ceasurile hardware funcționează continuu, chiar și atunci când calculatorul este oprit, folosind o baterie pe placa de bază a sistemului. Funcția principală a RTC este de a păstra timpul atunci când conexiunea la serverul de timp nu este disponibilă. În vremurile în care nu era posibil să te conectezi la un server de timp prin Internet, fiecare calculator trebuia să aibă ceasuri interne precise. Sistemele de operare trebuiau să acceseze RTC în timpul încărcării, iar utilizatorul trebuia să seteze manual ora sistemului folosind interfața hardware de configurare BIOS pentru a se asigura că este corectă.

Ceasurile hardware nu înțeleg conceptul de fus orar; în RTC este stocată doar ora, nu fusul orar sau deviația față de UTC (Timpul Coordinat Universal, cunoscut și ca GMT sau Timpul Mediu Greenwich). Poți seta RTC cu un instrument despre care voi vorbi mai târziu în acest articol.

Timpul sistemului este ora pe care OS o afișează pe ceasurile GUI de pe desktop-ul tău, în ieșirea comenzii date, în marcajele de timp ale jurnalelor. Se referă, de asemenea, la ora de creare, modificare și deschidere a fișierelor.

Pe pagina man pentru rtc există o descriere completă a RTC și a ceasurilor sistemului.

Ce se întâmplă cu NTP?

Computerele din întreaga lume folosesc NTP (protocola de timp de rețea) pentru a-și sincroniza timpul cu ceasuri de referință standard prin Internet, folosind o ierarhie de servere NTP. Serverele de timp de nivel 1 sunt direct conectate la diverse servicii naționale de timp de nivel 0 prin satelit, radio sau chiar modemuri prin linii telefonice. Serviciile de timp de nivel 0 pot fi ceasuri atomice, un receptor radio care este sincronizat cu semnalele transmise de ceasurile atomice sau un receptor GPS care folosește semnale extrem de precise de oră transmise de sateliți GPS.

Pe majoritatea serverelor de referință sunt deschise mii de servere NTP publice stratum 2, accesibile tuturor. Multe organizații și utilizatori (inclusiv eu) cu un număr mare de gazde care necesită un server NTP preferă să instaleze propriile servere de timp, astfel încât doar un singur gazd local să acceseze stratum 2 sau 3. Apoi, ei configurează nodurile rămase din rețea pentru a utiliza serverul local de timp. În cazul rețelei mele de acasă, acesta este un server de nivel 3.

Diverse implementări NTP

Implementarea inițială a NTP este ntpd. Apoi s-au alăturat două implementări mai recente, chronyd și systemd-timesyncd. Toate trei sincronizează timpul gazdei locale cu serverul de timp NTP. Serviciul systemd-timesyncd nu este la fel de fiabil ca chronyd, dar este suficient pentru majoritatea scopurilor. Dacă RTC nu este sincronizat, acesta poate corecta treptat timpul sistemului pentru a se alinia cu serverul NTP, atunci când timpul sistemului local devine puțin deplasat. Serviciul systemd-timesync nu poate fi utilizat ca server de timp.

Chrony este o implementare NTP care conține două programe: demonul chronyd și o interfață de linie de comandă numită chronyc. Chrony are anumite funcții care în multe cazuri sunt pur și simplu esențiale:

  • Chrony se poate sincroniza cu serverul de timp mult mai repede decât vechiul serviciu ntpd. Aceasta este bună pentru laptopuri sau computere desktop care nu funcționează constant.
  • Poate compensa variațiile frecvențelor de tact, de exemplu, atunci când gazda intră în modul de repaus sau când frecvența de tact se schimbă din cauza unei modificări bruște a frecvenței, care încetinește frecvențele la sarcini ușoare.
  • Rezolvă problemele de timp legate de o conexiune de rețea instabilă sau de congestia rețelei.
  • Reglează întârzierile din rețea.
  • După sincronizarea inițială a timpului, Chrony nu oprește niciodată ceasurile. Aceasta asigură intervale de timp stabile și consistente pentru multe servicii și aplicații din sistem.
  • Chrony poate funcționa chiar și fără conexiune la rețea. În acest caz, gazda locală sau serverul poate fi actualizat manual.
  • Chrony poate funcționa ca un server NTP.

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

Pachetele RPM NTP, Chrony și systemd-timesyncd sunt disponibile în repozitoarele standard Fedora. RPM systemd-udev este un manager de evenimente pentru kernel, care este instalat în mod implicit în Fedora, dar nu este obligatoriu pentru utilizare.

Puteți instala toate cele trei și să comutați între ele, dar acest lucru va crea o durere de cap suplimentară. Așa că ar fi mai bine să nu o faceți. Versiunile moderne de Fedora, CentOS și RHEL au trecut la Chrony ca implementare standard, și în plus, au systemd-timesyncd. Cred că Chrony funcționează bine, oferă o interfață mai bună decât serviciul NTP, furnizează mult mai multe informații și îmbunătățește controlul, ceea ce va plăcea cu siguranță administratorilor de sistem.

Dezactivarea serviciilor NTP

Este posibil ca pe hostul dvs. să fie deja activat un serviciu NTP. Dacă este așa, trebuie să-l dezactivați înainte de a comuta pe altceva. Am avut activat chronyd, așa că am folosit următoarele comenzi pentru a-l opri și dezactiva. Rulați comenzile corespunzătoare pentru orice demon NTP pe care îl utilizați pe hostul dvs.:

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

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

[root@testvm1 ~]# systemctl status chronyd
● chronyd.service - Client/Server NTP
     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 statutului înainte de pornire

Statusul sincronizării sistemului de ceasuri permite determinarea dacă serviciul NTP este activat. Deoarece nu ați pornit încă NTP, comanda timesync-status sugerează acest lucru:

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

O solicitare directă de statut oferă informații importante. De exemplu, comanda timedatectl fără argumente sau parametrii execută subcomanda status în mod implicit:

[root@testvm1 ~]# timedatectl status
           Ora locală: Vin 2020-05-15 08:43:10 EDT  
           Ora universală: Vin 2020-05-15 12:43:10 UTC  
                 Ora RTC: Vin 2020-05-15 08:43:08      
                Fus orar: America/New_York (EDT, -0400)
Ceasul sistemului sincronizat: nu                          
              Serviciul NTP: inactiv                    
          RTC în TZ local: da                    

Atenție: Sistemul este configurat pentru a citi timpul RTC în fusul orar local.
         Acest mod nu poate fi complet susținut. Va crea diverse probleme
         cu schimbările de fus orar și ajustările de ora de vară. Timpul RTC
         nu este niciodată actualizat, se bazează pe facilități externe pentru a-l menține.
         Dacă este posibil, folosiți RTC în UTC apelând
         'timedatectl set-local-rtc 0'.
[root@testvm1 ~]#

Astfel, veți obține ora locală pentru gazda dvs., ora UTC și ora RTC. În acest caz, timpul sistemului este setat pe fusul orar America / New_York (TZ), RTC este setat pe timpul din fusul orar local, iar serviciul NTP nu este activ. Timpul RTC a început să se abată puțin de la timpul sistemului. Acest lucru este normal pentru sistemele ale căror ceasuri nu au fost sincronizate. Dimensiunea abaterii pe gazdă depinde de timpul scurs de la ultima sincronizare a sistemului.

Am primit de asemenea un avertisment privind utilizarea timpului local pentru RTC — aceasta se referă la schimbările de fus orar și setările de ora de vară. Dacă computerul este oprit în momentul în care trebuie efectuate modificările, timpul RTC nu se va schimba. Dar pentru servere sau alte gazde care funcționează non-stop, aceasta nu este o problemă. În plus, orice serviciu care asigură sincronizarea timpului NTP va corecta timpul gazdei încă de la începutul procesului de pornire, astfel încât, după finalizarea pornirii, timpul va deveni din nou corect.

Setarea fusului orar

În mod obișnuit, indicați fusul orar în timpul procedurii de instalare și nu ar trebui să-l schimbați ulterior. Totuși, există cazuri în care este necesară schimbarea fusului orar. Există câteva instrumente care vă pot ajuta. Pentru a determina fusul orar local, gazda Linux utilizează fișiere de fusuri orare. Aceste fișiere se află în directorul /usr/share/zoneinfo. În mod implicit, pentru fusul meu orar, sistemul scrie următoarele: /etc/ localtime -> ../usr/share/zoneinfo/America/New_York. Însă nu trebuie să cunoașteți astfel de detalii pentru a schimba fusul orar.

Cel mai important este să cunoașteți denumirea oficială a fusului orar pentru locația dvs. și comanda corespunzătoare. Să spunem că doriți să schimbați fusul orar în Los Angeles:


[root@testvm2 ~]# timedatectl list-timezones | column

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

Acum puteți seta fusul orar. Am folosit comanda date pentru a verifica modificările, dar puteți folosi și timedatectl:

[root@testvm2 ~]# date
Mar 19 Mai 2020 04:47:49 PM EDT
[root@testvm2 ~]# timedatectl set-timezone America/Los_Angeles
[root@testvm2 ~]# date
Mar 19 Mai 2020 01:48:23 PM PDT
[root@testvm2 ~]#

Acum puteți schimba din nou fusul orar al gazdei dumneavoastră la ora locală.

systemd-timesyncd

Demonul systemd timesync oferă o implementare NTP care este ușor de gestionat în contextul systemd. Este instalat implicit în Fedora și Ubuntu. Totuși, acesta este pornit implicit doar în Ubuntu. Nu sunt sigur în legătură cu alte distribuții. Puteți verifica singuri:

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

Configurarea systemd-timesyncd

Fișierul de configurație pentru systemd-timesyncd este /etc/systemd/timesyncd.conf. Acesta este un fișier simplu, cu mai puține opțiuni activate decât în vechile servicii NTP și chronyd. Iată conținutul acestui fișier (fără modificări suplimentare) pe mașina mea virtuală 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, în afară de comentarii, este [Time]. Toate celelalte linii sunt comentate. Acestea sunt valorile implicite, nu trebuie schimbate (dacă nu aveți motive să le modificați). Dacă nu aveți un server de timp NTP specificat în linia NTP =, serverul de timp Fedora este utilizat implicit în Fedora. De obicei, adaug serverul meu de timp:

NTP=myntpserver

Pornirea timesync

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 orelor hardware

Iată cum arată situația după ce timesyncd a fost pornit:

[root@testvm2 systemd]# timedatectl
               Local time: Sâm 2020-05-16 14:34:54 EDT  
           Universal time: Sâm 2020-05-16 18:34:54 UTC  
                 RTC time: Sâm 2020-05-16 14:34:53      
                Time zone: America/New_York (EDT, -0400)
Sys clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: no    

Inițial, diferența dintre RTC și ora locală (EDT) nu depășește o secundă, iar abaterile cresc cu câteva secunde în următoarele câteva zile. Deoarece RTC nu are noțiunea de fusuri orare, comanda timedatectl trebuie să efectueze o comparație pentru a determina fusul orar necesar. Dacă ora RTC nu corespunde exact cu ora locală, atunci înseamnă că nu corespunde nici fusului orar local.

În căutarea unor informații suplimentare, am verificat starea systemd-timesync și am descoperit următoarele:

[root@testvm2 systemd]# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Sincronizare a timpului de rețea
     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: "Sincronizare inițială cu serverul de timp 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]: Timpul ceasului de sistem a fost nesetată sau a fost resetată, restaurându-se de la timestamp-ul înregistrat: Sat 2020-05-16 13:56:53 EDT
May 16 13:56:53 testvm2.both.org systemd[1]: A început sincronizarea timpului de rețea.
May 16 13:57:56 testvm2.both.org systemd-timesyncd[822]: Sincronizare inițială cu serverul de timp 163.237.218.19:123 (2.fedora.pool.ntp.org).
[root@testvm2 systemd]#

Observați mesajul din jurnal care indică faptul că timpul sistemului nu este setat sau a fost resetat. Serviciul Timesync setează timpul sistemului pe baza timestamp-ului. Timpul este menținut de demonul timesync și este generat la fiecare sincronizare reușită.

Comanda timedatectl nu are capacitatea de a prelua valoarea ceasurilor hardware din ceasurile sistemului. Poate seta ora și data doar din valoarea introdusă în linia de comandă. Puteți seta RTC la aceeași valoare ca și timpul 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 indică faptul că ceasurile hardware arată ora locală, nu UTC.

De ce aveți nevoie de RTC?

Orice implementare NTP va seta ceasul sistemului la pornire. Și atunci, de ce este nevoie de RTC? Nu este chiar așa: acest lucru se va întâmpla doar dacă aveți o conexiune de rețea cu un server de timp. Cu toate acestea, multe sisteme nu au acces constant la o conexiune de rețea, astfel că ceasurile hardware sunt utile pentru ca Linux să poată stabili ora sistemului pe baza lor. Este mai bine decât să setați ora manual, chiar dacă aceasta poate să se abată de la timpul real.

Concluzie

În acest articol, sunt prezentate unele instrumente pentru gestionarea datei, orei și fusurilor orare. Instrumentul systemd-timesyncd oferă un client NTP care poate sincroniza timpul pe gazda locală cu un server NTP. Cu toate acestea, systemd-timesyncd nu oferă un serviciu server, astfel că, dacă aveți nevoie de un server NTP în rețeaua dumneavoastră, trebuie să folosiți altceva — de exemplu, Chrony, pentru a funcționa ca server.

Prefer să am o singură implementare pentru orice servicii 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ă folosiți Chrony ca server și systemd-timesyncd ca client SNTP. Totuși, nu este necesar să folosiți funcționalitățile suplimentare ale Chrony ca client, dacă sunteți mulțumit de funcționalitatea oferită de systemd-timesyncd.

Un alt aspect: nu sunteți obligat să folosiți instrumentele systemd pentru a implementa NTP. Puteți folosi o versiune mai veche a ntpd, Chrony sau altă implementare NTP. Systemd este compus dintr-o mulțime de servicii; multe dintre acestea sunt opționale, așa că pot fi dezactivate și folosite în locul lor alte soluții. Nu este un monolit gigantic. Puteți să nu iubiți systemd sau o parte din el, dar trebuie să luați o decizie fundamentată.

Îmi place implementarea NTP în systemd, dar prefer Chrony, deoarece se potrivește mai bine nevoilor mele. Este Linux, dragule -)

În numele publicității

VDSina oferă servere pentru orice sarcină, o gamă largă de sisteme de operare pentru instalare automată, aveți opțiunea de a instala orice OS de pe propriul ISO, convenabilă panoul de control proiect și plată zilnică. Vă reamintim, avem servere eterne, care nu sunt afectate de timp 😉

Sincronizarea timpului în Linux: NTP, Chrony și systemd-timesyncd

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster