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
linux
shell-script
filesystems
mount
Totor
fonte
fonte
/etc/mtab
ou os resultados de, emmount
vez de usar,df
podem ocorrer em mais alguns casos./proc/mounts
mount
, nem/etc/mtab
, nem mesmo/proc/mounts
são padrão por isso não há garantia sobre o que pode ser encontrado lá ...-T
ter um significado diferente aquiVocê poderia usar o GNU
stat
.%m
para descobrir o ponto de montagem.%T
(no modo de sistema de arquivos) para descobrir o nome do sistema de arquivos.Portanto, você sabe que
/usr/src/linux
, no meu sistema, é armazenado em um sistema de arquivos montado/usr/src
e com o tipo de sistema de arquivosreiserfs
.Consulte também
man stat
para 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 degrep | awk
guarda.fonte
stat
não possui a%m
opção de--format
(usando Debian Squeeze, coreutils 8.5). Então, acho que essa solução não é muito confiável.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.mount -l
e usegrep
,,sed
ouawk
para encontrar a linha que se refere ao diretório em questão.fonte
/my/path/to/the/directory
na verdade, é algo do ponto de montagem/my/path
com sua resposta. Talvez você pode dar mais alguns detalhes sobre ogrep
,sed
,awk
comandos você sugere (a resposta completa) ?.mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'
deve fornecer uma lista de todos os pontos de montagem do nfs no sistema.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, eustat --printf
gerei aon <mountpoint> type
parte.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:... e faça um
stat(2)
em cada nível, até asst_dev
mudanç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/mtab
ou na saída demount
para 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.davfs
são óbvias, mas o que acontece, por exemplo,fuse.gvfs-fuse-daemon
oufuse.avfsd
que podem ter ambos os arquivos de rede e fora da rede?fonte
stat(2)
, acho que você está se referindo à função C, mas estou usando shell. No entanto,st_dev
refere-se ao ID principal e secundário do dispositivo (é específico do Linux?), E o comando shellstat(1)
possui (não-padrão)%t
e%T
com as--format
opções para números maiores e menores, respectivamente, mas sempre retorna "0" (local e nfs ) Eu experimentei o Debian Squeeze e o Lenny.--file-system
opção?--file-system
.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:
No entanto, a
-l
opção não é padrão .fonte
df
falharia 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".df /path
dirá que esse/path
é um ponto de montagem se disser que o ponto de montagem não é/
.fonte
Apenas faça
Se o primeiro campo (o sistema de arquivos) estiver no formato host: / path, você saberá que é NFS
fonte
Você pode usar os
df -t
sistemas Linux edf -T
BSD.Do homem df :
fonte
-t
opçã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.Eu usaria pessoalmente
mountpoint
(muito portátil no Linux!):ou
showmount
que é praticamente necessário instalar em qualquer sistema que realmente monteNFS
compartilhamentos (parte donfs-common
pacote):Outra opção seria algo como:
fonte
mountpoint
utilitá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,mountpoint
não é padrão (não está nesta lista ).mountpoint
é padrão neste caso.irá verificar todas as pastas nomeadas 'nfs' se estiverem montadas
fonte
nfs
.