Wie kann ich feststellen, ob eine NFS-Fernbedienung ein Verzeichnis exportiert?

11

In meinem Skript habe ich mehrere Statusebenen:

  1. Fernbedienung ist verfügbar (Ping)
  2. Der Remote-NFS-Dienst ist aktiv
  3. Remote-NFS exportiert ein bestimmtes Verzeichnis
  4. Remote-NFS ist gemountet (Mount)

Für (2) und (3) halte ich rcpinfodie beste Wahl. Für (2) kann ich jedoch nicht herausfinden, wie ich meine Abfrage auf den NFS-Dienst beschränken kann, ohne eine Subshell zu starten (was für diese Anwendung nicht akzeptabel ist). Für (3) bin ich mir nicht sicher, ob diese Informationen auch nur aus der Ferne verfügbar sind ( sshnatürlich ohne Eingabe).

Ich arbeite an RHEL 6 und habe keinen Zugriff auf Programme, die nicht in der Standarddistribution enthalten sind.

Sean Allred
quelle

Antworten:

16

Für 3) möchten Sie wahrscheinlich verwenden, showmount -e remote_nfs_serverwas zeigt, ob remote_nfs_server etwas exportiert hat.

Und für 2) wenn Sie keine Shubshell verwenden möchten und wissen, ob auf dem Remote-Server NFSv3 oder NFSv4 ausgeführt wird und ob TCP oder UDP, können Sie dies speziell mit rpcinfo abfragen:
rpcinfo -u remote_nfs_server nfs 3 für NFSv3 über UDP und
rpcinfo -t remote_nfs_server nfs 4für NFSv4 über TCP

Für 4) möchten Sie vielleicht überprüfen, ob der Ordner ein gemountetes Remote-Dateisystem ist


Weitere Informationen:

doktor5000
quelle
showmount -r remotewird mir sagen, ob etwasremote exportiert wird , aber gibt es eine Möglichkeit für mich festzustellen, ob es exportiert wird, ohne eine Subshell (dh eine Pipeline) zu starten? remote:/mnt/dir
Sean Allred
showmount -e remotewird Ihnen sagen, ob remoteetwas exportiert wurde. showmount -rgibt nur eine Fehlermeldung aus, da diese Option nicht vorhanden ist. Sie können versuchen, den Shell-Teilstring-Abgleich zu verwenden, um im Grunde genommen nach einem regulären Ausdruck in der showmount-Ausgabe zu suchen. Vielleicht werfen Sie einen Blick auf zB stackoverflow.com/questions/12619720/…
doktor5000
Oder anders herum: Ich kenne keinen eigenständigen Befehl, der speziell einen Remote-NFS-Server nach einem bestimmten Mount abfragen kann, und ich glaube nicht, dass dieser existiert. Nur zwei andere Möglichkeiten wären, den Remote-Server lokal über ssh abzufragen (obwohl es selbst dann keine zuverlässige Möglichkeit gibt, festzustellen, ob ein bestimmtes Verzeichnis aufgrund der Statuslosigkeit von NFS derzeit exportiert wird). Ein anderer Ansatz könnte darin bestehen, zu versuchen, den NFS-Export vom Client zu mounten und nach dem Exit-Code und dann nach dem lokalen Mounten und dessen Inhalt zu suchen.
Doktor5000
Mein Fehler mit der -rOption versus -e- das habe ich gemeint :) Der 'Versuchsansatz' wurde schon früher vorgeschlagen. Ich mag es nicht besonders, aber es sieht nach einer echten Option aus.
Sean Allred
5

Sie können showmount -e <server>für einige Aspekte von # 3 verwenden. Wenn die Exporte einfach sind, würde dies zumindest bedeuten, dass ein Verzeichnis (oder möglicherweise ein übergeordnetes Verzeichnis eines solchen Verzeichnisses) exportiert wird.

# showmount -e server
/export                               (everyone)

Für # 2 bin ich mir nicht sicher, wonach Sie suchen. Wenn Sie NFSv3 verwenden, suchen Sie mindestens mountd und nfs (und möchten in einigen Fällen möglicherweise die Sperrmanager bestätigen). Sie können explizit mit rpcinfo nachsehen, wie Sie sagen.

# rpcinfo -t server mountd 3
program 100005 version 3 ready and waiting
BowlOfRed
quelle
showmount -r remotewird mir sagen, ob etwasremote exportiert wird , aber gibt es eine Möglichkeit für mich festzustellen, ob es exportiert wird, ohne eine Subshell (dh eine Pipeline) zu starten? remote:/mnt/dir
Sean Allred
Das hängt von den Einrichtungen ab, die Ihnen zur Verfügung stehen. In was ist dein Skript geschrieben? Warum ist das Starten einer separaten ausführbaren Datei (showmount) weniger problematisch als das Starten einer anderen Shell?
BowlOfRed
Ich schreibe mein Skript in Python 2.6 und verwende das subprocessModul. Ich kann damit eine Pipeline einrichten, aber ich möchte das Design lieber nicht so komplizieren. Ich muss vermeiden, eine Subshell zu starten, damit das Skript ordnungsgemäß beendet werden kann. Wenn es beendet wird, werden seine untergeordneten Prozesse beendet, nicht jedoch die untergeordneten Prozesse der untergeordneten Prozesse. Somit würde die Unterschale getötet, aber nicht die Prozesse, die die Unterschale erzeugt. Ich habe auch festgestellt rpcinfo, dass die Rückkehr bis zu drei Minuten dauern kann. Dies ist die ursprüngliche Grundlage für die Sache ohne Unterschale. Es ist jedoch viel zu spät, dies jetzt zu ändern.
Sean Allred
Schreiben Sie ein separates Skript, das das tut, was Sie benötigen (wie Aufrufe von showmount, verwendet jedoch ein Argument für das Verzeichnis und gibt Erfolg / Misserfolg zurück und enthält eine für Ihre Zwecke angemessene Zeitüberschreitung), und rufen Sie dieses Skript dann von Ihrem Python aus auf.
BowlOfRed
Ich kann Ihnen versprechen, dass es nicht so einfach ist, wie Sie sofort denken würden - wenn es gesperrt ist, rpcinforeagiert es nur auf SIGKILL (was eine falsche Zuordnung ist - das Betriebssystem beendet den Prozess offensichtlich nur). Auf jeden Fall würde das immer noch eine Shell starten rpcinfo- das zugrunde liegende Problem bleibt bestehen.
Sean Allred
0

Listen Sie alle Pseudo-Root-NFS-V4-Exportverzeichnisse auf

ls /net/ip-addr-nfs-server

Schau dir meine Antwort in einem anderen Thread an

Sathish
quelle
Damit ein /netMount funktioniert, /etc/auto.netmuss das Skript feststellen, dass der Server über einen entsprechenden Export verfügt. Dies verwendet den showmountBefehl. Wenn der Server nur über NFSv4 verfügt, funktioniert er nicht (showmount wird angezeigt RPC: Program not registeredund /net/servermeldet sich nur File not found)
Ale