¿Cómo puedo determinar el tipo fs de mi directorio de trabajo actual?

19

Necesito una forma liviana e independiente de la plataforma para detectar el tipo de montaje de mi CWD. Específicamente, necesito determinar si mi CWD está en un SSHFS, NFS, CIFS, SMB o montaje en bloque local.

Necesito hacer esto en Mac OSX 10.6, 10.7 y RHEL5 (como mínimo).

Existe la posibilidad de usar df, pero df se comporta de manera bastante diferente en estas dos plataformas. Además, tendría que CLI raspar su salida con awk, que si bien es viable ... es frágil.

Esta información debe estar disponible en algún nivel. ¿Hay alguna herramienta que desconozca que pueda proporcionarme esta información?

Chris R
fuente

Respuestas:

17

El tipo de sistema de archivos no es algo a lo que pueda acceder fácilmente de forma independiente del sistema operativo. Los nombres de tipo de sistema de archivos dependen del sistema operativo, por lo que no ha habido ningún incentivo para establecer un método estándar.

En sistemas Linux no integrados, stat -f -c %T .muestra el tipo de sistema de archivos del directorio actual. El statcomando de OSX no tiene nada como esto.

Dado que todo lo que desea saber es si el tipo de sistema de archivos está en una lista finita, en Linux, puede limitar tanto el conjunto de rutas para imprimir información como el conjunto de tipos de sistema de archivos. Obtendrá un error ("df: no se procesaron sistemas de archivos") si el tipo de sistema de archivos del directorio actual no está en la lista.

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

La misma sintaxis puede o no funcionar en OSX; si no es así, inténtalo df -T sshfs,nfs,cifs ..

Gilles 'SO- deja de ser malvado'
fuente
Esto es exactamente lo que necesitaba. Gilles eres genial!
ARX
7

Puede usar GNU stat en Linux:

stat --file-system --format=%T /tmp/subdir/whatever
tmpfs
Eloff
fuente
Esto es genial porque funciona en subdirectorios. ¡Gracias!
Avindra Goolcharan
4

En Linux hay findmnt disponible desde util-linux 2.18.

findmnt -n -o FSTYPE -T /home
nfs4
rudimeier
fuente
No funciona para / home / subdir, por lo que no ayudaría al OP.
Eloff
Para mí también funciona para subdirectorios, usando findmount de util-linux 2.23.
rudimeier
3

No lo he probado, pero df -Pdebería comportarse igual en la mayoría de las plataformas.

Esto funciona en Linux.

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

O dividiéndolo en funciones reutilizables:

# 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 ' '
}

Y llamando a la función:

get_fs $(get_mount .)

Podría reescribirse para ser un poco más rápido usando sedo awk, pero de esta manera probablemente sea más fácil de leer.

Si esto no funciona, puede intentar algo similar, pero utilizando en /etc/mtablugar de la salida de mount.

Mikel
fuente
El Pde df -Pes de POSIX, por lo que debe comportarse de la misma manera. Sin embargo, llegar desde la ruta del sistema de archivos al punto de montaje es más complicado.
Gilles 'SO- deja de ser malvado'
1
Su solución no parece ser segura si el directorio está montado con -o loop. Al menos en mi sistema, df muestra el dispositivo de bucle utilizado, pero mount muestra el archivo de imagen utilizado. Supongo que podría haber incluso más casos en que df no muestre el mismo dispositivo como mount. Tenga en cuenta esta cita de la página de manual de mount "El modo de listado se mantiene solo para compatibilidad con versiones anteriores. Para una salida más robusta y definible, use findmnt (8), especialmente en sus scripts".
rudimeier