Comment puis-je déterminer si une télécommande NFS exporte un répertoire?

11

Dans mon script, j'ai plusieurs couches de statuts:

  1. la télécommande est disponible (ping)
  2. le service NFS distant est actif
  3. NFS distant exporte un certain répertoire
  4. NFS distant est monté (montage)

Pour (2) et (3), je pense que rcpinfoc'est le meilleur pari. Pour (2) cependant, je ne peux pas comprendre comment restreindre ma requête au service NFS sans démarrer un sous-shell (ce qui n'est pas acceptable pour cette application). Pour (3), je ne suis pas sûr que cette information soit même disponible à distance (sans sshentrer, bien sûr).

Je travaille sur RHEL 6 et je n'ai pas accès à des programmes qui ne sont pas inclus dans la distribution standard.

Sean Allred
la source

Réponses:

16

Pour 3), vous voudrez probablement utiliser showmount -e remote_nfs_serverce qui indique si remote_nfs_server a exporté quelque chose.

Et pour 2) si vous ne voulez pas utiliser une shubshell et savoir si le serveur distant exécute NFSv3 ou NFSv4 et si TCP ou UDP, vous pouvez le demander spécifiquement avec rpcinfo:
rpcinfo -u remote_nfs_server nfs 3 pour NFSv3 via UDP et
rpcinfo -t remote_nfs_server nfs 4pour NFSv4 via TCP

Pour 4), vous voudrez peut-être regarder Vérifier si le dossier est un système de fichiers distant monté


Plus d'informations:

doktor5000
la source
showmount -r remoteme dira si remoteexporte quelque chose , mais est-il possible pour moi de déterminer si remote:/mnt/direst exporté sans démarrer un sous-shell (c'est-à-dire un pipeline)?
Sean Allred
showmount -e remotevous dira si remotea exporté quelque chose. showmount -rne vous donnera qu'un message d'erreur car cette option n'existe pas. Vous pouvez essayer d'utiliser une correspondance de sous-chaîne shell pour essentiellement grep pour une expression régulière dans la sortie showmount. Peut-être jetez un œil à eg stackoverflow.com/questions/12619720/…
doktor5000
Ou inversement, je ne connais aucune commande autonome qui puisse spécifiquement interroger un serveur NFS distant pour un montage particulier, et je ne pense pas que cela existe. Seules deux autres façons viables seraient d'interroger le serveur distant localement via ssh (bien qu'il n'y ait même pas de moyen fiable pour déterminer si un répertoire donné est actuellement exporté en raison de la nature sans état de NFS). Une autre approche pourrait être d'essayer de monter l'exportation NFS à partir du client et de vérifier le code de sortie, puis le montage local et son contenu.
doktor5000
Mon erreur avec l' -roption versus -e- c'est ce que je voulais dire :) L'approche «tentative» a déjà été suggérée. Je n'aime pas particulièrement ça, mais ça ressemble à une vraie option.
Sean Allred
5

Vous pouvez utiliser showmount -e <server>pour certains aspects de # 3. Lorsque les exportations sont simples, cela suggère au moins qu'un répertoire (ou peut-être un parent d'un tel répertoire) est exporté.

# showmount -e server
/export                               (everyone)

Pour le n ° 2, je ne suis pas sûr de ce que vous recherchez. Si vous utilisez NFSv3, vous rechercherez au moins mountd et nfs (et dans certains cas, vous voudrez peut-être confirmer les gestionnaires de verrouillage). Vous pouvez vérifier explicitement tout avec rpcinfo comme vous le dites.

# rpcinfo -t server mountd 3
program 100005 version 3 ready and waiting
BowlOfRed
la source
showmount -r remoteme dira si remoteexporte quelque chose , mais est-il possible pour moi de déterminer si remote:/mnt/direst exporté sans démarrer un sous-shell (c'est-à-dire un pipeline)?
Sean Allred
Cela dépend des installations à votre disposition. Dans quoi est écrit votre script? Pourquoi le démarrage d'un exécutable séparé (showmount) pose-t-il moins de problèmes que le démarrage d'un autre shell?
BowlOfRed
J'écris mon script en Python 2.6 et j'utilise le subprocessmodule. Je peux configurer un pipeline avec, mais je préfère ne pas trop compliquer la conception. Je dois éviter de démarrer un sous-shell pour permettre au script d'être tué avec élégance - s'il est tué, ses processus enfants seront tués, mais pas les enfants des processus enfants. Ainsi, le sous-shell serait tué, mais pas les processus qu'il engendre. J'ai également noté que le rpcinforetour peut prendre jusqu'à trois minutes, ce qui est la base d'origine de la chose sans sous-coque. Il est cependant beaucoup trop tard pour changer cela maintenant.
Sean Allred
Écrivez un script séparé qui fait ce dont vous avez besoin (comme les appels showmount, mais prend un argument pour le répertoire et retourne succès / échec, et inclut un délai d'attente qui est raisonnable pour vos besoins), puis appelez ce script à partir de votre python.
BowlOfRed
Je peux vous promettre que ce n'est pas aussi facile que vous le pensez immédiatement - quand il est verrouillé, rpcinfoil ne répond à rien d'autre qu'à SIGKILL (ce qui est une mauvaise attribution - le système d'exploitation tue évidemment le processus). Quoi qu'il en soit, cela lancerait toujours un shell pour démarrer rpcinfo- le problème sous-jacent demeure.
Sean Allred
0

Liste de tous les répertoires d'exportation NFS-V4 pseudo-racine

ls /net/ip-addr-nfs-server

Découvrez ma réponse dans un autre fil

Sathish
la source
Pour qu'un /netmontage fonctionne, le /etc/auto.netscript doit établir que le serveur a une exportation correspondante. Cela utilise la showmountcommande. Si le serveur ne dispose que de NFSv4, cela ne fonctionnera pas (showmount s'affiche RPC: Program not registeredet /net/serverne fera que signaler File not found)
Ale