Verifique se a pasta é um sistema de arquivos remoto montado

44

Qual é a melhor maneira (confiável, portátil, etc.) para verificar se uma determinada pasta está em um sistema de arquivos remoto (nfs) montado em um script de shell?

Estou procurando um comando que se pareça com:

chk-remote-mountpoint /my/path/to/folder 
Totor
fonte

Respostas:

34

Como Stephane diz "não existe uma resposta universal do Unix para isso".

A melhor solução que encontrei para minha pergunta:

df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'

retornará o tipo de sistema de arquivos, por exemplo: nfsou ext3.

A -Topção não é padrão , portanto, pode não funcionar em outros sistemas Unix / Linux ...

De acordo com o comentário de Gilles abaixo: "Isso funciona em qualquer Linux não incorporado, mas não no BusyBox, * BSD etc."

Totor
fonte
1
Isso funciona em qualquer Linux não incorporado, mas não no BusyBox, * BSD, etc. Cabe a você decidir se isso é bom o suficiente.
Gilles 'SO- stop be evil'
A visualização /etc/mtabou os resultados de, em mountvez de usar, dfpodem ocorrer em mais alguns casos.
TNW 16/04
1
@TNW or even/proc/mounts
laebshade
1
Aparentemente, nem mount, nem /etc/mtab, nem mesmo /proc/mountssão padrão por isso não há garantia sobre o que pode ser encontrado lá ...
Totor
1
Isso não trabalho em OSX 10.8 como -Tter um significado diferente aqui
DavAlPi
13

Você poderia usar o GNU stat.

%m para descobrir o ponto de montagem.

$ stat --format=%m /usr/src/linux
/usr/src

%T (no modo de sistema de arquivos) para descobrir o nome do sistema de arquivos.

$ stat --file-system --format=%T /usr/src/linux
reiserfs

Portanto, você sabe que /usr/src/linux, no meu sistema, é armazenado em um sistema de arquivos montado /usr/srce com o tipo de sistema de arquivos reiserfs.

Consulte também man statpara referência adicional. É um comando muito versátil, útil quase sempre quando você precisa de informações sobre arquivos e não deseja voltar ao estado de grep | awkguarda.

frostschutz
fonte
Minha versão do statnão possui a %mopção de --format(usando Debian Squeeze, coreutils 8.5). Então, acho que essa solução não é muito confiável.
Totor
Eu não acreditei, mas a diferença entre coreutils 8.5 e 8.13 (debian wheezy) diz que você está certo. Considere-me muito surpreendido :) aperto é muito velho :( err, muito estável
frostschutz
1
dos coreutils changelog: 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. Isso é quase 3 anos atrás. Surpreendente que o Debian ainda não tenha isso.
Frostschutz 12/04
Mesmo que o Debian Squeeze tenha sido lançado em 06/02/2011, foi congelado em 06-08-2010, antes que este coreutils mude ... Estou procurando uma solução "padrão" possível, se possível.
Totor
Bem, você pode simplesmente usar o comando% T do sistema de arquivos, se isso funcionar no stat antigo. Se isso também não funcionar e a sua versão do stat não fornecer as informações necessárias, volte para as soluções embaraçosas que são.
Frostschutz
4

mount -le use grep,, sedou awkpara encontrar a linha que se refere ao diretório em questão.

jayhendren
fonte
Parece complicado descobrir que, /my/path/to/the/directoryna verdade, é algo do ponto de montagem /my/pathcom sua resposta. Talvez você pode dar mais alguns detalhes sobre o grep, sed, awkcomandos você sugere (a resposta completa) ?.
Totor 12/04
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'deve fornecer uma lista de todos os pontos de montagem do nfs no sistema.
Andy Shulman
Isso pode ser combinado com o mount | fgrep "`stat --printf=" on %m type" /var/log/`". The comando stat: mount` imprimirá todos os pontos de montagem, no <device> on <mountpoint> type <type>formato. Para grep isso, eu stat --printfgerei a on <mountpoint> typeparte.
MSalters 27/08/15
existem muitos tipos de montagem de sistema de arquivos local e remoto. Ter um mapa de todos eles pode ser um desafio. (por exemplo, drvfs é local ou remoto?)
Erik Aronesty
Sim, mas a pergunta pergunta especificamente sobre o nfs: "sistema de arquivos remoto montado (nfs)"
jayhendren
2

Infelizmente, não existe uma resposta universal do Unix para isso.

Uma coisa que você pode fazer, pois um determinado arquivo /a/b/c/dé percorrer o caminho:

  • /abc/.
  • /abc/..
  • /abc/../..
  • ...

... e faça um stat(2)em cada nível, até as st_devmudanças. Então você saberá onde está o ponto de montagem. Em seguida, você pode procurar o caminho canônico desse ponto de montagem /etc/mtabou na saída de mountpara descobrir o tipo de sistema de arquivos. Então descobrir o que é remoto e o que não é será complicado, especialmente para os do tipo fusível. Por exemplo, nfs, cifs, fuse.sshfs, fuse.davfssão óbvias, mas o que acontece, por exemplo, fuse.gvfs-fuse-daemonou fuse.avfsdque podem ter ambos os arquivos de rede e fora da rede?

Stéphane Chazelas
fonte
Bem, estou usando o nfs aqui (editei minha pergunta). Quanto a stat(2), acho que você está se referindo à função C, mas estou usando shell. No entanto, st_devrefere-se ao ID principal e secundário do dispositivo (é específico do Linux?), E o comando shell stat(1)possui (não-padrão) %te %Tcom as --formatopções para números maiores e menores, respectivamente, mas sempre retorna "0" (local e nfs ) Eu experimentei o Debian Squeeze e o Lenny.
Totor
Você está tentando isso com ou sem a --file-systemopção?
Frostschutz 12/04/2013
@frostschutz Without. Tem outro significado se usado com --file-system.
Totor
2

O "-l" para df (1) falhará com um erro em sistemas de arquivos não locais, portanto você pode usar esse comportamento para saber se o sistema de arquivos é remoto:

df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
   echo "local mount, do stuff"
fi

No entanto, a -lopção não é padrão .

rsone1
fonte
Esta não é uma resposta
Totor
@ Motor por que não? É verdade que existem vários outros motivos pelos quais dffalharia e isso por si só não é uma resposta muito boa, mas está tentando responder à pergunta, então não vejo por que você a chamaria de "não uma resposta".
terdon
@terdon eu concordo. Eu não li com atenção suficiente. Obrigado por apontar isto. Vou editar e votar. :)
Totor
Este é basicamente o único que funciona de maneira confiável no Linux.
Erik Aronesty 15/02
1

df /pathdirá que esse /pathé um ponto de montagem se disser que o ponto de montagem não é /.

pgen
fonte
1
A pergunta refere-se a um ponto de montagem remoto .
Totor
1

Apenas faça

df /me/path/to/folder

Se o primeiro campo (o sistema de arquivos) estiver no formato host: / path, você saberá que é NFS

Udi
fonte
0

Você pode usar os df -tsistemas Linux e df -TBSD.

Do homem df :

-t, --type = TYPE

lista de limites para sistemas de arquivos do tipo TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi
codeforester
fonte
Muito bom. No entanto, e infelizmente, a -topção tem um significado diferente no POSIX / SUS. Portanto, o uso desta opção pode fornecer resultados inconsistentes em diferentes versões na ferramenta / UNIX.
Totor
-2

Eu usaria pessoalmente mountpoint(muito portátil no Linux!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

ou showmountque é praticamente necessário instalar em qualquer sistema que realmente monte NFScompartilhamentos (parte do nfs-commonpacote):

NAME
       showmount - show mount information for an NFS server

SYNOPSIS
       showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]

Outra opção seria algo como:

$ mount -l -t nfs | grep 'my mount point'
malat
fonte
1
O mountpointutilitário não informa se o ponto de montagem é remoto. Além disso, os sistemas de arquivos remotos não se limitam aos sistemas de arquivos NFS. Finalmente, mountpointnão é padrão (não está nesta lista ).
Totor
você solicitou especificamente uma ferramenta em linux e NFS, mountpointé padrão neste caso.
malat
Isso não responde ao meu primeiro ponto de qualquer maneira.
Totor 25/01
-3
find . -type d -name nfs -exec mountpoint {} \; | grep not

irá verificar todas as pastas nomeadas 'nfs' se estiverem montadas

Dmitry Sherman
fonte
O OP não está procurando pastas nomeadas nfs.
codeforester