Come posso determinare il tipo di fs della mia attuale directory di lavoro?


19

Ho bisogno di un modo leggero e indipendente dalla piattaforma per rilevare il tipo di montaggio del mio CWD. In particolare, devo determinare se il mio CWD si trova in un montaggio SSHFS, NFS, CIFS, SMB o store di blocchi locale.

Devo farlo su Mac OSX 10.6, 10.7 e RHEL5 (almeno).

C'è la possibilità di usare df, ma df si comporta in modo abbastanza diverso su queste due piattaforme. Inoltre, dovrei CLI raschiare il suo output con awk, che mentre praticabile è ... fragile.

Queste informazioni devono essere disponibili su un certo livello. Esiste uno strumento di cui non sono a conoscenza che potrebbe fornirmi queste informazioni?

Risposte:


17

Il tipo di filesystem non è qualcosa a cui puoi facilmente accedere in modo indipendente dal sistema operativo. I nomi dei tipi di filesystem dipendono dal sistema operativo, quindi non c'è stato alcun incentivo per stabilire un metodo standard.

Sui sistemi Linux non incorporati, stat -f -c %T .mostra il tipo di filesystem della directory corrente. Il statcomando di OSX non ha nulla del genere.

Dato che tutto ciò che vuoi sapere è se il tipo di filesystem è in un elenco finito, sotto Linux, puoi limitare sia il set di percorsi per cui stampare le informazioni sia il set di tipi di filesystem. Verrà visualizzato un errore ("df: nessun file system elaborato") se il tipo di file system della directory corrente non è nell'elenco.

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

La stessa sintassi può funzionare o meno su OSX; in caso contrario, prova df -T sshfs,nfs,cifs ..


Questo è esattamente ciò di cui avevo bisogno. Gilles sei fantastico!
ARX,

7

Puoi usare GNU stat su Linux:

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

Questo è fantastico perché funziona su sottodirectory. Grazie!
Avindra Goolcharan,

4

Su Linux c'è findmnt disponibile da util-linux 2.18.

findmnt -n -o FSTYPE -T /home
nfs4

Non funziona per / home / subdir, quindi non aiuterebbe l'OP.
Eloff,

Per me funziona anche con i subdir, usando findmount da util-linux 2.23.
rudimeier,

3

Non l'ho provato, ma df -Pdovrebbe comportarsi allo stesso modo sulla maggior parte delle piattaforme.

Questo funziona su Linux.

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

O suddividendolo in funzioni riutilizzabili:

# 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 chiamando la funzione:

get_fs $(get_mount .)

Potrebbe essere riscritto per essere leggermente più veloce usando sedo awk, ma in questo modo è probabilmente più facile da leggere.

Se questo non funziona, potresti provare qualcosa di simile, ma usando /etc/mtabpiuttosto che l'output di mount.


L' Pa df -Pè per POSIX, quindi dovrebbe comportarsi nello stesso modo. Tuttavia, passare dal percorso del filesystem al punto di montaggio è più complicato.
Gilles 'SO- smetti di essere malvagio'

1
La tua soluzione non sembra sicura se la directory è montata con -o loop. Almeno sul mio sistema df mostra il dispositivo loop usato ma mount mostra il file immagine usato. Immagino che potrebbero esserci ancora più casi in cui df non mostra lo stesso dispositivo come mount. Nota questa citazione dalla pagina man di mount "La modalità elenco è mantenuta solo per compatibilità con le versioni precedenti. Per un output più robusto e definibile usa findmnt (8), specialmente nei tuoi script."
rudimeier,
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.