it-swarm.com.de

Wie kann sichergestellt werden, dass nfs-server erst gestartet wird, wenn Hostnamen aufgelöst werden können? (16.10)

Zusammenfassung : Gibt es eine Möglichkeit, sicherzustellen, dass der NFS-Server nicht von systemd gestartet wird, bis die in /etc/exports?

Problembeschreibung : Ich habe festgestellt, dass NFS-Freigaben nach dem Neustart des Servers (mit 16.10) nicht ordnungsgemäß verfügbar sind. Clients erhalten die Fehlermeldung "Zugriff vom Server verweigert", bis exportfs -ra oder service nfs-server restart manuell auf dem Server ausgeführt wird. Danach funktioniert alles wie erwartet.

Der /etc/exports des Servers enthält nur:

/mnt/raidarray clientmachine(rw)

dabei ist clientmachine der Hostname des NFS-Clientcomputers im lokalen Netzwerk.

Problemidentifikation : Die Ausgabe von systemctl status nfs-server (unten) verdeutlicht das Problem: Der Name des Clients kann derzeit nicht gelöst werden dass der NFS-Server gestartet wurde.

● nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled
Active: active (exited) since Tue 2017-01-17 16:47:38 CST; 26min ago
Main PID: 1520 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 4915)
CGroup: /system.slice/nfs-server.service
Jan 17 16:47:38 servermachine exportfs[1511]: exportfs: Failed to resolve clientmachine
Jan 17 16:47:38 servermachine systemd[1]: Started NFS server and services.

NetworkManager-wait-online.service ist aktiviert, was ich verstanden hatte , um sicherzustellen, dass network.target (von dem nfs-server abhängt) nicht erfüllt ist, bis network-online.target ist zufrieden.

Dinge, die nicht geholfen haben :

  1. Falls ich falsch verstanden habe, was NetworkManager-wait-online.service tut, habe ich versucht, After=network-online.target und Wants=network-online.target zu nfs-server.service hinzuzufügen. Dies behebt nichts. Ich sehe die neue Abhängigkeit in systemctl list-dependencies, aber die Namensauflösung schlägt beim Booten immer noch fehl. Es scheint also, dass network-online.target nicht garantiert, dass die Auflösung von Hostnamen stattfinden kann.

  2. Einige Googler schlugen vor, dass das Erfordernis von nss-lookup.target sicherstellen würde, dass die Netzwerkauflösung verfügbar ist, aber das Hinzufügen als Wants und/oder After Abhängigkeit von nfs-server.service behebt auch keine Probleme!

  3. Das Hinzufügen einer Abhängigkeit von Wants und/oder After von systemd-resolved.service anstelle von nss-lookup.target behebt ebenfalls keine Probleme.

Nachdem alle diese Abhängigkeiten hinzugefügt wurden, wird nfs-server sehr, sehr spät im Startprozess gestartet (kurz vor den Desktopanmeldungsdingen), aber es können immer noch keine Hosts aufgelöst werden. Basierend auf systemd-analyze plot scheint es, dass nmbd um diese Zeit verklemmt ist, aber ich weiß nicht, ob das zusammenhängt.

Konfigurationsinformation : Dies ist eine Desktop-Version von Kubuntu 16.10, die im Grunde genommen eine Neuinstallation ist.

NetworkManager.service ist aktiviert und systemd-networkd.service ist deaktiviert - ich habe den Standardwert nicht geändert.

Hier ist die NetworkManager-wait-online Service-Definition:

[Unit]
Description=Network Manager Wait Online
Documentation=man:nm-online(1)
Requisite=NetworkManager.service
After=NetworkManager.service
Before=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/nm-online -s -q --timeout=30
RemainAfterExit=yes
[Install]
WantedBy=network-online.target

Als Workaround könnte ich IP-Adressen anstelle von Hostnamen in /etc/exports oder /etc/hosts fest codieren, aber dies scheint etwas spröde zu sein. Gibt es eine bessere Antwort?

BEARBEITEN - Update : Ich habe nach @ murus Rat versucht, ein Skript zu erstellen, das darauf wartet, die Hostnamen aufzulösen - nur um zu sehen, wie lange es dauert. Mein Skript muss nach dem Start von systemd-resolved einige zehn Sekunden warten, bevor es einen Host tatsächlich auflösen kann. Das ist sehr bizarr. Ich frage mich, ob es sich tatsächlich um ein lokales Netzwerkproblem handelt. Hört sich an, als wäre eine fest codierte (und möglicherweise von @ mark-stosberg vorgeschlagene) /etc/exports- oder /etc/hosts -Datei erforderlich.

4
zachrahan

Basierend auf @ murus Kommentar habe ich ein python Skript erstellt, um auf die DNS-Auflösung zu warten:

import socket
import time
import itertools

TIMEOUT = 30
HOSTS = ['stanford.edu', 'google.com', 'example.com']

def main():
    hosts = itertools.cycle(HOSTS)
    t0 = time.time()
    for Host in hosts:
        t = time.time()
        elapsed = t - t0
        if elapsed > TIMEOUT:
            break
        try:
            socket.getaddrinfo(Host, None, proto=socket.IPPROTO_TCP)
            print('Resolved {} at t = {}'.format(Host, elapsed))
            break
        except socket.gaierror:
            print('Could not resolve {} at t = {}'.format(Host, elapsed))
        time.sleep(0.25)
        t = time.time()

if __== '__main__':
    main()

Ich habe dieses Skript als /etc/systemd/system/nfs-server.service.d/wait_for_dns.py gespeichert (man muss zuerst das übergeordnete Verzeichnis erstellen) und dann Sudo systemctl edit --full nfs-server ausgeführt und Folgendes vor anderen ExecStartPre-Zeilen hinzugefügt:

ExecStartPre=/usr/bin/python3 /etc/systemd/system/nfs-server.service.d/wait_for_dns.py

Das hat gut funktioniert, fühlt sich aber auf jeden Fall etwas hackig an und könnte in vielerlei Hinsicht verbessert werden. (In diesem Zusammenhang habe ich NFS einfach aufgegeben. Es war mehr ein Schmerz als es wert war.)

0
zachrahan

Ich hatte das gleiche Problem auf einer Ubuntu 16.04.03 LTS-Installation.
Das exportfs lief nach einem Neustart nicht richtig und somit wurde der nfs-Kernel-Server nicht richtig gestartet.
Ich habe versucht, dem Startfall in /etc/init.d/nfs-kernel-server einen Sleep hinzuzufügen, aber das hat nicht geholfen.
Ich habe auch versucht, einige Hinweise zu finden https://discourse.osmc.tv/t/nfs-kernel-server-wont-start-on-boot/5936/7
Schließlich löste ich das Problem, indem ich die folgende Zeile zu /etc/rc.local hinzufügte

systemctl restart nfs-kernel-server
0
user333869

In Bezug auf das, was Sie mit systemd versuchen, haben Sie bereits versucht, das Beste zu tun, nämlich Ihren Dienst so einzurichten, dass er nach network-online startet. Ich habe viele systemd Fragen gelesen, und andere haben Probleme mit dem Netzwerk gemeldet, das nicht vollständig online ist, wenn sie dies tun.

Ich empfehle die Idee, IP-Adressen in /etc/exports oder /etc/hosts zu setzen, wie Sie empfehlen. Dies vereinfacht eine wichtige Aufgabe beim Laden der Festplatte während des Startvorgangs.

Um das System robuster zu machen, können Sie einen Cron-Job oder einen System-Timer verwenden, der regelmäßig überprüft, ob sich der DNS für die interessanten Hosts geändert hat. Wenn ja, aktualisieren Sie /etc/hosts automatisch mit den neuen Werten.

0
Mark Stosberg