NFS (Deutsch)

Aus Wikipedia:

Network File System (NFS) ist ein verteiltes Dateisystemprotokoll, das ursprünglich 1984 von Sun Microsystems entwickelt wurde und es einem Benutzer auf einem Client-Computer ermöglicht, über ein Netzwerk auf Dateien zuzugreifen, ähnlich wie auf einen lokalen Speicher.

Hinweis:

  • NFS ist nicht verschlüsselt. Tunneln Sie NFS durch ein verschlüsseltes Protokoll wie Kerberos oder (sicheres) VPN, wenn Sie mit sensiblen Daten arbeiten.
  • Im Gegensatz zu Samba hat NFS standardmäßig keine Benutzerauthentifizierung, der Zugriff der Clients wird durch ihre IP-Adresse/Hostname eingeschränkt.
  • NFS erwartet, dass die Benutzer- und/oder Benutzergruppen-IDs auf dem Client und dem Server gleich sind. Aktivieren Sie NFSv4 idmapping oder setzen Sie die UID/GID manuell außer Kraft, indem Sie anonuidanongid zusammen mit all_squash in /etc/exports verwenden.

Installation

Beide, Client und Server, benötigen nur die Installation des nfs-utils-Pakets.

Es wird dringend empfohlen, einen Zeitsynchronisations-Daemon zu verwenden, um die Uhren von Client und Server synchron zu halten. Ohne genaue Uhren auf allen Knoten kann NFS unerwünschte Verzögerungen verursachen.

Konfiguration

Server

Globale Konfigurationsoptionen werden in /etc/nfs.conf eingestellt. Benutzer von einfachen Konfigurationen sollten diese Datei nicht bearbeiten müssen.

Der NFS-Server benötigt eine Liste von Freigaben (siehe exports(5) für Details), die in /etc/exports oder /etc/exports.d/*.exports definiert sind. Diese Freigaben sind relativ zur sogenannten NFS-Wurzel. Eine gute Sicherheitspraxis ist es, eine NFS-Wurzel in einem diskreten Verzeichnisbaum zu definieren, wodurch die Benutzer auf diesen Einhängepunkt beschränkt bleiben. Bind-Mounts werden verwendet, um den Freigabe-Einhängepunkt mit dem tatsächlichen Verzeichnis an anderer Stelle im Dateisystem zu verknüpfen.

Betrachten Sie das folgende Beispiel, in dem:

  1. Die NFS-Root ist /srv/nfs.
  2. Der Export erfolgt /srv/nfs/music über ein Bind-Mount auf das eigentliche Ziel /mnt/music.
# mkdir -p /srv/nfs/music /mnt/music# mount --bind /mnt/music /srv/nfs/music
Hinweis: ZFS-Dateisysteme erfordern eine spezielle Behandlung von Bindmounts, siehe ZFS#Bind-Mount.

Um das Bind-Mount über Neustarts hinweg beständig zu machen, fügen Sie es zur fstab hinzu:

/etc/fstab
/mnt/music /srv/nfs/music none bind 0 0

Fügen Sie gemeinsam zu nutzende Verzeichnisse hinzu und beschränken Sie sie über einen CIDR oder Hostnamen auf einen Adressbereich von Client-Rechnern, die sie in /etc/exports einhängen dürfen, e.z.:

/etc/exports
/srv/nfs 192.168.1.0/24(rw,sync,crossmnt,fsid=0)/srv/nfs/music 192.168.1.0/24(rw,sync)/srv/nfs/home 192.168.1.0/24(rw,sync,nohide)/srv/nfs/public 192.168.1.0/24(ro,all_squash,insecure) desktop(rw,sync,all_squash,anonuid=99,anongid=99) # map to user/group - in diesem Fall nobody
Tipp:

  • Mit der Option crossmnt können Clients auf alle Dateisysteme zugreifen, die auf einem mit crossmnt markierten Dateisystem eingehängt sind, und müssen nicht jeden Child-Export einzeln einhängen. Beachten Sie, dass dies möglicherweise nicht wünschenswert ist, wenn ein Kindexport mit einem anderen Adressbereich geteilt wird.
  • Anstatt crossmnt kann man auch die Option nohide für Kindexporte verwenden, so dass sie automatisch eingehängt werden können, wenn ein Client den Root-Export einhängt. Anders als crossmnt respektiert nohide immer noch Adressbereiche von Child-Exporten.
  • Verwenden Sie ein Sternchen (*), um den Zugriff von jeder Schnittstelle zu erlauben.

Es ist zu beachten, dass eine Änderung von /etc/exports bei laufendem Server einen Re-Export erfordert, damit die Änderungen wirksam werden:

# exportfs -arv

Um den aktuell geladenen Zustand der Exporte genauer zu betrachten, verwenden Sie:

# exportfs -v

Für weitere Informationen über alle verfügbaren Optionen siehe exports(5).

Tipp: ip2cidr ist ein Werkzeug, um einen IP-Bereich in eine korrekt strukturierte CIDR-Spezifikation umzuwandeln.
Hinweis: Wenn der Zielexport ein tmpfs-Dateisystem ist, wird die Option fsid=1 benötigt.

Starten des Servers

Starten und aktivieren Sie nfs-server.service.

Warnung: Eine harte Abhängigkeit von der Bedienung von NFS (rpc-gssd.service) wartet, bis der Zufallszahlengenerator-Pool ausreichend initialisiert ist, was den Startvorgang möglicherweise verzögert. Dies ist besonders auf Headless-Servern häufig der Fall. Es wird dringend empfohlen, den Entropie-Pool mit einem Dienstprogramm wie Rng-tools (wenn TPM unterstützt wird) oder Haveged in diesen Szenarien aufzufüllen.
Hinweis: Wenn Sie ZFS-Freigaben exportieren, starten/aktivieren Sie auch zfs-share.service. Ohne dies werden ZFS-Freigaben nach einem Neustart nicht mehr exportiert. Siehe ZFS#NFS.

Einschränken von NFS auf Schnittstellen/IPs

Standardmäßig wird das Starten von nfs-server.service auf allen Netzwerkschnittstellen auf Verbindungen lauschen, unabhängig von /etc/exports. Dies kann geändert werden, indem definiert wird, auf welchen IPs und/oder Hostnamen gelauscht werden soll.

/etc/nfs.conf
host=192.168.1.123# Alternativ verwenden Sie host=myhostname

Neustart nfs-server.service, um die Änderungen sofort anzuwenden.

Firewall-Konfiguration

Um den Zugriff durch eine Firewall zu ermöglichen, müssen bei Verwendung der Standardkonfiguration möglicherweise die TCP- und UDP-Ports 1112049 und 20048 geöffnet werden; Verwenden Sie rpcinfo -p, um die genauen Ports zu untersuchen, die auf dem Server verwendet werden:

$ rpcinfo -p | grep nfs
100003 3 tcp 2049 nfs100003 4 tcp 2049 nfs100227 3 tcp 2049 nfs_acl

Wenn Sie NFSv4 verwenden, stellen Sie sicher, dass der TCP-Port 2049 geöffnet ist. Es sollte keine weitere Portöffnung erforderlich sein:

/etc/iptables/iptables.rules
-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT

Wenn Sie eine ältere NFS-Version verwenden, stellen Sie sicher, dass andere Ports geöffnet sind:

# iptables -A INPUT -p tcp -m tcp --dport 111 -j ACCEPT# iptables -A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT# iptables -A INPUT -p tcp -m tcp --dport 20048 -j ACCEPT# iptables -A INPUT -p udp -m udp --dport 111 -j ACCEPT# iptables -A INPUT -p udp -m udp --dport 2049 -j ACCEPT# iptables -A INPUT -p udp -m udp --dport 20048 -j ACCEPT

Damit diese Konfiguration bei jedem Systemstart geladen wird, editieren Sie /etc/iptables/iptables.rules und fügen Sie die folgenden Zeilen ein:

/etc/iptables/iptables.rules
-A INPUT -p tcp -m tcp --dport 111 -j ACCEPT-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT-A INPUT -p tcp -m tcp --dport 20048 -j ACCEPT-A INPUT -p udp -m udp --dport 111 -j ACCEPT-A INPUT -p udp -m udp --dport 2049 -j ACCEPT-A INPUT -p udp -m udp --dport 20048 -j ACCEPT

Die vorherigen Befehle können durch Ausführen gespeichert werden:

# iptables-save > /etc/iptables/iptables.rules
Warnung: Dieser Befehl setzt die aktuelle iptables-Startkonfiguration mit der aktuellen iptables-Konfiguration außer Kraft!

Bei Verwendung von NFSv3 und den oben aufgelisteten statischen Ports für rpc.statd und lockd müssen ggf. noch folgende Ports zur Konfiguration hinzugefügt werden:

/etc/iptables/iptables.rules
-A INPUT -p tcp -m tcp --dport 32765 -j ACCEPT-A INPUT -p tcp -m tcp --dport 32803 -j ACCEPT-A INPUT -p udp -m udp --dport 32765 -j ACCEPT-A INPUT -p udp -m udp --dport 32803 -j ACCEPT

Um die Änderungen anzuwenden, Starten Sie iptables.service neu.

NFSv4 idmapping aktivieren

Tango-view-fullscreen.pngDieser Artikel oder Abschnitt muss erweitert werden.Tango-view-fullscreen.png

Begründung: Fehlende Lookup-Informationen, statische Bindungsbeispiele, etc. (Diskutieren Sie in Talk:NFS#)

Hinweis:

  • NFSv4 idmapping funktioniert nicht mit der standardmäßigen sec=sys Einhängeoption.
  • NFSv4 idmapping muss sowohl auf dem Client als auch auf dem Server aktiviert sein.
  • Eine weitere Möglichkeit ist, sicherzustellen, dass die Benutzer- und Gruppen-IDs (UID und GID) sowohl auf dem Client als auch auf dem Server übereinstimmen.
  • Das Aktivieren/Starten von nfs-idmapd.service sollte nicht erforderlich sein, da es durch einen neuen id-Mapper ersetzt wurde:
# dmesg | grep id_resolver
 NFS: Registrierung des Schlüsseltyps id_resolver Schlüsseltyp id_resolver registriert

Das NFSv4-Protokoll stellt die UID- und GID-Werte des lokalen Systems auf der Leitung als Zeichenketten der Form user@domain dar. Der Prozess der Übersetzung von UID zu String und String zu UID wird als ID-Mapping bezeichnet. Siehe nfsidmap(8) für Details.

Auch wenn idmapd läuft, ist er möglicherweise nicht vollständig aktiviert. Wenn /sys/module/nfs/parameters/nfs4_disable_idmapping oder /sys/module/nfsd/parameters/nfs4_disable_idmapping auf einem Client/Server Y zurückgibt, aktivieren Sie es durch:

Hinweis: Die Kernel-Module nfs4 und nfsd müssen jeweils geladen sein, damit die folgenden Pfade zur Verfügung stehen.

Auf dem Client:

# echo "N" | tee /sys/module/nfs/parameters/nfs4_disable_idmapping

Auf dem Server:

# echo "N" | tee /sys/module/nfsd/parameters/nfs4_disable_idmapping

Setzen Sie als Moduloption, um diese Änderung dauerhaft zu machen, d. h.d. h.:

/etc/modprobe.d/nfsd.conf
options nfs nfs4_disable_idmapping=0options nfsd nfs4_disable_idmapping=0

Um idmapping vollständig zu nutzen, stellen Sie sicher, dass die Domäne in /etc/idmapd.conf sowohl auf dem Server als auch auf dem Client konfiguriert ist:

/etc/idmapd.conf
# Folgendes sollte auf den lokalen NFSv4-Domänennamen gesetzt werden# Die Vorgabe ist der DNS-Domänenname des Hosts.Domain = domain.tld

Siehe Details.

Client

Benutzer, die NFS4 mit Kerberos verwenden wollen, müssen nfs-client.target starten und aktivieren.

Manuelles Einhängen

Für NFSv3 verwenden Sie diesen Befehl, um die exportierten Dateisysteme des Servers anzuzeigen:

$ showmount -e servername

Für NFSv4 mounten Sie das NFS-Wurzelverzeichnis und schauen sich nach verfügbaren Mounts um:

# mount server:/ /mountpoint/on/client

Dann mounten Sie unter Auslassung des NFS-Exportstammes des Servers:

# mount -t nfs -o vers=4 servername:/music /mountpoint/on/client

Wenn das Mounten fehlschlägt, versuchen Sie, die Export-Root des Servers einzubinden (für Debian/RHEL/SLES erforderlich, einige Distributionen benötigen -t nfs4 statt -t nfs):

# mount -t nfs -o vers=4 servername:/srv/nfs/music /mountpoint/on/client
Hinweis: Der Servername muss ein gültiger Hostname sein (nicht nur die IP-Adresse). Andernfalls bleibt das Einhängen der entfernten Freigabe hängen.

Einhängen mit /etc/fstab

Die Verwendung von fstab ist nützlich für einen Server, der immer eingeschaltet ist, und die NFS-Freigaben sind verfügbar, wenn der Client hochfährt. Bearbeiten Sie die Datei /etc/fstab und fügen Sie eine entsprechende Zeile hinzu, die diese Einstellung widerspiegelt. Auch hier wird das NFS-Export-Root des Servers weggelassen.

/etc/fstab
Servername:/music /mountpoint/on/client nfs defaults,timeo=900,retrans=5,_netdev0 0
Hinweis: Konsultieren Sie nfs(5) und mount(8) für weitere Einhängeoptionen.

Ein paar zusätzliche Einhängeoptionen, die Sie beachten sollten:

rsize und wsize DerrsizeWert ist die Anzahl der Bytes, die beim Lesen vom Server verwendet werden. DerwsizeWert ist die Anzahl der Bytes, die beim Schreiben auf den Server verwendet werden. Wenn diese Optionen nicht angegeben sind, handeln Client und Server standardmäßig die größten Werte aus, die sie beide unterstützen können (siehe nfs(5) für Details). Nach dem Ändern dieser Werte wird empfohlen, die Leistung zu testen (siehe #Leistungsoptimierung). soft oder hard Bestimmt das Wiederherstellungsverhalten des NFS-Clients nach einer Zeitüberschreitung einer NFS-Anfrage. Wenn keine der beiden Optionen angegeben ist (oder wenn die Optionhardangegeben ist), werden NFS-Anfragen unbegrenzt oft wiederholt. Wenn die Optionsoftangegeben ist, schlägt der NFS-Client eine NFS-Anfrage nach erneuten Übertragungen fehl, was dazu führt, dass der NFS-Client einen Fehler an die aufrufende Anwendung zurückgibt.

Warnung: Ein sogenanntes soft-Timeout kann in bestimmten Fällen eine stille Datenkorruption verursachen. Verwenden Sie daher die Option soft nur, wenn die Reaktionsfähigkeit des Clients wichtiger ist als die Datenintegrität. Die Verwendung von NFS over TCP oder das Erhöhen des Wertes der Option retrans kann einige der Risiken der Option soft abmildern.

timeo Dertimeo-Wert ist die Zeit in Zehntelsekunden, die gewartet wird, bevor eine Übertragung nach einer RPC-Zeitüberschreitung erneut gesendet wird. Der Standardwert für NFS über TCP ist 600 (60 Sekunden). Nach der ersten Zeitüberschreitung wird der Zeitüberschreitungswert bei jedem erneuten Versuch für maximal 60 Sekunden oder bis zum Auftreten einer größeren Zeitüberschreitung verdoppelt. Wenn eine Verbindung zu einem langsamen Server oder über ein stark ausgelastetes Netzwerk hergestellt wird, kann durch Erhöhen dieses Timeout-Werts eine bessere Stabilität erreicht werden. retrans Die Anzahl, wie oft der NFS-Client eine Anfrage wiederholt, bevor er weitere Wiederherstellungsmaßnahmen versucht. Wenn die Optionretransnicht angegeben wird, versucht der NFS-Client jede Anfrage dreimal. Der NFS-Client generiert nach den Wiederholungsversuchen eine Meldung „Server antwortet nicht“ und versucht dann weitere Wiederherstellungsmaßnahmen (je nachdem, ob die Option „Hard Mount“ aktiviert ist). _netdev Die Option

_netdevsagt dem System, dass es warten soll, bis das Netzwerk steht, bevor es versucht, die Freigabe einzuhängen – systemd setzt dies für NFS voraus.

Hinweis: Das Setzen des sechsten Feldes (fs_passno) auf einen Wert ungleich Null kann zu unerwartetem Verhalten führen, z.B. zu Hängern, wenn die systemd-Automobilisierung auf eine Prüfung wartet, die nie stattfinden wird.

Mounten über /etc/fstab mit systemd

Eine andere Methode ist die Verwendung der x-systemd.automount-Option, die das Dateisystem beim Zugriff einhängt:

/etc/fstab
Servername:/home /mountpoint/on/client nfs _netdev,noauto,x-systemd.automount,x-systemd.mount-timeout=10,timeo=14,x-systemd.idle-timeout=1min 0 0

Um systemd auf die Änderungen an der fstab aufmerksam zu machen, laden Sie systemd neu und starten Sie remote-fs.target .

Tipp:

  • Die noauto-Mount-Option hängt die NFS-Freigabe erst ein, wenn auf sie zugegriffen wird: verwenden Sie auto, damit sie sofort verfügbar ist.
    Wenn Sie Probleme mit dem Einhängen haben, weil das Netzwerk nicht funktioniert/verfügbar ist, aktivieren Sie NetworkManager-wait-online.service. Es stellt sicher, dass network.target alle Links zur Verfügung hat, bevor es aktiv wird.
  • Die users-Mount-Option würde Benutzer-Mounts erlauben, aber seien Sie sich bewusst, dass es weitere Optionen wie zum Beispiel noexec impliziert.
  • Die x-systemd.idle-timeout=1min-Option wird die NFS-Freigabe automatisch nach 1 Minute Nichtbenutzung aushängen. Gut für Laptops, die plötzlich vom Netzwerk getrennt werden könnten.
  • Wenn das Herunterfahren/Rebooten wegen NFS zu lange dauert, aktivieren Sie NetworkManager-wait-online.service, um sicherzustellen, dass NetworkManager nicht beendet wird, bevor die NFS-Volumes ausgehängt werden.
  • Fügen Sie nicht die x-systemd.requires=network-online.target-Mount-Option hinzu, da dies zu Bestellzyklen innerhalb von systemd führen kann. systemd fügt die network-online.target-Abhängigkeit für _netdev mount automatisch hinzu.
  • Die Verwendung der nocto-Option kann die Leistung für Nur-Lese-Mounts verbessern, sollte aber nur verwendet werden, wenn sich die Daten auf dem Server nur gelegentlich ändern.

Als systemd-Einheit

Erstellen Sie eine neue .mount-Datei innerhalb von /etc/systemd/system, z. B. mnt-myshare.mount. Siehe systemd.mount(5) für Details.

Hinweis: Achten Sie darauf, dass der Dateiname mit dem Einhängepunkt übereinstimmt, den Sie verwenden möchten. z.B. kann der Unit-Name mnt-myshare.mount nur verwendet werden, wenn Sie die Freigabe unter /mnt/myshare einhängen möchten. Andernfalls kann der folgende Fehler auftreten: systemd: mnt-myshare.mount: Where= setting does not match unit name. Refusing..

What= Pfad zur Freigabe

Where= Pfad zum Einhängen der Freigabe

Options= Optionen zum Einhängen der Freigabe

Hinweis:

  • Netzwerk-Einhängeeinheiten erwerben automatisch After Abhängigkeiten von remote-fs-pre.targetnetwork.target und network-online.target, und erhalten eine Before-Abhängigkeit von remote-fs.target, sofern nicht die nofail-Mount-Option gesetzt ist. Zu letzterem wird ein Wants hinzugefügt.
  • Hängen Sie noauto an Options an, um ein automatisches Einhängen während des Bootens zu verhindern (es sei denn, es wird von einem anderen Gerät eingezogen).
  • Wenn Sie einen Hostnamen für den freizugebenden Server verwenden wollen (statt einer IP-Adresse), fügen Sie nss-lookup.target zu After hinzu. Dies könnte Mount-Fehler beim Booten vermeiden, die beim Testen nicht auftreten.
/etc/systemd/system/mnt-myshare.mount
Description=Mount Share at bootWhat=172.16.24.192:/mnt/myshareWhere=/mnt/myshareOptions=Type=nfsTimeoutSec=30WantedBy=multi-user.target
Tipp: Im Falle eines nicht erreichbaren Systems hängen Sie ForceUnmount=true an an, damit die Freigabe (zwangsweise) ausgehängt werden kann.

Um mnt-myshare.mount zu verwenden, starten Sie die Unit und aktivieren Sie, dass sie beim Systemstart ausgeführt wird.

automount

Um eine Freigabe automatisch einzuhängen, kann man die folgende Automount-Unit verwenden:

/etc/systemd/system/mnt-myshare.automount
Description=Automount myshareWhere=/mnt/myshareWantedBy=multi-user.target

Deaktivieren/stoppen Sie die mnt-myshare.mountEinheit und aktivieren/starten Sie mnt-myshare.automount, um die Freigabe automatisch zu aktivieren, wenn auf den Mount-Pfad zugegriffen wird.

Tipp: Hängen Sie TimeoutIdleSec an, um das automatische Aushängen zu aktivieren. Siehe systemd.automount(5) für Details.

Montieren mit autofs

Die Verwendung von autofs ist nützlich, wenn sich mehrere Maschinen über NFS verbinden wollen; sie könnten sowohl Clients als auch Server sein. Der Grund, warum diese Methode der früheren vorzuziehen ist, ist, dass der Client keine Fehlermeldung ausgibt, dass er keine NFS-Freigaben finden kann, wenn der Server ausgeschaltet ist. Siehe autofs#NFS-Netzwerkeinhängungen für Details.

Tipps und Tricks

Leistungsoptimierung

Bei der Verwendung von NFS in einem Netzwerk mit einer beträchtlichen Anzahl von Klienten kann man die Standard-NFS-Threads von 8 auf 16 oder sogar auf einen höheren Wert erhöhen, abhängig von den Anforderungen des Servers/Netzwerks:

/etc/nfs.conf
threads=16

Es kann notwendig sein, die rsize und wsize Einhängeoptionen auf die Anforderungen der Netzwerkkonfiguration abzustimmen.

In neueren Linux-Kerneln (>2.6.18) variiert die Größe der vom NFS-Server erlaubten I/O-Operationen (standardmäßige maximale Blockgröße) in Abhängigkeit von der Größe des Arbeitsspeichers, mit einem Maximum von 1M (1048576 Bytes), die maximale Blockgröße des Servers wird auch dann verwendet, wenn NFS-Clients größere rsize und wsize benötigen. Siehe https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/5.8_Technical_Notes/Known_Issues-kernel.htmlIt Es ist möglich, die standardmäßig vom Server erlaubte maximale Blockgröße zu ändern, indem Sie vor dem Start von nfsd in das /proc/fs/nfsd/max_block_size schreiben. Zum Beispiel stellt der folgende Befehl die vorherige Standard-iosize von 32k wieder her:

# echo 32768 > /proc/fs/nfsd/max_block_size

Um die Änderung dauerhaft zu machen, erstellen Sie eine systemd-tmpfile:

/etc/tmpfiles.d/nfsd-block-size.conf
w /proc/fs/nfsd/max_block_size - - - - 32768

Zum Einhängen mit den erhöhten rsize und wsize Einhängeoptionen:

# mount -t nfs -o rsize=32768,wsize=32768,vers=4 servername:/srv/nfs/music /mountpoint/on/client

Außerdem kann trotz der Verletzung des NFS-Protokolls das Setzen von async anstelle von sync oder sync,no_wdelay vor allem auf drehenden Festplatten einen deutlichen Leistungsgewinn bringen. Konfigurieren Sie die Exporte mit dieser Option und führen Sie dann exportfs -arv zur Anwendung aus.

/etc/exports
/srv/nfs 192.168.1.0/24(rw,async,crossmnt,fsid=0)/srv/nfs/music 192.168.1.0/24(rw,async)

Automatische Einhängebehandlung

Dieser Trick ist nützlich für NFS-Freigaben in einem drahtlosen Netzwerk und/oder in einem Netzwerk, das möglicherweise unzuverlässig ist. Wenn der NFS-Host unerreichbar wird, wird die NFS-Freigabe ausgehängt, um hoffentlich Systemhänger zu verhindern, wenn Sie die hard Einhängeoption verwenden.

Stellen Sie sicher, dass die NFS-Einhängepunkte in der fstab korrekt angegeben sind:

/etc/fstab
lithium:/mnt/data /mnt/data nfs noauto 0 0lithium:/var/cache/pacman /var/cache/pacmannfs noauto 0 0
Hinweis:

  • Verwenden Sie Hostnamen in der fstab, damit dies funktioniert, keine IP-Adressen.
  • Um NFS-Freigaben mit Nicht-Root-Benutzern einhängen zu können, muss die Option users hinzugefügt werden.
  • Die noauto mount-Option weist systemd an, die Freigaben beim Booten nicht automatisch einzuhängen, da dies sonst zum Abwürgen des Boot-Prozesses führen kann.

Erstellen Sie das auto_share-Skript, das von cron oder systemd/Timers verwendet wird, um mit ICMP-Ping zu prüfen, ob der NFS-Host erreichbar ist:

/usr/local/bin/auto_share
#!/bin/bashfunction net_umount { umount -l -f $1 &>/dev/null}function net_mount { mountpoint -q $1 || mount $1}NET_MOUNTS=$(sed -e '/^.*#/d' -e '/^.*:/!d' -e 's/\t/ /g' /etc/fstab | tr -s " ") | while IFS= read -r linedo SERVER=$(echo $line | cut -f1 -d":") MOUNT_POINT=$(echo $line | cut -f2 -d" ") # Prüfen, ob Server bereits getestet if }" =~ "${SERVER}" ]]; then # Der Server ist hochgefahren, stellen Sie sicher, dass die Freigabe eingehängt ist net_mount $MOUNT_POINT elif }" =~ "${SERVER}" ]]; then # Der Server konnte nicht erreicht werden, hänge die Freigabe aus net_umount $MOUNT_POINT else # Prüfe, ob der Server erreichbar ist ping -c 1 "${SERVER}" &>/dev/null if ; then server_notok}]=$SERVER # Der Server konnte nicht erreicht werden, hänge die Freigabe aus net_umount $MOUNT_POINT else server_ok}]=$SERVER # Der Server läuft, stelle sicher, dass die Freigabe eingehängt ist net_mount $MOUNT_POINT fi fidone
Hinweis: Testen Sie mit einer TCP-Sonde anstelle von ICMP-Ping (Standard ist tcp-Port 2049 in NFS4) und ersetzen Sie die Zeile:

# Check if the server is reachableping -c 1 "${SERVER}" &>/dev/null

mit:

# Check if the server is reachabletimeout 1 bash -c ": < /dev/tcp/${SERVER}/2049"

im obigen Skript auto_share.

Stellen Sie sicher, dass das Skript ausführbar ist:

# chmod +x /usr/local/bin/auto_share

Als Nächstes konfigurieren Sie das Skript so, dass es jedes X ausgeführt wird, in den Beispielen unten ist das jede Minute.

Cron

# crontab -e
* * * * * /usr/local/bin/auto_share

systemd/Timers

/etc/systemd/system/auto_share.timer
Description=NFS-Freigaben automatisch jede Minute einschaltenOnCalendar=*-*-* *:*:00WantedBy=timers.target
/etc/systemd/system/auto_share.service
Description=NFS-Freigaben automatisch aktivierenAfter=syslog.target network.targetType=oneshotExecStart=/usr/local/bin/auto_shareWantedBy=multi-user.target

Schließlich aktivieren und starten Sie auto_share.timer.

Verwendung eines NetworkManager-Dispatchers

NetworkManager kann auch so konfiguriert werden, dass ein Skript bei einer Änderung des Netzwerkstatus ausgeführt wird.

Die einfachste Methode für das Einhängen von Freigaben bei einer Änderung des Netzwerkstatus ist es, das auto_share-Skript per Symlink zu verbinden:

# ln -s /usr/local/bin/auto_share /etc/NetworkManager/dispatcher.d/30-nfs.sh

Doch in diesem speziellen Fall wird das Aushängen erst erfolgen, nachdem die Netzwerkverbindung bereits deaktiviert wurde, was unsauber ist und zu Effekten wie dem Einfrieren von KDE Plasma-Applets führen kann.

Das folgende Skript hängt die NFS-Freigaben sicher aus, bevor die betreffende Netzwerkverbindung deaktiviert wird, indem es auf die Ereignisse pre-down und vpn-pre-down wartet und das Skript ausführbar macht:

/etc/NetworkManager/dispatcher.d/30-nfs.sh
#!/bin/bash# Finden Sie die Verbindungs-UUID mit "nmcli con show" im Terminal.# Alle NetworkManager-Verbindungstypen werden unterstützt: drahtlos, VPN, verkabelt...WANTED_CON_UUID="CHANGE-ME-NOW-9c7eff15-010a-4b1c-a786-9b4efa218ba9 "if ]; then # Skriptparameter $1: NetworkManager-Verbindungsname, nicht verwendet # Skriptparameter $2: Dispatched Event case "$2" in "up") mount -a -t nfs4,nfs ;; "pre-down");& "vpn-pre-down") umount -l -a -t nfs4,nfs -f >/dev/null ;; esacfi
Hinweis: Dieses Skript ignoriert Mounts mit der Option noauto, entfernen Sie diese Mount-Option oder verwenden Sie auto, damit der Dispatcher diese Mounts verwalten kann.

Erstellen Sie einen Symlink innerhalb von /etc/NetworkManager/dispatcher.d/pre-down, um die pre-down-Ereignisse abzufangen:

# ln -s /etc/NetworkManager/dispatcher.d/30-nfs.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-nfs.sh

Fehlersuche

Es gibt einen eigenen Artikel NFS/Fehlersuche.

Siehe auch

  • Siehe auch Avahi, eine Zeroconf-Implementierung, die eine automatische Erkennung von NFS-Freigaben ermöglicht.
  • HOWTO: Diskless network boot NFS root
  • Microsoft Services for Unix NFS Client info
  • NFS auf Snow Leopard
  • http://chschneider.eu/linux/server/nfs.shtml
  • Wie man die NFS-Leistung von Linux abstimmt und optimiert
  • Linux: NFS-Leistung abstimmen

\n’bprintf %s „$NET_MOUNTS“ | while IFS= read -r linedo SERVER=$(echo $line | cut -f1 -d“:“) MOUNT_POINT=$(echo $line | cut -f2 -d“ „) # Check if server already tested if }“ =~ „${SERVER}“ ]]; then # The server is up, make sure the share are mounted net_mount $MOUNT_POINT elif }“ =~ „${SERVER}“ ]]; then # The server could not be reached, unmount the share net_umount $MOUNT_POINT else # Check if the server is reachable ping -c 1 „${SERVER}“ &>/dev/null if ; then server_notok}]=$SERVER # The server could not be reached, unmount the share net_umount $MOUNT_POINT else server_ok}]=$SERVER # The server is up, make sure the share are mounted net_mount $MOUNT_POINT fi fidone

Note: Test using a TCP probe instead of ICMP ping (default is tcp port 2049 in NFS4) then replace the line:

# Check if the server is reachableping -c 1 "${SERVER}" &>/dev/null

with:

# Check if the server is reachabletimeout 1 bash -c ": < /dev/tcp/${SERVER}/2049"

in the auto_share script above.

Make sure the script is executable:

# chmod +x /usr/local/bin/auto_share

Next check configure the script to run every X, in the examples below this is every minute.

Cron

# crontab -e
* * * * * /usr/local/bin/auto_share

systemd/Timers

/etc/systemd/system/auto_share.timer
Description=Automount NFS shares every minuteOnCalendar=*-*-* *:*:00WantedBy=timers.target
/etc/systemd/system/auto_share.service
Description=Automount NFS sharesAfter=syslog.target network.targetType=oneshotExecStart=/usr/local/bin/auto_shareWantedBy=multi-user.target

Finally, enable and start auto_share.timer.

Using a NetworkManager dispatcher

NetworkManager can also be configured to run a script on network status change.

The easiest method for mount shares on network status change is to symlink the auto_share script:

# ln -s /usr/local/bin/auto_share /etc/NetworkManager/dispatcher.d/30-nfs.sh

However, in that particular case unmounting will happen only after the network connection has already been disabled, which is unclean and may result in effects like freezing of KDE Plasma applets.

The following script safely unmounts the NFS shares before the relevant network connection is disabled by listening for the pre-down and vpn-pre-down events, make the script is executable:

/etc/NetworkManager/dispatcher.d/30-nfs.sh
#!/bin/bash# Find the connection UUID with "nmcli con show" in terminal.# All NetworkManager connection types are supported: wireless, VPN, wired...WANTED_CON_UUID="CHANGE-ME-NOW-9c7eff15-010a-4b1c-a786-9b4efa218ba9"if ]; then # Script parameter $1: NetworkManager connection name, not used # Script parameter $2: dispatched event case "$2" in "up") mount -a -t nfs4,nfs ;; "pre-down");& "vpn-pre-down") umount -l -a -t nfs4,nfs -f >/dev/null ;; esacfi
Note: This script ignores mounts with the noauto option, remove this mount option or use auto to allow the dispatcher to manage these mounts.

Create a symlink inside /etc/NetworkManager/dispatcher.d/pre-down to catch the pre-down events:

# ln -s /etc/NetworkManager/dispatcher.d/30-nfs.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-nfs.sh

Troubleshooting

There is a dedicated article NFS/Troubleshooting.

See also

  • See also Avahi, a Zeroconf implementation which allows automatic discovery of NFS shares.
  • HOWTO: Diskless network boot NFS root
  • Microsoft Services for Unix NFS Client info
  • NFS on Snow Leopard
  • http://chschneider.eu/linux/server/nfs.shtml
  • How to do Linux NFS Performance Tuning and Optimization
  • Linux: Tune NFS Performance

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.