Como posso determinar o tipo de fs do meu diretório de trabalho atual?


19

Preciso de uma maneira leve e independente de plataforma de detectar o tipo de montagem do meu CWD. Especificamente, preciso determinar se meu CWD está em uma montagem de SSHFS, NFS, CIFS, SMB ou armazenamento em bloco local.

Preciso fazer isso no Mac OSX 10.6, 10.7 e RHEL5 (no mínimo).

Existe a possibilidade de usar o df, mas o df se comporta de maneira bastante diferente nessas duas plataformas. Além disso, eu teria que CLI raspar sua saída com awk, que enquanto praticável é ... frágil.

Esta informação deve estar disponível em algum nível. Existe uma ferramenta que eu desconheço que poderia fornecer essas informações para mim?

Respostas:


17

O tipo de sistema de arquivos não é algo que você pode acessar facilmente de forma independente do SO. Os nomes de tipo de sistema de arquivos dependem do sistema operacional, portanto, não houve nenhum incentivo para estabelecer um método padrão.

Em sistemas Linux não incorporados, stat -f -c %T .mostra o tipo de sistema de arquivos do diretório atual. O statcomando do OSX não tem nada parecido com isto.

Como tudo que você deseja saber é se o tipo de sistema de arquivos está em uma lista finita, no Linux, você pode limitar o conjunto de caminhos para imprimir informações e o conjunto de tipos de sistema de arquivos. Você receberá um erro (“df: nenhum sistema de arquivos processado”) se o tipo de sistema de arquivos do diretório atual não estiver na lista.

if df -t sshfs -t nfs -t cifs . >/dev/null 2>/dev/null; then …

A mesma sintaxe pode ou não funcionar no OSX; caso contrário, tente df -T sshfs,nfs,cifs ..


Isso é exatamente o que eu precisava. Gilles você é ótimo!
ARX

7

Você pode usar o GNU stat no Linux:

stat --file-system --format=%T /tmp/subdir/whatever
tmpfs

Isso é ótimo porque funciona em subdiretórios. Obrigado!
Avindra Goolcharan 02/09/16

4

No Linux, existe o findmnt disponível desde o util-linux 2.18.

findmnt -n -o FSTYPE -T /home
nfs4

Não funciona para / home / subdir, portanto não ajudaria o OP.
Eloff

Para mim, ele funciona para subdiretórios também, usando o findmount do util-linux 2.23.
Rudimeier

3

Ainda não testei, mas df -Pdeve se comportar da mesma maneira na maioria das plataformas.

Isso funciona no Linux.

$ mount | grep "^$(df -Pk . | head -n 2 | tail -n 1 | cut -f 1 -d ' ') " | cut -f 5 -d ' '

Ou dividi-lo em funções reutilizáveis:

# get_mount <directory>
get_mount() {
    df -Pk "$1" | head -n 2 | tail -n 1 | cut -f 1 -d ' '
}

# get_fs <mountpoint>
get_fs() {
    mount | grep "^$1 " | cut -f 5 -d ' '
}

E chamando a função:

get_fs $(get_mount .)

Pode ser reescrito para ser um pouco mais rápido usando sedor awk, mas dessa maneira é provavelmente mais fácil de ler.

Se isso não funcionar, você pode tentar algo semelhante, mas usando /etc/mtabem vez da saída de mount.


O Pin df -Pé para POSIX, portanto, ele deve se comportar da mesma maneira. No entanto, ir do caminho do sistema de arquivos até o ponto de montagem é mais complicado.
Gilles 'SO- stop be evil' em

1
Sua solução não parece segura se o diretório estiver montado com o loop -o. Pelo menos no meu sistema, o df mostra o dispositivo de loop usado, mas mount mostra o arquivo de imagem usado. Eu acho que poderia haver ainda mais casos em que o df não mostra o mesmo dispositivo como o mount. Observe esta citação na página de manual do mount "O modo de listagem é mantido apenas para compatibilidade com versões anteriores. Para uma saída mais robusta e definível, use findmnt (8), especialmente em seus scripts."
Rudimeier 11/03/2014
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.