Como posso determinar se um NFS remoto está exportando um diretório?

11

No meu script, tenho várias camadas de status:

  1. controle remoto está disponível (ping)
  2. o serviço NFS remoto está ativo
  3. O NFS remoto está exportando um determinado diretório
  4. o NFS remoto está montado (montagem)

Para (2) e (3), acredito que rcpinfoé a melhor aposta. Para (2), porém, não consigo descobrir como restringir minha consulta ao serviço NFS sem iniciar um subshell (o que não é aceitável para este aplicativo). Para (3), não tenho certeza de que essas informações estejam disponíveis remotamente (sem sshentrar, é claro).

Estou trabalhando no RHEL 6 e não tenho acesso a programas que não estão incluídos na distribuição padrão.

Sean Allred
fonte

Respostas:

16

Para 3) você provavelmente deseja usar o showmount -e remote_nfs_serverque mostra se remote_nfs_server exportou alguma coisa.

E para 2) se você não quiser usar um shubshell e saber se o servidor remoto executa NFSv3 ou NFSv4 e se TCP ou UDP, você pode consultá-lo especificamente com rpcinfo:
rpcinfo -u remote_nfs_server nfs 3 para NFSv3 via UDP e
rpcinfo -t remote_nfs_server nfs 4NFSv4 via TCP

Para 4), verifique se a pasta é um sistema de arquivos remoto montado


Outras informações:

doktor5000
fonte
showmount -r remotevai me dizer se remoteestá exportando alguma coisa , mas existe alguma maneira de determinar se remote:/mnt/direstá sendo exportada sem iniciar um subshell (ou seja, um pipeline)?
Sean Allred
showmount -e remotedirá se você remoteexportou alguma coisa. showmount -rfornecerá apenas uma mensagem de erro, pois essa opção não existe. Você pode tentar usar a correspondência de substring do shell para basicamente grep para uma expressão regular na saída do showmount. Talvez dê uma olhada, por exemplo, em stackoverflow.com/questions/12619720/… #
doktor5000
Ou, de outra forma, não conheço nenhum comando independente que possa consultar especificamente um servidor NFS remoto para uma montagem específica, e acho que não existe. Somente outras duas maneiras viáveis ​​seriam consultar o servidor remoto localmente via ssh (embora mesmo assim não exista uma maneira confiável de determinar se um determinado diretório está sendo exportado atualmente devido à natureza sem estado do NFS). Outra abordagem poderia ser tentar montar a exportação NFS do cliente e verificar o código de saída e, em seguida, a montagem local e seu conteúdo.
Doktor5000
Meu erro com a -ropção versus -e- foi o que eu quis dizer :) A 'abordagem de tentativa' já foi sugerida antes. Não gosto particularmente, mas parece uma opção real.
Sean Allred
5

Você pode usar showmount -e <server>para alguns aspectos do nº 3. Quando as exportações são simples, pelo menos sugere que um diretório (ou talvez um pai de um diretório) seja exportado.

# showmount -e server
/export                               (everyone)

No segundo, não tenho certeza do que você está procurando. Se você estiver usando o NFSv3, procurará pelo menos mountd e nfs (e, em alguns casos, pode confirmar os gerenciadores de bloqueio). Você pode procurar por qualquer explicitamente com rpcinfo, como você diz.

# rpcinfo -t server mountd 3
program 100005 version 3 ready and waiting
BowlOfRed
fonte
showmount -r remotevai me dizer se remoteestá exportando alguma coisa , mas existe alguma maneira de determinar se remote:/mnt/direstá sendo exportada sem iniciar um subshell (ou seja, um pipeline)?
Sean Allred
Isso depende das instalações à sua disposição. Em que está escrito o seu script? Por que iniciar um executável separado (showmount) é menos problemático do que iniciar outro shell?
BowlOfRed
Estou escrevendo meu script em Python 2.6 e usando o subprocessmódulo Posso montar um pipeline com ele, mas prefiro não complicar muito o design. Preciso evitar iniciar um subshell para permitir que o script seja morto normalmente - se ele for morto, seus processos filhos serão mortos, mas não os filhos dos processos filhos. Assim, o subshell seria morto, mas não os processos que o subshell gera. Também observei que rpcinfopode demorar até três minutos para retornar, que é a base original para a coisa sem subcamadas. É tarde demais para mudar isso agora, no entanto.
Sean Allred
Escreva um script separado que faça o que você precisa (como chama showmount, mas use um argumento para diretório e retorne êxito / falha e inclua um tempo limite razoável para seus propósitos), depois chame esse script a partir do seu python.
BowlOfRed
Posso prometer que não é tão fácil quanto você pensaria imediatamente - quando está trancado, rpcinfonão responde a nada além do SIGKILL (que é uma atribuição incorreta - o sistema operacional obviamente apenas mata o processo). De qualquer forma, isso ainda iniciaria um shell rpcinfo- o problema subjacente permanece.
Sean Allred
0

Listar todos os diretórios de exportação pseudo-raiz NFS-V4

ls /net/ip-addr-nfs-server

Confira minha resposta em outro tópico

Sathish
fonte
Para que uma /netmontagem funcione, o /etc/auto.netscript deve estabelecer que o servidor tenha uma exportação correspondente. Isso usa o showmountcomando Se o servidor tiver apenas NFSv4, ele não funcionará (o showmount é exibido RPC: Program not registerede /net/serverapenas reportará File not found)
Ale