Wie kann man herausfinden, ob ein Pfad der Stamm eines ZFS-Dataset-Mountpunkts ist?

5

Ich möchte herausfinden, ob ein beliebiger Pfad die Wurzel eines ZFS-Mountpunkts für die Auswertung in einem (Python-) Skript ist (daher wird der Rückkehrcode eines Befehls dem Parsen der Ausgabe vorgezogen). Das btrfs-Äquivalent ist btrfs subvolume show [path] die 0 oder 1 zurückgibt, ist der Pfad die Wurzel eines BTRFS-Subvolumes oder nicht.

Afaik würde ich verwenden zfs list und analysiere es, aber vielleicht gibt es einen eleganteren Weg.

Ich verwende ZFS 0.6.5.8 unter Ubuntu 16.10 mit Linux 4.8.0.

Karl Richter
quelle

Antworten:

3

Derzeit nur gemountete Dateisysteme

Wenn Sie bereit sind, sich darauf zu beschränken derzeit montiert ZFS-Dateisysteme können Sie analysieren /proc/mounts und benötigen keine besonderen ZFS-Kenntnisse (es sei denn, Sie möchten sich ausdrücklich auf ZFS-Dateisysteme beschränken).

Dies funktioniert möglicherweise nicht auf Linux-Systemen.

/ proc / mounts ist im Grunde genommen / etc / mtab, wird aber vom Kernel verwaltet. Es enthält eine Liste der Dateisystem-Sicherungsgeräte, Bereitstellungspfade, Dateisystemtypen und Dateisystemflags.

Um beispielsweise die Mount-Punkte aller gemounteten ZFS-Dateisysteme aufzulisten, können Sie Folgendes tun

$ awk '$3 == "zfs" { print $2 }' < /proc/mounts

So überprüfen Sie, ob ein bestimmtes Verzeichnis einem Bereitstellungspunkt für ein bereitgestelltes ZFS-Dateisystem entspricht:

$ awk '$3 == "zfs" && $2 == "/some/particular/absolute/path" { print "yes" }' < /proc/mounts

Um alle Dateisysteme (nicht nur ZFS) zuzulassen, entfernen Sie einfach das $3 == "zfs" prüfen.

Montiert oder nicht gemountete ZFS-Dateisysteme

Wenn Sie nicht gemountete Dateisysteme in aktuell importierte Pools aufnehmen müssen, müssen Sie verwenden zfs get So rufen Sie eine Liste aller ZFS-Mountpunkte in aktuell importierten Pools ab:

$ sudo zfs list -pH -o mountpoint | grep -q '^/some/particular/absolute/path$' && echo yes

wird gedruckt yes wenn ein Dateisystem mit einem Einhängepunkt von /some/particular/absolute/path ist in einem Pool vorhanden, der gerade importiert wird, unabhängig davon, ob dieses Dateisystem gerade eingehängt ist.

Dateisysteme für exportierte Pools

Mir ist keine Möglichkeit bekannt, Dateisysteme in exportierten Pools aufzulisten, ohne über Out-of-Band-Kenntnisse der Dateisysteme in den betreffenden Pools zu verfügen. Daher glaube ich nicht, dass diese Kombination möglich ist.

Abschlussnotizen

Überlegen Sie immer, ob es ein Dienstprogramm gibt, das das tut, was Sie wollen. Zum Beispiel, dfAls Nebeneffekt wird die Liste der aktuell gemounteten Dateisysteme und ihrer Sicherungsgeräte gedruckt, und es ist zu erwarten, dass sie nicht an Kernelmagie beteiligt sind (nur über Schnittstellen, die für den öffentlichen Gebrauch bestimmt sind). strace df 2>&1 | less In diesem Fall ist dies ein guter Anfang, um zu sehen, wie Sie die gewünschten Informationen finden können.

a CVn
quelle
2

Sie können verwenden zfs get um ausgewählte Eigenschaften anzuzeigen, z mountpoint.

# zfs get -pH -o value mountpoint rpool/swap

Erläuterung:

  • -p Erzeugt eine syntaktisch analysierbare Ausgabe mit Tabulatoren als Trennzeichen
  • -H Lässt Überschriften aus
  • -o name,property,value,source Zeigt die vier Spalten oder eine Variation davon an

Sie erhalten entweder den Pfad, der als Einhängepunkt festgelegt ist (in den meisten Fällen ist dies der Fall / plus Name des Datensatzes (1), dieser kann jedoch unterschiedlich sein (2)), - wenn kein Einhängepunkt gesetzt ist (3), oder Erbe (4). Sie können dann verwenden grep differenzieren:

# zfs get -pH -o value mountpoint rpool
/rpool
# zfs get -pH -o value mountpoint rpool/export/home
/export/home
# zfs get -pH -o value mountpoint rpool/swap
-
# zfs get -pH -o value mountpoint rpool/ROOT
legacy
user121391
quelle