Compruebe si la carpeta es un sistema de archivos remoto montado

44

¿Cuál es la mejor manera (confiable, portátil, etc.) de verificar si una carpeta determinada está en un sistema de archivos remoto montado (nfs) dentro de un script de shell?

Estoy buscando un comando que se vea así:

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

Respuestas:

34

Como Stephane dice "no hay una respuesta universal de Unix a eso".

La mejor solución que he encontrado para mi pregunta:

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

devolverá el tipo de sistema de archivos, por ejemplo: nfso ext3.

La -Topción no es estándar , por lo que puede no funcionar en otros sistemas Unix / Linux ...

Según el comentario de Gilles a continuación: "Esto funciona en cualquier Linux no incorporado, pero no en BusyBox, * BSD, etc."

Totor
fuente
1
Esto funciona en cualquier Linux no integrado, pero no en BusyBox, * BSD, etc. Depende de usted decidir si eso es lo suficientemente bueno.
Gilles 'SO- deja de ser malvado'
La visualización /etc/mtabo los resultados de en mountlugar de usar dfpodrían funcionar en algunos casos más.
TNW
1
@TNW o incluso/proc/mounts
laebshade
1
Aparentemente, ni mount, ni /etc/mtab, ni siquiera /proc/mountsson estándar, por lo que no hay garantía sobre lo que se puede encontrar allí ...
Totor
1
Esto no funciona en OSX 10.8 ya que -Ttiene un significado diferente aquí
DavAlPi
13

Podrías usar GNU stat.

%m para descubrir el punto de montaje.

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

%T (en modo de sistema de archivos) para averiguar el nombre del sistema de archivos.

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

Por lo tanto, sabe que /usr/src/linux, en mi sistema, está almacenado en un sistema de archivos que está montado /usr/srcy tiene el tipo de sistema de archivos reiserfs.

Consulte también man statpara más referencias. Es un comando muy versátil, útil casi siempre cuando necesita información sobre archivos y no desea volver a la grep | awkprotección.

Frostschutz
fuente
Mi versión de statno tiene la %mopción para --format(usando Debian Squeeze, coreutils 8.5). Entonces, supongo que esta solución no es muy confiable.
Totor
No lo creía, pero la diferencia entre coreutils 8.5 y 8.13 (debian wheezy) dice que tienes razón, sin embargo. Considéreme muy sorprendido :) apretar es demasiado viejo :( err, demasiado estable
frostschutz
1
a partir de los coreutils Cambios: 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. Eso fue hace casi 3 años. Es sorprendente que Debian todavía no tenga esto.
frostschutz
Incluso si Debian Squeeze se lanzó el 2011-02-06, se congeló el 2010-08-06, antes de que este cambio de coreutils ... Estoy buscando una solución "estándar" posible si es posible.
Totor
Bueno, podría usar el comando% T del sistema de archivos, si eso funciona en estadísticas antiguas. Si eso tampoco funciona y su versión de stat no proporciona la información que necesita, vuelva a las soluciones incómodas que es.
frostschutz
4

mount -ly use grep, sedo awkpara buscar la línea que hace referencia al directorio en cuestión.

jayhendren
fuente
Parece complicado darse cuenta de que en /my/path/to/the/directoryrealidad es algo desde el punto de montaje /my/pathcon su respuesta. Tal vez usted puede dar algunos detalles más sobre el grep, sed, awkcomandos sugieres (una respuesta completa) ?.
Totor
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'debería darle una lista de todos los puntos de montaje nfs en el sistema.
Andy Shulman
Esto se puede combinar con stat: el mount | fgrep "`stat --printf=" on %m type" /var/log/`". The comando mount` imprimirá todos los puntos de montaje, en <device> on <mountpoint> type <type>formato. Para entender esto, he stat --printfgenerado la on <mountpoint> typeparte.
MSalters
Hay muchos tipos de montaje de sistemas de archivos locales y remotos. tener un mapa de todos ellos puede ser un desafío. (por ejemplo, ¿drvfs es local o remoto?)
Erik Aronesty
Sí, pero la pregunta se refiere específicamente a nfs: "sistema de archivos remoto montado (nfs)"
jayhendren
2

Desafortunadamente, no hay una respuesta universal de Unix a eso.

Una cosa que puede hacer, para un archivo dado /a/b/c/des recorrer el camino:

  • /a B C/.
  • /a B C/..
  • /a B C/../..
  • ...

... y hacer un stat(2)en cada nivel, hasta que los st_devcambios. Entonces sabrás dónde está el punto de montaje. Luego puede buscar la ruta canónica de ese punto de montaje en /etc/mtabo en la salida de mountpara averiguar el tipo de sistema de archivos. Entonces descubrir qué es remoto y qué no será complicado, especialmente para los de tipo fusible. Por ejemplo, nfs, cifs, fuse.sshfs, fuse.davfsson evidentes, pero ¿qué pasa, por ejemplo, fuse.gvfs-fuse-daemono fuse.avfsdque pueden tener los dos archivos de la red y fuera de la red?

Stéphane Chazelas
fuente
Bueno, estoy usando nfs aquí (edité mi pregunta). En cuanto a stat(2), creo que te estás refiriendo a la función C, pero estoy usando shell. Sin embargo, se st_devrefiere a la identificación del dispositivo mayor y menor (¿es específico de Linux?), Y el comando de shell stat(1)tiene (no estándar) %ty %Tcon las --formatopciones para números mayores y menores respectivamente, pero siempre devuelve "0" (local y nfs ) Probé con Debian Squeeze y Lenny.
Totor
¿Estás intentando esto con o sin la --file-systemopción?
frostschutz
@frostschutz Sin. Tiene otro significado si se usa con --file-system.
Totor
2

El "-l" a df (1) fallará con un error en sistemas de archivos no locales, por lo que puede usar este comportamiento para saber si el sistema de archivos es remoto:

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

Sin embargo, la -lopción no es estándar .

rsone1
fuente
Esta no es una respuesta
Totor
@Totor ¿por qué no? De acuerdo, hay todo tipo de otras razones por las cuales dffallaría y eso solo hace que esta sea una respuesta no muy buena, pero está tratando de responder la pregunta, así que no veo por qué la llamarías "no una respuesta".
terdon
@terdon estoy de acuerdo. No leí con suficiente atención. Gracias por señalar esto. Lo editaré y votaré. :)
Totor
Este es básicamente el único que funciona de manera confiable en Linux.
Erik Aronesty
1

df /pathle dirá que /pathes un punto de montaje si dice que el punto de montaje no lo es /.

pgen
fuente
1
La pregunta se refiere a un punto de montaje remoto .
Totor
1

Solo haz

df /me/path/to/folder

Si el primer campo (el Sistema de archivos) está en el formato host: / ruta, entonces sabe que es NFS

Udi
fuente
0

Puede usar los df -tsistemas Linux y df -TBSD.

Del hombre df :

-t, --type = TYPE

limitar el listado a los sistemas de archivos de tipo TIPO

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi
codeforester
fuente
Bastante agradable. Sin embargo, y desafortunadamente, la -topción tiene un significado diferente en POSIX / SUS. Por lo tanto, el uso de esta opción puede proporcionar resultados inconsistentes en diferentes versiones de la herramienta / UNIX.
Totor
-2

Yo personalmente usaría mountpoint(¡muy portátil en Linux!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

o showmountque se requiere instalar en cualquier sistema que realmente monte recursos NFScompartidos (parte del nfs-commonpaquete):

NAME
       showmount - show mount information for an NFS server

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

Otra opción sería algo así como:

$ mount -l -t nfs | grep 'my mount point'
malat
fuente
1
La mountpointutilidad no le dice si el punto de montaje es remoto. Además, los sistemas de archivos remotos no se limitan a los sistemas de archivos NFS. Finalmente, mountpointno es estándar (no está en esta lista ).
Totor
Usted solicitó específicamente una herramienta en Linux y NFS, mountpointes estándar en este caso.
malat
Esto no responde mi primer punto de todos modos.
Totor
-3
find . -type d -name nfs -exec mountpoint {} \; | grep not

comprobará todas las carpetas llamadas 'nfs' si están montadas

Dmitry Sherman
fuente
OP no busca carpetas con nombre nfs.
codeforester