Wie kann ich den fs-Typ meines aktuellen Arbeitsverzeichnisses ermitteln?

19

Ich benötige eine plattformunabhängige und einfache Methode zum Erkennen des Mount-Typs meines CWD. Insbesondere muss festgestellt werden, ob sich mein CWD in einem SSHFS-, NFS-, CIFS-, SMB- oder lokalen Blockspeicher-Mount befindet.

Ich muss dies unter Mac OSX 10.6, 10.7 und RHEL5 (mindestens) tun.

Es gibt eine Möglichkeit, df zu verwenden, aber auf diesen beiden Plattformen verhält sich df ganz anders. Außerdem müsste ich die Ausgabe von CLI mit awk abkratzen, was zwar funktionsfähig, aber ... zerbrechlich ist.

Diese Informationen müssen auf einer bestimmten Ebene verfügbar sein. Gibt es ein Tool, das mir nicht bekannt ist und das mir diese Informationen liefern kann?

Chris R
quelle

Antworten:

17

Auf den Dateisystemtyp kann nicht einfach und unabhängig vom Betriebssystem zugegriffen werden. Namen von Dateisystemtypen sind vom Betriebssystem abhängig, daher gab es keinen Anreiz, eine Standardmethode zu etablieren.

stat -f -c %T .Zeigt auf nicht eingebetteten Linux-Systemen den Dateisystemtyp des aktuellen Verzeichnisses an. Der OSX- statBefehl hat so etwas nicht.

Da Sie nur wissen möchten, ob der Dateisystemtyp in einer endlichen Liste enthalten ist, können Sie unter Linux sowohl die Anzahl der zu druckenden Pfade als auch die Anzahl der Dateisystemtypen einschränken. Sie erhalten eine Fehlermeldung ("df: keine Dateisysteme verarbeitet"), wenn der Dateisystemtyp des aktuellen Verzeichnisses nicht in der Liste enthalten ist.

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

Dieselbe Syntax kann unter OSX verwendet werden oder auch nicht. Wenn nicht, versuchen Sie es df -T sshfs,nfs,cifs ..

Gilles 'SO - hör auf böse zu sein'
quelle
Genau das habe ich gebraucht. Gilles, du bist großartig!
ARX
7

Sie können GNU stat unter Linux verwenden:

stat --file-system --format=%T /tmp/subdir/whatever
tmpfs
Eloff
quelle
Das ist großartig, weil es in Unterverzeichnissen funktioniert. Vielen Dank!
Avindra Goolcharan
4

Unter Linux gibt es findmnt seit Util-Linux 2.18.

findmnt -n -o FSTYPE -T /home
nfs4
rudimeier
quelle
Funktioniert nicht für / home / subdir, daher würde es dem OP nicht helfen.
Eloff
Für mich funktioniert es auch mit subdirs, wobei findmount von util-linux 2.23 verwendet wird.
Rudimeier
3

Habe es nicht getestet, df -Psollte sich aber auf den meisten Plattformen gleich verhalten.

Dies funktioniert unter Linux.

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

Oder brechen Sie es in wiederverwendbare Funktionen:

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

Und die Funktion aufrufen:

get_fs $(get_mount .)

Könnte mit sedoder etwas schneller geschrieben werden awk, aber dieser Weg ist wahrscheinlich einfacher zu lesen.

Wenn dies nicht funktioniert, können Sie etwas Ähnliches ausprobieren, aber /etc/mtabstatt dessen die Ausgabe von verwenden mount.

Mikel
quelle
Die Pin df -Pist für POSIX, so dass es auf die gleiche Art und Weise verhalten soll. Es ist jedoch komplizierter, vom Dateisystempfad zum Einhängepunkt zu gelangen.
Gilles 'SO- hör auf, böse zu sein'
1
Ihre Lösung scheint nicht sicher zu sein, wenn das Verzeichnis mit -o loop gemountet ist. Zumindest auf meinem System zeigt df das verwendete Loop-Gerät, aber mount zeigt die verwendete Image-Datei. Ich vermute, dass es noch mehr Fälle geben könnte, in denen df nicht dasselbe Gerät wie mount anzeigt. Notieren Sie sich dieses Zitat aus der Manpage von mount. "Der Listungsmodus wird nur aus Gründen der Abwärtskompatibilität beibehalten. Für eine robustere und besser definierbare Ausgabe verwenden Sie findmnt (8), insbesondere in Ihren Skripten."
Rudimeier