Come posso determinare se un telecomando NFS sta esportando una directory?


11

Nel mio script, ho diversi livelli di stato:

  1. il telecomando è disponibile (ping)
  2. il servizio NFS remoto è attivo
  3. NFS remoto sta esportando una determinata directory
  4. NFS remoto è montato (mount)

Per (2) e (3), credo rcpinfosia la scommessa migliore. Per (2), tuttavia, non riesco a capire come restringere la mia query al servizio NFS senza avviare una subshell (che non è accettabile per questa applicazione). Per (3), non sono sicuro che queste informazioni siano disponibili anche in remoto (senza sshing, ovviamente).

Sto lavorando su RHEL 6 e non ho accesso a programmi che non sono inclusi nella distribuzione standard.

Risposte:


16

Per 3) probabilmente vuoi usare ciò showmount -e remote_nfs_serverche mostra se remote_nfs_server ha esportato qualcosa.

E per 2) se non si desidera utilizzare un shubshell e sapere se il server remoto esegue NFSv3 o NFSv4 e se TCP o UDP, è possibile eseguire una query specifica con rpcinfo:
rpcinfo -u remote_nfs_server nfs 3 per NFSv3 tramite UDP e
rpcinfo -t remote_nfs_server nfs 4per NFSv4 tramite TCP

Per 4) potresti voler controllare Controlla se la cartella è un filesystem remoto montato


Ulteriori informazioni:


showmount -r remotemi dirà se remotesta esportando qualcosa , ma esiste un modo per determinare se remote:/mnt/dirviene esportato senza avviare una subshell (ovvero una pipeline)?
Sean Allred,

showmount -e remoteti dirà se remoteha esportato qualcosa. showmount -rti darà solo un messaggio di errore in quanto tale opzione non esiste. Potresti provare a usare la corrispondenza della sottostringa della shell per grep sostanzialmente per un'espressione regolare nell'output showmount. Forse dare un'occhiata a esempio stackoverflow.com/questions/12619720/...
doktor5000

O viceversa, non conosco alcun comando autonomo che possa interrogare specificamente un server NFS remoto per un determinato mount, e non credo che esista. Solo altri due modi possibili sarebbero interrogare il server remoto localmente tramite ssh (anche se anche in questo caso non esiste un modo affidabile per determinare se una determinata directory è attualmente esportata a causa della natura stateless di NFS). Un altro approccio potrebbe essere quello di provare a montare l'esportazione NFS dal client e verificare il codice di uscita e quindi il mount locale e il suo contenuto.
doktor5000,

Il mio errore con l' -ropzione contro -e- questo è ciò che intendevo :) Il "tentativo di approccio" è stato suggerito prima. Non mi piace particolarmente, ma sembra una vera opzione.
Sean Allred,

5

È possibile utilizzare showmount -e <server>per alcuni aspetti di # 3. Quando le esportazioni sono semplici, suggerirebbe almeno che venga esportata una directory (o forse un genitore di tale directory).

# showmount -e server
/export                               (everyone)

Per il n. 2, non sono sicuro di cosa stai cercando. Se stai usando NFSv3, dovrai cercare almeno mountd e nfs (e in alcuni casi potresti voler confermare i gestori dei blocchi). È possibile verificare esplicitamente qualsiasi con rpcinfo come dici tu.

# rpcinfo -t server mountd 3
program 100005 version 3 ready and waiting

showmount -r remotemi dirà se remotesta esportando qualcosa , ma esiste un modo per determinare se remote:/mnt/dirviene esportato senza avviare una subshell (ovvero una pipeline)?
Sean Allred,

Dipende dalle strutture a vostra disposizione. In cosa è scritto il tuo copione? Perché l'avvio di un eseguibile separato (showmount) è meno un problema rispetto all'avvio di un'altra shell?
BowlOfRed

Sto scrivendo la mia sceneggiatura in Python 2.6 e usando il subprocessmodulo. Posso creare una pipeline con esso, ma preferirei non complicare così tanto il design. Devo evitare di avviare una subshell per consentire che lo script venga ucciso con garbo: se viene ucciso, i suoi processi figlio verranno eliminati, ma non i processi figlio. Pertanto, la subshell verrebbe uccisa, ma non i processi generati dalla subshell. Ho anche notato che rpcinfopossono essere necessari fino a tre minuti per tornare, che è la base originale per la cosa senza subshell. Ma è troppo tardi per cambiarlo adesso.
Sean Allred,

Scrivi uno script separato che fa ciò di cui hai bisogno (come chiama showmount, ma accetta un argomento per la directory e restituisce esito positivo / negativo e include un timeout ragionevole per i tuoi scopi), quindi chiama quello script dal tuo Python.
BowlOfRed

Posso prometterti che non è così facile come pensi immediatamente: quando è bloccato, rpcinfonon risponde a nulla tranne SIGKILL (che è un'attribuzione errata - il sistema operativo ovviamente uccide solo il processo). Ad ogni modo, ciò darebbe comunque inizio all'avvio di una shell rpcinfo- il problema di fondo rimane.
Sean Allred,

0

Elencare tutte le directory di esportazione NFS-V4 pseudo root

ls /net/ip-addr-nfs-server

Guarda la mia risposta in un'altra discussione


Perché un /netmount funzioni, lo /etc/auto.netscript deve stabilire che il server ha un'esportazione corrispondente. Questo utilizza il showmountcomando. Se il server ha solo NFSv4, non funzionerà (mostra showmount RPC: Program not registerede /net/serversegnalerà solo File not found)
Ale
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.