Comment puis-je déterminer le type fs de mon répertoire de travail actuel?

19

J'ai besoin d'un moyen indépendant de la plate-forme et léger de détecter le type de montage de mon CWD. Plus précisément, je dois déterminer si mon CWD se trouve dans un montage SSHFS, NFS, CIFS, SMB ou un magasin de blocs local.

Je dois le faire sur Mac OSX 10.6, 10.7 et RHEL5 (au minimum).

Il existe une possibilité d'utiliser df, mais df se comporte très différemment sur ces deux plates-formes. De plus, je devrais gratter sa sortie CLI avec awk, qui tout en étant réalisable est ... fragile.

Ces informations doivent être disponibles à un certain niveau. Existe-t-il un outil que je ne connais pas qui pourrait me fournir ces informations?

Chris R
la source

Réponses:

17

Le type de système de fichiers n'est pas quelque chose auquel vous pouvez facilement accéder de manière indépendante du système d'exploitation. Les noms de type de système de fichiers dépendent du système d'exploitation, il n'y a donc pas eu d'incitation à établir une méthode standard.

Sur les systèmes Linux non intégrés, stat -f -c %T .affiche le type de système de fichiers du répertoire actuel. La statcommande OSX n'a rien de tel.

Puisque tout ce que vous voulez savoir, c'est si le type de système de fichiers se trouve dans une liste finie, sous Linux, vous pouvez limiter à la fois l'ensemble des chemins pour imprimer les informations et l'ensemble des types de système de fichiers. Vous obtiendrez une erreur («df: aucun système de fichiers traité») si le type de système de fichiers du répertoire actuel ne figure pas dans la liste.

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

La même syntaxe peut fonctionner ou non sur OSX; si ce n'est pas le cas, essayez df -T sshfs,nfs,cifs ..

Gilles 'SO- arrête d'être méchant'
la source
C'est exactement ce dont j'avais besoin. Gilles tu es génial!
ARX
7

Vous pouvez utiliser GNU stat sur Linux:

stat --file-system --format=%T /tmp/subdir/whatever
tmpfs
Eloff
la source
C'est génial car cela fonctionne sur les sous-répertoires. Merci!
Avindra Goolcharan
4

Sous Linux, findmnt est disponible depuis util-linux 2.18.

findmnt -n -o FSTYPE -T /home
nfs4
rudimeier
la source
Ne fonctionne pas pour / home / subdir, donc cela n'aiderait pas l'OP.
Eloff
Pour moi, cela fonctionne aussi pour les sous-répertoires, en utilisant findmount à partir d'util-linux 2.23.
rudimeier
3

Je ne l'ai pas testé, mais df -Pdevrait se comporter de la même manière sur la plupart des plateformes.

Cela fonctionne sous Linux.

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

Ou le décomposer en fonctions réutilisables:

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

Et en appelant la fonction:

get_fs $(get_mount .)

Pourrait être réécrit pour être légèrement plus rapide en utilisant sedou awk, mais cette façon est probablement plus facile à lire.

Si cela ne fonctionne pas, vous pouvez essayer quelque chose de similaire, mais en utilisant /etc/mtabplutôt que la sortie de mount.

Mikel
la source
Le Pen df -Pest pour Posix, il doit se comporter de la même manière. Cependant, passer du chemin du système de fichiers au point de montage est plus compliqué.
Gilles 'SO- arrête d'être méchant'
1
Votre solution ne semble pas sûre si le répertoire est monté avec la boucle -o. Au moins sur mon système, df affiche le périphérique de boucle utilisé, mais mount affiche le fichier image utilisé. Je suppose qu'il pourrait y avoir encore plus de cas où df n'affiche pas le même périphérique que le montage. Notez cette citation de la page de manuel de mount "Le mode de listage est maintenu pour la compatibilité descendante uniquement. Pour une sortie plus robuste et définissable, utilisez findmnt (8), en particulier dans vos scripts."
rudimeier