Vérifier si le dossier est un système de fichiers distant monté

44

Quel est le meilleur moyen (fiable, portable, etc.) de vérifier si un dossier donné se trouve sur un système de fichiers monté à distance (nfs) dans un script shell?

Je cherche une commande qui ressemblerait à:

chk-remote-mountpoint /my/path/to/folder 
Totor
la source

Réponses:

34

Comme le dit Stéphane "Il n’ya pas de réponse Unix universelle à cela".

La meilleure solution que j'ai trouvée à ma question:

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

renverra le type de système de fichiers, par exemple: nfsou ext3.

L' -Toption n'est pas standard , donc elle pourrait ne pas fonctionner sur d'autres systèmes Unix / Linux ...

Selon le commentaire de Gilles ci-dessous: "Cela fonctionne sur tout Linux non embarqué, mais pas sur BusyBox, * BSD, etc."

Totor
la source
1
Cela fonctionne sur tout Linux non-embarqué, mais pas sur BusyBox, * BSD, etc. C'est à vous de décider si cela suffit.
Gilles 'SO- arrête d'être méchant'
Voir /etc/mtabou obtenir des résultats mountau lieu d'utiliser dfpourrait le faire dans certains cas.
TNW
1
@TNW ou même/proc/mounts
laebshade
1
Apparemment, ni mount, ni /etc/mtabmême pas /proc/mountssont standard alors il n'y a aucune garantie sur ce qui peut être trouvé là-bas ...
Totor
1
Cela ne fonctionne pas sur OSX 10.8 car ils -Tont un sens différent ici
DavAlPi
13

Vous pouvez utiliser GNU stat.

%m pour trouver le point de montage.

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

%T (en mode système de fichiers) pour trouver le nom du système de fichiers.

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

Ainsi, vous savez que /usr/src/linux, sur mon système, est stocké dans un système de fichiers sur lequel est monté le /usr/srctype de système de fichiers reiserfs.

Reportez-vous également à man statpour référence ultérieure. C'est une commande très polyvalente, utile presque toujours lorsque vous avez besoin d'informations sur les fichiers et que vous ne voulez pas revenir à la grep | awkprotection.

Frostschutz
la source
Ma version de statn'a pas l' %moption pour --format(utiliser Debian Squeeze, coreutils 8.5). Donc, je suppose que cette solution n’est pas très fiable.
Totor
Je n'y croyais pas, mais un diff entre Coreutils 8.5 et 8.13 (debian Wheezy) indique cependant que vous avez raison. Considérez-moi très surpris :) Squeeze est tout simplement trop vieux :( euh, trop stable
frostschutz
1
des coreutils changelog: 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. C'est il y a presque 3 ans. Incroyable que Debian n’ait toujours pas cela.
Frostschutz
Même si Debian Squeeze a été publié le 2011-02-06, il a été gelé le 2010-08-06, avant le changement de coreutils ... Je recherche plutôt une solution "standard" possible si possible.
Totor
Eh bien, vous pouvez simplement utiliser la commande% T du système de fichiers, si cela fonctionne dans les anciennes statistiques. Si cela ne fonctionne pas non plus et que votre version de stat ne fournit pas les informations dont vous avez besoin, revenez aux solutions peu pratiques.
Frostschutz
4

mount -let utilisez grep, sedou awkpour trouver la ligne qui fait référence au répertoire en question.

Jayhendren
la source
Il semble compliqué de comprendre que votre réponse répond en /my/path/to/the/directoryréalité à quelque chose du point de montage /my/path. Peut - être que vous pouvez donner quelques détails sur la grep, sed, awkvous proposez des commandes (une réponse complète) ?.
Totor
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'devrait vous donner une liste de tous les points de montage nfs du système.
Andy Shulman
Ceci peut être combiné avec la mount | fgrep "`stat --printf=" on %m type" /var/log/`". The commande stat: mount` imprimera tous les points de montage, au <device> on <mountpoint> type <type>format. Pour cela, j'ai stat --printfgénérer la on <mountpoint> typepièce.
MSalters
Il existe de nombreux types de montage de systèmes de fichiers locaux et distants. avoir une carte de tous peut être difficile. (par exemple, drvfs est-il local ou distant?)
Erik Aronesty
Oui, mais la question concerne spécifiquement nfs: "système de fichiers monté à distance (nfs)"
jayhendren
2

Malheureusement, il n'y a pas de réponse Unix universelle à cela.

Une chose que vous pouvez faire, pour un fichier donné, /a/b/c/dest de suivre le chemin:

  • /abc/.
  • /abc/..
  • /abc/../..
  • ...

... et faire un stat(2)à chaque niveau, jusqu'à ce que les st_devchangements. Ensuite, vous saurez où se trouve le point de montage. Ensuite, vous pouvez rechercher le chemin canonique de ce point de montage dans /etc/mtabou dans la sortie de mountpour connaître le type de système de fichiers. Trouver ensuite ce qui est à distance et ce qui ne l’est pas va être difficile, surtout pour les fusibles. Par exemple, nfs, cifs, fuse.sshfs, fuse.davfssont évidents, mais qu'en est- par exemple fuse.gvfs-fuse-daemonou fuse.avfsdqui peut avoir à la fois le réseau et les fichiers non-réseau?

Stéphane Chazelas
la source
Eh bien, j'utilise nfs ici (modifié ma question). En ce qui concerne stat(2), je pense que vous faites référence à la fonction C, mais j'utilise shell. Cependant, st_devfait référence aux ID de périphérique majeur et mineur (est-ce spécifique à Linux?), Et la commande shell stat(1)a (non standard) %tet %Tavec les --formatoptions pour les nombres respectivement majeur et mineur, mais renvoie toujours "0" (local et nfs ). J'ai essayé sur Debian Squeeze et Lenny.
Totor
Est-ce que vous essayez cela avec ou sans l' --file-systemoption?
Frostschutz
@frostschutz Sans. Il a une autre signification si utilisé avec --file-system.
Totor
2

Le "-l" à df (1) échouera avec une erreur sur les systèmes de fichiers non locaux, vous pouvez donc utiliser ce comportement pour savoir si le système de fichiers est distant:

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

Cependant, l' -loption n'est pas standard .

rsone1
la source
Ce n'est pas une réponse
Totor
@Totor pourquoi pas? Certes, il y a toutes sortes d'autres raisons pour lesquelles dféchoueraient et cela seul en fait une réponse pas très bonne, mais il s'agit d'essayer de répondre à la question, donc je ne vois pas pourquoi vous appelleriez cela "pas une réponse".
terdon
@terdon je suis d'accord. Je n'ai pas lu assez attentivement. Merci de l'avoir signalé. Je vais éditer et voter. :)
Totor
C’est fondamentalement le seul qui fonctionne de manière fiable sur linux.
Erik Aronesty
1

df /pathvous dira que /pathc'est un point de montage s'il indique que le point de montage ne l'est pas /.

pgen
la source
1
La question fait référence à un point de montage distant .
Totor
1

Il suffit de faire

df /me/path/to/folder

Si le premier champ (le système de fichiers) est au format hôte: / chemin, alors vous savez qu'il s'agit de NFS

Udi
la source
0

Vous pouvez utiliser le df -tsur les systèmes Linux et df -TBSD.

De l' homme df :

-t, --type = TYPE

limiter la liste aux systèmes de fichiers de type TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi
codeforester
la source
Pas mal. Cependant, et malheureusement, l' -toption a une signification différente dans POSIX / SUS. L'utilisation de cette option peut donc générer des résultats incohérents dans différentes versions de l'outil / UNIX.
Totor
-2

Je voudrais personnellement utiliser mountpoint(très portable sur Linux!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

ou showmountqui doit être installé sur tout système qui monte réellement des NFSpartages (une partie du nfs-commonpaquet):

NAME
       showmount - show mount information for an NFS server

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

Une autre option serait quelque chose comme:

$ mount -l -t nfs | grep 'my mount point'
malat
la source
1
L' mountpointutilitaire ne vous dit pas si le point de montage est distant. De plus, les systèmes de fichiers distants ne se limitent pas aux systèmes de fichiers NFS. Enfin, mountpointn'est pas standard (pas dans cette liste ).
Totor
vous avez spécifiquement demandé un outil sur Linux et NFS, mountpointest standard dans ce cas.
Malat
Cela ne répond quand même pas à mon premier point.
Totor
-3
find . -type d -name nfs -exec mountpoint {} \; | grep not

vérifiera tous les dossiers nommés 'nfs' s'ils sont montés

Dmitry Sherman
la source
OP ne recherche pas les dossiers nommés nfs.
Codeforester