26
Oktober
2023
Zeitsynchronisierung unter Linux: Verwendung des SNTP-Dienstes
15:45

Zeitsynchronisierung unter Linux: Verwendung des SNTP-Dienstes

26 Oktober 2023 15:45

Es gibt Situationen, in denen die Fähigkeiten eines regulären NTP-Client-Dienstes nicht ausreichen: Ein Beispiel hierfür ist der Neustart eines PCs ohne CMOS-Batterie. Schlechte Internetqualität – seltene Zeitsynchronisierung verhindert, dass der NTP-Dienst vollständig funktioniert. Um dieses Problem zu lösen, wurde der Dienst systemd-timesyncd erfunden, der mit dem vereinfachten SNTP-Protokoll – Simple NTP – arbeitet.

Zeitzone einstellen

(Optional) Zeitzonen werden im Artikel besprochen „Linux-Zeit“.

sudo timedatectl set-timezone Europa/Moskau

Zeitsynchronisationsmethoden

1) Verwendung des Clients NTP was darin besprochen wird Artikel- Vollständiger NTP-Client.

2) Verwendung des systemd-timesyncd-Dienstes – ein einfacher Client SNTP mit Synchronisation über systemd.
3) andere Methoden (ich denke nicht darüber nach).

Installieren des systemd-timesyncd-Dienstes

sudo apt install systemd-timesyncd

Starten des systemd-timesyncd-Dienstes

sudo systemctl enable systemd-timesyncd.service
sudo systemctl start systemd-timesyncd.service

Aktivieren der Zeitsynchronisierung über den systemd-timesyncd-Dienst

Ermöglicht die Zeitsynchronisierung über das Netzwerk:

sudo timedatectl set-ntp true

Automatische Zeitsynchronisation einrichten

Damit die Zeitkorrektur automatisch in bestimmten Intervallen erfolgt, müssen Sie die Konfigurationsdatei korrigieren /etc/systemd/timesyncd.conf:

sudo nano /etc/systemd/timesyncd.conf

[Zeit]
NTP=2.ru.pool.ntp.org
FallbackNTP=3.ru.pool.ntp.org
RootDistanceMaxSec=5
PollIntervalMinSec=32
PollIntervalMaxSec=2048

In diesem Beispiel liegt das Abfrageintervall des NTP-Servers zwischen 32 Sekunden und 34 Minuten.

Neustart des systemd-timesyncd-Dienstes:

sudo systemctl restart systemd-timesyncd.service

Überprüfen des Zeitsynchronisationsstatus

timedatectl status

Wenn alles in Ordnung ist, wird die Ausgabe sein:

Systemuhr synchronisiert: ja
NTP service: active

Hinweis

Beide Methoden schließen sich gegenseitig aus:
*NTP:* durch die Installation der NTP/SNTP-Pakete wird das Paket systemd-timesyncd automatisch entfernt.
SNTP:** das NTP-Paket ist nicht erforderlich, damit systemd-timesyncd funktioniert.

Es scheint, dass die zweite Methode, SNTP, besser für Feldumgebungen und eingebettete Systeme geeignet ist. Da die Zeit zwischen Neustarts in einer speziellen Datei und mit Hilfe von Änderungen gespeichert wird, wird die Uhrabweichung berücksichtigt.

MAN - Benutzerhandbuch für den Dienst SYSTEMD-TIMESYNCD.SERVICE

SYSTEMD-TIMESYNCD.SERVICE(8) systemd-timesyncd.service SYSTEMD-TIMESYNCD.SERVICE(8)

NAME
systemd-timesyncd.service, systemd-timesyncd — синхронизация времени по сети

ZUSAMMENFASSUNG
systemd-timesyncd.service
/lib/systemd/systemd-timesyncd

BESCHREIBUNG
systemd-timesyncd ist ein Systemdienst, der zum Synchronisieren der lokalen Systemuhr mit einem Remote-Network Time Protocol (NTP)-Server verwendet werden kann.

Außerdem speichert es bei jeder Synchronisierung der Uhr die lokale Zeit auf der Festplatte und nutzt diese, um möglicherweise die System-Echtzeituhr bei nachfolgenden Neustarts weiterzustellen, um sicherzustellen, dass sie (ungefähr) monoton weiterläuft, selbst wenn das System keinen batteriegepufferten RTC-Chip hat.

Der systemd-timesyncd-Dienst implementiert nur SNTP. Dieser minimalistische Dienst erhöht den Systemtakt bei großen Offsets oder passt ihn bei kleineren Offsets langsam an. Komplexe Anwendungsfälle, die eine vollständige NTP-Unterstützung erfordern (und bei denen SNTP nicht ausreicht), werden von systemd-timesyncd nicht abgedeckt.

Der Zugriff auf NTP-Server wird basierend auf globalen Einstellungen in timesyncd.conf(5), statischen kanalspezifischen Einstellungen in .network-Dateien und dynamischen kanalspezifischen Einstellungen bestimmt, die über DHCP abgerufen werden und in den Zusatzinformationen zu finden sind – siehe systemd.network(5).

Team timedatectl set-ntp true kann verwendet werden, um diesen Dienst zu aktivieren und zu starten oder zu deaktivieren und zu stoppen.

Mannschaften timedatectl timesync-status und timedatectl show-timesync kann verwendet werden, um den aktuellen Status dieses Dienstes anzuzeigen.

Die Initialisierung von Systemd-timesyncd verzögert den Start von Modulen, die nach time-set.target angeordnet sind (Einzelheiten siehe systemd.special(7)), bis die lokale Zeit von /var/lib/systemd/timesync/lock aktualisiert wird (siehe unten). ), um es annähernd eintönig zu machen. Es verzögert andere Geräte nicht, bis die Synchronisierung mit genauen Zeitreferenzquellen erreicht ist. Verwenden Sie dazu systemd-time-wait-sync.service(8), das den Start von nach time-sync.target bestellten Modulen verzögert, bis die Synchronisierung mit einer genauen Referenzuhr erreicht ist.

DATEIEN
/var/lib/systemd/timesync/clock
Die Änderungszeit („mtime“) dieser Datei gibt den Zeitstempel der letzten erfolgreichen Synchronisierung an (oder zumindest das Systemd-Build-Datum, wenn eine Synchronisierung nicht möglich ist). Es wird verwendet, um sicherzustellen, dass die Systemuhr über Neustarts hinweg annähernd monoton bleibt, wenn keine lokale Echtzeituhr vorhanden ist.

/run/systemd/timesync/syncronized
Eine Datei, die bei jeder erfolgreichen Synchronisierung berührt wird, um systemd-time-wait-sync und anderen Anwendungen dabei zu helfen, die Synchronisierung mit einer genauen Referenzuhr zu erkennen.

Wie kann ich Datum und Uhrzeit der letzten erfolgreichen Zeitsynchronisierung herausfinden?

ls -l /var/lib/systemd/timesync/clock

Zeitsynchronisation manuell starten

Es ist nicht erforderlich, die Zeit manuell zu synchronisieren, sofern dies konfiguriert ist automatische Zeitsynchronisation über das Internet.

Befehl zur manuellen Zeitsynchronisierung:

sudo systemctl restart systemd-timesyncd

 

Zur Vereinfachung der manuellen Zeitsynchronisierung können Sie ein Shell-Skript mit dem Namen erstellen „timesync.sh“:

#!/bin/sh
sudo systemctl starte systemd-timesyncd.service neu
find /var/lib/systemd/timesync/clock -printf "Datei: %f: Datum: %TY-%Tm-%Td - Zeit: %TT\n" -exec tail -n5 {} \;
timedatectl-Status | grep -e "synchronized" -e "NTP"

Hier ist die Datei in einem ZIP-Archiv:
timesync.sh.zip

Speichern Sie es im aktuellen Verzeichnis und machen Sie es ausführbar

sudo chmod +x timesync.sh

Zeitsynchronisation manuell starten:

./timesync.sh

(Um zu vermeiden, dass Sie jedes Mal nach einem Passwort gefragt werden:usermod -aG sudo ваше_имя).

Hinweis:: Wenn die PC-Uhr mit hoher Genauigkeit synchronisiert ist, schreibt der Dienst: „Systemuhr synchronisiert: ja“, unabhängig davon, ob zum Zeitpunkt der Anfrage an den NTP-Server eine Verbindung zum Netzwerk bestand.

Was ist der Zeitfehler (Abweichung) bei der Verwendung von SNTP?

Die Abweichung der Systemuhr von der genauen Zeit beträgt 5-6 Millisekunden:

sudo apt-get update
sudo apt install iputils-clockdiff
sudo clockdiff 3.ru.pool.ntp.org

Technische Details

Zum Zeitpunkt der Zeitsynchronisierung wird das UDP-Protokoll, Remote-Port 123, NTP Version 4-Protokoll verwendet.
Die Nutzlast beträgt 48 Byte.

Frame xxxx: 90 Bytes auf der Leitung (720 Bits), 90 Bytes erfasst (720 Bits) auf der Schnittstelle enp1s10, ID 0
Ethernet II, Src: PERIPHER_0c(), Dst: Router()
Internet Protocol Version 4, Src: xx.xx.xx.xx, Dst: 91.209.94.10
Benutzer-Datagramm-Protokoll, Src-Port: xxxxx, Dst-Port: 123
Source Port: xxxxx
Destination Port: 123
Length: 56
Checksum: 0x7b13 [unverified]
[Checksum Status: Unverified]
[Stream index: 1059]
[Timestamps]
UDP payload (48 bytes)
Network Time Protocol (NTP Version 4, Client)
Flags: 0x23, Leap Indicator: no warning, Version number: NTP Version 4, Mode: client
Peer Clock Stratum: unspecified or invalid (0)
Peer-Polling-Intervall: ungültig (0)
Peer Clock Precision: 1,000000 seconds
Root Delay: 0,000000 seconds
Root Dispersion: 0,000000 seconds
Reference ID: NULL
Reference Timestamp: (0)Jan 1, 1970 00:00:00.000000000 UTC
Origin Timestamp: (0)Jan 1, 1970 00:00:00.000000000 UTC
Receive Timestamp: (0)Jan 1, 1970 00:00:00.000000000 UTC
Transmit Timestamp: Oct 26, 2023 13:10:05.053581346 UTC

Experimentieren

Wie groß ist die Abweichung der Uhr, wenn Sie Ihren PC über Nacht ohne Internet lassen?

Wenn man den PC über Nacht ausgeschaltet lässt und ihn dann ohne Netzwerk bootet, beträgt der Zeitfehler plus 114-168 Millisekunden.

Nach dem Einschalten des Internets kehrte die Systemzeit dank des SNTP-Protokolls und des SystemD-Dienstes selbstständig auf die genaue Zeit zurück – der Fehler der Systemuhr des Computers betrug minus 14 Millisekunden.

Nützlicher Link:
*Konfigurieren Sie die Zeitsynchronisierung unter Linux mit Systemd Timesyncd