Um die Zeit mehrerer Hosts (Linux) im isolierten lokalen Netzwerk festzulegen, haben wir beschlossen, den NTP-Server auf einem von ihnen auszuführen und die Zeit mit dem NTP-Client auf dem anderen zu synchronisieren. Für jeden Client-Host haben wir beschlossen, die von DHCP bereitgestellte NTP-Serveradresse festzulegen.
Die Einstellungen des NTP-Servers und die Einstellungen zum Verteilen der NTP-Serverinformationen durch den DHCP-Server werden an verschiedenen Stellen geschrieben. Andererseits sind die Clienteinstellungen stark von der Umgebung abhängig und es hat einige Zeit gedauert, geeignete Informationen zu finden. Es scheint, dass die vom Client (Linux) beim Start durchgeführte Verarbeitung im Allgemeinen dem folgenden Verfahren folgt.
Hier treten Umgebungsabhängigkeiten in ** DHCP-Clients (dhclient
(ISC-DHCP), dhcpcd
, NetworkManager
s internem dhcp-Client, ...) und NTP-Clients ( ntpd
, auf. Dies liegt daran, dass es viele Kombinationen ** von openntpd
, chrony
, systemd-timesyncd
, ...) gibt. Abhängig von der Linux-Distribution können sich die standardmäßig verwendeten DHCP- und NTP-Pakete beim Upgrade ändern, und ich bin süchtig danach, wenn ich es nicht bemerke. Wenn auch ein nicht standardmäßiger (= nicht verwendeter) DHCP-Client oder ein NTP-Client-Paket installiert ist, können Sie ** eine nicht verwendete Konfigurationsdatei neu schreiben und befürchten, dass sie nicht wie erwartet funktioniert **.
In Raspberry Pi OS (64 Bit, Debian Buster-basiert) ist der Standard-DHCP-Client = "dhcpcd", NTP-Client = "systemd-timesyncd". Die von DHCP aufgerufenen Hooks sind wie "/ lib / dhcpcd / dhcpcd-hooks / 50-ntp.conf". Diese Datei enthält eine Beschreibung für "ntpd", "openntpd", "chrony", aber keine Beschreibung für "systemd-timesyncd". Basierend auf Informationen zum offiziellen Website-Forum habe ich Folgendes hinzugefügt und der NTP-Server wurde beim Systemstart dynamisch gestartet. Es wurde eingestellt und die Zeit ist eingestellt. ** Es gibt eine Datei mit dem Namen "/ etc / dhcp / dhclient-exit-hooks.d / timesyncd", die eine wahrscheinliche Implementierung enthält. Beachten Sie jedoch, dass diese nicht verwendet wird. ** ** **
/tmp/dhcpcd_ntp_conf(Korrekturteil;diff Ausgabe)
--- /etc/dhcpcd.conf.orig 2019-11-13 23:44:50.000000000 +0900
+++ /etc/dhcpcd.conf 2020-09-16 08:28:53.595999273 +0900
@@ -30,7 +30,7 @@ option classless_static_routes
option interface_mtu
# Most distributions have NTP support.
-#option ntp_servers
+option ntp_servers
# A ServerID is required by RFC2131.
require dhcp_server_identifier
/lib/dhcpcd/dhcpcd-hooks/50-ntp.conf(Nachtrag)
# Set NTP servers for systemd-timesyncd
confd=/run/systemd/timesyncd.conf.d
if [ -n "$new_ntp_servers" ] ; then
set_servers() {
mkdir -p "$confd"
( echo "# Created by dhcpcd hook";echo "[Time]"; echo "NTP=$new_ntp_servers" ) > "$confd/dhcp-ntp.conf"
# Tell timesyncd it has an updated configuration
systemctl try-reload-or-restart systemd-timesyncd
}
if $if_up; then
set_servers
fi
fi
Übrigens in der Standardkonfigurationsdatei von "systemd-timesyncd" ("/ lib / systemd / system / systemd-timesyncd.service.d / disable-with-time-daemon.conf"), anderen NTP-Clients und VirtualBox-Diensten Wenn die ausführbare Datei von vorhanden ist, wird nichts unternommen, daher ist es sicherer, "50-ntp.conf" hinzuzufügen, anstatt sie zu ersetzen.
Für das Image für Raspberry Pi
( ubuntu-mate-20.04.1-beta2-desktop-arm64 + raspi.img
) werden der interne DHCP-Client von Network Manager
undsystemd-time syncd verwendet. Es scheint eine Kombination von
zu sein. Standardmäßig ist auch "dhclient" installiert und "/ etc / dhcp / dhclient-exit-hooks.d / timesyncd" wird ebenfalls bereitgestellt. Wenn Sie also "dhclient" manuell in der Befehlszeile ausführen, wird die Zeit synchronisiert. Zu Daher dachte ich, dass es besser wäre, "dhcp = dhclient" zum Abschnitt "[main]" von "/ etc / NetworkManager / NetworkManager.conf" hinzuzufügen, damit "dhclient" anstelle von internem dhcp verwendet wird. Wenn Sie sich das Protokoll ansehen, gibt dhclient
einen Fehler aus, und der Hook wird nicht zum gewünschten Zeitpunkt aufgerufen.
Ich habe die Verwendung von "dhclient" aufgegeben, weil ich keine andere Wahl hatte, und beschlossen, ein Dispather-Skript für "Network Manager" vorzubereiten, indem ich auf "/ etc / dhcp / dhclient-exit-hooks.d / timesyncd" verwies. Ändern Sie die Umgebungsvariablen und Beurteilungszeichenfolgen gemäß Offizielles Handbuch und /etc/NetworkManager/dispatcher.d/90-dhcp- Timesyncd erstellen
.
/etc/NetworkManager/dispatcher.d/90-dhcp-timesyncd
#!/bin/sh
TIMESYNCD_CONF=/run/systemd/timesyncd.conf.d/01-dhclient.conf
timesyncd_servers_setup_remove() {
if [ -e $TIMESYNCD_CONF ]; then
rm -f $TIMESYNCD_CONF
systemctl try-restart systemd-timesyncd.service || true
fi
}
timesyncd_servers_setup_add() {
if [ ! -d /run/systemd/system ]; then
return
fi
old_ntp_servers=$(sed -ne 's/^NTP=//gp')
if [ -e $TIMESYNCD_CONF ] && [ "x$DHCP4_NTP_SERVERS" = "x$old_ntp_servers" ]; then
return
fi
if [ -z "${DHCP4_NTP_SERVERS}" ]; then
timesyncd_servers_setup_remove
return
fi
mkdir -p $(dirname ${TIMESYNCD_CONF})
cat <<EOF > ${TIMESYNCD_CONF}.new
# NTP server entries received from DHCP server
[Time]
NTP=$DHCP4_NTP_SERVERS
EOF
mv ${TIMESYNCD_CONF}.new ${TIMESYNCD_CONF}
systemctl try-restart systemd-timesyncd.service || true
}
logger -i -t "$0" "action=${NM_DISPATCHER_ACTION}:NTP=${DHCP4_NTP_SERVERS}"
case $NM_DISPATCHER_ACTION in
up|dhcp4-change)
timesyncd_servers_setup_add
;;
down)
timesyncd_servers_setup_remove
;;
*) :
;;
esac
Diese Datei muss im Besitz von root sein und Ausführungsberechtigungen erhalten.
% ls -l /etc/NetworkManager/dispatcher.d/90-dhcp-timesyncd
-rwxr-xr-x 1 root root 1140 Apr 2 02:55 /etc/NetworkManager/dispatcher.d/90-dhcp-timesyncd
Durch das Setzen dieses Skripts wird die Zeit synchronisiert.
Es scheint, dass die vorherige Version von Ubuntu auch eine Kombination aus "Network Manager" und "Systemd-Time Syncd" verwendet. Daher dachte ich, dass es mit dem gleichen Skript wie im vorherigen Abschnitt (Ubuntu MATE 20.04 LTS) funktionieren würde, aber es funktionierte nicht wie erwartet. Es scheint, dass die Umgebungsvariable "$ NM_DISPATCHER_ACTION" nicht gesetzt ist, wahrscheinlich aufgrund des Unterschieds in der Version von "networkmanager-dispatcher". Daher kann stattdessen das erwartete Verhalten erhalten werden, indem Folgendes geändert wird, sodass das zweite Argument zur Laufzeit ausgewertet wird.
NetworkManager-Unterstützt verschiedene Versionen des Dispatchers
--- Ubuntu_MATE-20.04LTS/etc/NetworkManager/dispatcher.d/90-dhcp-timesyncd 2020-09-20 21:52:17.950941231 +0900
+++ JetPack-4.4/etc/NetworkManager/dispatcher.d/90-dhcp-timesyncd 2020-09-22 01:18:46.160691469 +0900
@@ -34,9 +34,9 @@ EOF
systemctl try-restart systemd-timesyncd.service || true
}
-logger -i -t "$0" "action=${NM_DISPATCHER_ACTION}:NTP=${DHCP4_NTP_SERVERS}"
+logger -i -t "$0" "action=${NM_DISPATCHER_ACTION:-${2}}:NTP=${DHCP4_NTP_SERVERS} $@"
-case $NM_DISPATCHER_ACTION in
+case ${NM_DISPATCHER_ACTION:-$2} in
up|dhcp4-change)
timesyncd_servers_setup_add
;;
Abgesehen davon scheint der Ubuntu 18.04 LTS Network Manager
den dhclient
anstelle des internen dhcp-Clients zu verwenden.
Es scheint, dass es sich um eine Kombination aus internem DHCP-Clinet von "systemd-networkd" und "systemd-timesyncd" handelt. Der DHCP-NTP-Server wird ohne besondere Aktion eingerichtet. Ich konnte nicht viele Informationen über "systemd-networkd-dispatcher" finden, daher ist unklar, wie die von DHCP erhaltene Adresse an "systemd-timesyncd" übergeben wird.
Es ist eine Kombination aus "Network Manager" und "Chrony", und der DHCP-NTP-Server wird eingerichtet, ohne etwas zu tun. Abgesehen davon scheint es, dass CentOS 7 "dhclient" und CentOS 8 den internen DHCP-Client von "NetworkManager" verwendet.
Recommended Posts