[LINUX] Comment obtenir et définir le nom du serveur NTP par DHCP

Motivation

Afin de définir l'heure de plusieurs hôtes (Linux) dans le réseau local isolé, nous avons décidé d'exécuter le serveur NTP sur l'un d'eux et de synchroniser l'heure avec le client NTP sur l'autre. Pour chaque hôte client, nous avons décidé de définir l'adresse du serveur NTP fournie par DHCP.

La configuration du client a été plus difficile.

Les paramètres du serveur NTP et les paramètres de distribution des informations du serveur NTP par le serveur DHCP sont écrits à divers endroits. En revanche, les paramètres du client dépendent fortement de l'environnement et il a fallu du temps pour trouver les informations appropriées. Il semble que le traitement effectué par le client (Linux) au démarrage suit généralement la procédure suivante.

  1. Lancez le script (hook) lorsque le client DHCP se ferme.
  2. Le script lancé par le client DHCP met à jour le fichier de configuration du client NTP.
  3. Lisez le fichier de configuration mis à jour et démarrez le client NTP.

Ici, les dépendances d'environnement se produisent dans les ** clients DHCP (dhclient (ISC-DHCP), dhcpcd, le client dhcp interne de NetworkManager, ...) et les clients NTP ( ntpd, . C'est parce qu'il existe de nombreuses combinaisons ** d'openntpd, chrony, systemd-timesyncd, ...). En fonction de la distribution Linux, les packages DHCP et NTP utilisés par défaut peuvent changer lors de la mise à niveau, et j'y suis accro si je ne le remarque pas. Si un client DHCP ou un package client NTP autre que celui par défaut (= non utilisé) est également installé, vous pouvez ** réécrire un fichier de configuration qui n'est pas utilisé et craindre qu'il ne fonctionne pas comme prévu **.

Pour Raspberry Pi OS

Dans le système d'exploitation Raspberry Pi (64 bits, basé sur Debian buster), le client DHCP par défaut = dhcpcd, NTP client = systemd-timesyncd. Les hooks appelés par DHCP sont comme / lib / dhcpcd / dhcpcd-hooks / 50-ntp.conf. Ce fichier a une description pour ntpd, ʻopenntpd, chrony, mais pas de description pour systemd-timesyncd. Sur la base des [informations sur le forum du site officiel](https://www.raspberrypi.org/forums/viewtopic.php?t=217832#p1340336), j'ai ajouté ce qui suit, et le serveur NTP a démarré dynamiquement lorsque le système a démarré. Il a été réglé et l'heure est réglée. ** Il existe un fichier appelé / etc / dhcp / dhclient-exit-hooks.d / timesyncd` qui contient une implémentation probable, mais sachez que cela n'est pas utilisé. ** **

/tmp/dhcpcd_ntp_conf(Partie de correction;sortie diff)


--- /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(Postscript)


# 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

D'ailleurs, dans le fichier de configuration par défaut de systemd-timesyncd ( / lib / systemd / system / systemd-timesyncd.service.d / disable-with-time-daemon.conf), d'autres clients NTP et services VirtualBox Si le fichier exécutable de est présent, rien n'est fait, il est donc plus sûr d'ajouter 50-ntp.conf au lieu de le remplacer.

Pour Ubuntu MATE 20.04 LTS

Pour l'image de Raspberry Pi (ʻubuntu-mate-20.04.1-beta2-desktop-arm64 + raspi.img), le client dhcp interne de Network Manager et de systemd-timesyncd sont utilisés. Cela semble être une combinaison de ". Par défaut, dhclient est également installé, et / etc / dhcp / dhclient-exit-hooks.d / timesyncd est également fourni, donc si vous exécutez manuellement dhclient sur la ligne de commande, l'heure sera synchronisée. À. Par conséquent, j'ai pensé qu'il serait préférable d'ajouter dhcp = dhclient à la section [main] de / etc / NetworkManager / NetworkManager.conf afin que dhclient soit utilisé à la place du dhcp interne. En regardant le journal, dhclient lève une erreur et le hook n'est pas appelé au moment souhaité.

J'ai renoncé à utiliser dhclient parce que je n'avais pas le choix, et j'ai décidé de préparer un script Dispather pour Network Manager en me référant à / etc / dhcp / dhclient-exit-hooks.d / timesyncd. Modifiez les variables d'environnement et la chaîne de jugement selon le Manuel officiel et /etc/NetworkManager/dispatcher.d/90-dhcp- Créer timesyncd.

/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

Ce fichier doit appartenir à root et disposer des autorisations d'exécution.

% 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

En mettant ce script, l'heure est synchronisée.

Pour JetPack 4.4 (basé sur Ubuntu 18.04 LTS)

Il semble que la version précédente d'Ubuntu utilise également une combinaison de Network Manager et de systemd-time syncd. Par conséquent, je pensais que cela fonctionnerait avec le même script que la section précédente (Ubuntu MATE 20.04 LTS), mais cela ne fonctionnait pas comme prévu. Il semble que la variable d'environnement $ NM_DISPATCHER_ACTION ne soit pas définie, probablement à cause de la différence de version de networkmanager-dispatcher. Par conséquent, à la place, le comportement attendu peut être obtenu en modifiant ce qui suit afin que le deuxième argument à l'exécution soit évalué.

NetworkManager-Prend en charge différentes versions de répartiteur


--- 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
         ;;

En passant, le Network Manager d'Ubuntu 18.04 LTS semble utiliser le dhclient au lieu du client dhcp interne.

Pour Ubuntu Server 20.04 LTS

Il semble que ce soit une combinaison de clinet dhcp interne de systemd-networkd et systemd-timesyncd. Le serveur DHCP NTP est configuré sans aucune action spéciale. Je n'ai pas trouvé beaucoup d'informations sur systemd-networkd-dispatcher, donc on ne sait pas comment l'adresse obtenue par DHCP est transmise à systemd-timesyncd.

Pour CentOS 7.8 (20.03), CentOS 8.2 (20.04)

C'est une combinaison de «Network Manager» et de «chrony», et le serveur DHCP NTP est configuré sans rien faire. En passant, il semble que CentOS 7 utilise «dhclient» et que CentOS 8 utilise le client DHCP interne de «NetworkManager».

Recommended Posts

Comment obtenir et définir le nom du serveur NTP par DHCP
Comment régler l'heure du serveur sur l'heure japonaise
[Python Kivy] Comment obtenir le chemin du fichier par glisser-déposer
Comment obtenir le nom de la variable lui-même en python
Comment supprimer le préfixe du nom de base de données utilisé par pytest-django
Comment obtenir toutes les clés et valeurs du dictionnaire
Comment obtenir la version Python
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
Comment obtenir des abonnés et des abonnés de Python à l'aide de l'API Mastodon
[Python] Comment obtenir le premier et le dernier jour du mois
Comment obtenir la valeur en pixels du point à partir de l'image satellite en spécifiant la latitude et la longitude
Comment obtenir une sortie colorée sur la console
Comment obtenir un nom de colonne et un nom d'index spécifiques avec Pandas DataFrame
Comment obtenir la différence de date et d'heure en secondes avec Python
[Django] Comment obtenir des données en spécifiant SQL.
Comment effacer les caractères générés par Python
Comment obtenir les fichiers dans le dossier [Python]
Comment configurer un serveur de développement local
Comment démarrer le projet Python en 2020 (Windows WSL et Mac commun)
python Je ne sais pas comment obtenir le nom de l'imprimante que j'utilise habituellement.
Comment obtenir le nom du bloc-notes que vous utilisez actuellement dans Google Colab
Je veux obtenir le nom du fichier, le numéro de ligne et le nom de la fonction dans Python 3.4
Comment obtenir le "nom" d'un champ dont la valeur est limitée par l'attribut choice dans le modèle Django
Comment obtenir le nombre de chiffres en Python
[Blender] Comment obtenir l'ordre de sélection des sommets, des côtés et des faces d'un objet
Comment utiliser la commande grep et des exemples fréquents
Comment savoir quelle version de Java Maven utilise
[Blender] Comment définir dynamiquement les sélections EnumProperty
[Introduction à Udemy Python3 + Application] 30. Comment utiliser l'ensemble
Comment utiliser argparse et la différence entre optparse
Comment configurer et compiler l'environnement Cython
Comment obtenir des histogrammes RVB et HSV avec OpenCV
Comment obtenir les données météorologiques actuelles et les afficher sur l'interface graphique tout en la mettant à jour automatiquement
Comment obtenir uniquement les données nécessaires du groupe de données structurées à l'aide d'une méthode polyvalente
Comment se débarrasser des pictogrammes personnalisés du serveur dans message.content
Comment changer le fichier de configuration pour qu'il soit lu par Python
Comment tester les attributs ajoutés par add_request_method de pyramid
Les étrangers parlent: Comment nommer les classes et les méthodes en anglais
[Python] Comment définir des noms de variables dynamiquement et comparer la vitesse
Comment définir l'attribut de classe html dans le formulaire forms.py de Django
Créer un environnement Python et transférer des données vers le serveur
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Comment entrer dans l'environnement de développement Python avec Vagrant
Comment définir la date au format ISO8601 étendu sur l'index Dataframe
[Shell] Comment obtenir la branche distante par défaut avec Git
[Introduction à Python] Comment obtenir des données avec la fonction listdir
Pour obtenir le nom de la primitive etc. généré immédiatement avant
Comment utiliser le générateur
Comment utiliser le décorateur
Comment augmenter l'axe
Comment démarrer la première projection
[Apprentissage de Django avec la lame du diable] Comment obtenir un ensemble de requêtes pour une référence avant / arrière
J'ai essayé de classer le nom d'utilisateur et le mot de passe de phpMyAdmin ciblés par l'attaque du serveur
Comment configurer cron pour le scraping Python normal sur le serveur Sakura.
Comment définir un raccourci pour basculer entre pleine largeur et demi-largeur dans IBus
Comment définir la résolution de sortie pour chaque image clé dans Blender
Je veux obtenir le nom de la fonction / méthode en cours d'exécution
Présentation de la création d'un socket serveur et de la création d'un socket client
Comment réussir et étudier l'examen de base de la certification d'ingénieur Python 3