[LINUX] So erhalten Sie den NTP-Servernamen per DHCP und legen ihn fest

Motivation

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.

Das Einrichten des Clients war schwieriger.

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.

  1. Starten Sie das Skript (Hook), wenn der DHCP-Client beendet wird.
  2. Das vom DHCP-Client gestartete Skript aktualisiert die Konfigurationsdatei des NTP-Clients.
  3. Lesen Sie die aktualisierte Konfigurationsdatei und starten Sie den NTP-Client.

Hier treten Umgebungsabhängigkeiten in ** DHCP-Clients (dhclient (ISC-DHCP), dhcpcd, NetworkManagers 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 **.

Für Raspberry Pi OS

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 Ubuntu MATE 20.04 LTS

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 vonzu 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.

Für JetPack 4.4 (Ubuntu 18.04 LTS-basiert)

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} [email protected]"
 
-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.

Für Ubuntu Server 20.04 LTS

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.

Für CentOS 7.8 (20.03), CentOS 8.2 (20.04)

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

So erhalten Sie den NTP-Servernamen per DHCP und legen ihn fest
So stellen Sie die Serverzeit auf japanische Zeit ein
[Python Kivy] So erhalten Sie den Dateipfad durch Ziehen und Ablegen
So erhalten Sie den Variablennamen selbst in Python
So heben Sie den von pytest-django verwendeten DB-Namen auf
So erhalten Sie alle Schlüssel und Werte im Wörterbuch
So erhalten Sie die Python-Version
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
So erhalten Sie mithilfe der Mastodon-API Follower und Follower von Python
[Python] So erhalten Sie den ersten und den letzten Tag des Monats
So erhalten Sie den Pixelwert des Punkts aus dem Satellitenbild, indem Sie den Breiten- und Längengrad angeben
So erhalten Sie eine farbige Ausgabe an die Konsole
So erhalten Sie mit pandas DataFrame einen bestimmten Spaltennamen und Indexnamen
So ermitteln Sie mit Python den Unterschied zwischen Datum und Uhrzeit in Sekunden
[Django] So erhalten Sie Daten durch Angabe von SQL.
So löschen Sie die von Python ausgegebenen Zeichen
So erhalten Sie die Dateien im Ordner [Python]
So richten Sie einen lokalen Entwicklungsserver ein
So starten Sie das Python-Projekt im Jahr 2020 (Windows WSL und Mac Common)
Python Ich weiß nicht, wie ich den Druckernamen bekomme, den ich normalerweise benutze.
So erhalten Sie den Notebook-Namen, den Sie derzeit in Google Colab verwenden
Ich möchte den Dateinamen, die Zeilennummer und den Funktionsnamen in Python 3.4 erhalten
So erhalten Sie den "Namen" eines Feldes, dessen Wert durch das Auswahlattribut im Django-Modell begrenzt ist
So ermitteln Sie die Anzahl der Stellen in Python
[Blender] So ermitteln Sie die Auswahlreihenfolge von Scheitelpunkten, Seiten und Flächen eines Objekts
Verwendung des Befehls grep und häufiger Samples
So finden Sie heraus, welche Version von Java Maven verwendet wird
[Blender] So legen Sie die Auswahlelemente von EnumProperty dynamisch fest
[Einführung in die Udemy Python3 + -Anwendung] 30. Verwendung des Sets
Wie man Argparse benutzt und den Unterschied zwischen Optparse
So richten Sie die Cython-Umgebung ein und kompilieren sie
So erhalten Sie RGB- und HSV-Histogramme mit OpenCV
So erhalten Sie die aktuellen Wetterdaten und zeigen sie auf der GUI an, während Sie sie automatisch aktualisieren
So erhalten Sie mit einer vielseitigen Methode nur die erforderlichen Daten aus der strukturierten Datengruppe
So entfernen Sie benutzerdefinierte Serverpiktogramme in message.content
So wechseln Sie die Konfigurationsdatei, die von Python gelesen werden soll
So testen Sie die Attribute, die durch add_request_method of pyramid hinzugefügt wurden
Ausländer sprechen: Wie man Klassen und Methoden auf Englisch benennt
[Python] So legen Sie Variablennamen dynamisch fest und vergleichen die Geschwindigkeit
So legen Sie das HTML-Klassenattribut in Djangos forms.py fest
Erstellen Sie eine Python-Umgebung und übertragen Sie Daten auf den Server
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
So gelangen Sie mit Vagrant in die Python-Entwicklungsumgebung
So setzen Sie das Datum des erweiterten ISO8601-Formats auf den Dataframe-Index
[Shell] So erhalten Sie den Remote-Standardzweig mit Git
[Einführung in Python] So erhalten Sie Daten mit der Funktion listdir
Um den Namen des Primitivs usw. zu erhalten, das unmittelbar zuvor generiert wurde
Verwendung des Generators
Wie benutzt man den Dekorateur?
So erhöhen Sie die Achse
So starten Sie die erste Projektion
[Django lernt mit der Klinge des Teufels] So erhalten Sie einen Abfragesatz für die Vorwärts- / Rückwärtsreferenz
Ich habe versucht, den Benutzernamen und das Kennwort von phpMyAdmin zu bewerten, auf die der Serverangriff abzielte
So stellen Sie cron für reguläres Python-Scraping auf dem Sakura-Server ein.
So legen Sie eine Verknüpfung fest, um in IBus zwischen voller und halber Breite zu wechseln
So stellen Sie die Ausgabeauflösung für jeden Keyframe in Blender ein
Ich möchte den Namen der ausgeführten Funktion / Methode erhalten
Übersicht über das Erstellen eines Server-Sockets und das Einrichten eines Client-Sockets
Bestehen und Studieren der Python 3 Engineer-Zertifizierungsgrundprüfung