2014-09-18 4 views
5

Wie kann ich im bash-Scripting elegant prüfen, ob ein bestimmter Ort ein btrfs-Subvolumen ist?Wie testet man, ob der Ort ein btrfs Subvolumen ist?

Ich möchte nicht wissen, ob der angegebene Speicherort in ein Btrfs-Dateisystem (oder Sub-Volume) ist. Ich möchte wissen, ob der angegebene Standort der Kopf ein Subvolumen ist.

Idealerweise könnte die Lösung in einer Bash-Funktion geschrieben werden, so könnte ich schreiben:

if is_btrfs_subvolume $LOCATION; then 
    # ... stuff ... 
fi 

Eine 'elegant' Lösung wäre lesbar, klein in Code, klein in dem Ressourcenverbrauch.

Antwort

3

Solution1: Mit @kdave Vorschläge:

is_btrfs_subvolume() { 
    local dir=$1 
    [ "$(stat -f --format="%T" "$dir")" == "btrfs" ] || return 1 
    inode="$(stat --format="%i" "$dir")" 
    case "$inode" in 
     2|256) 
      return 0;; 
     *) 
      return 1;; 
    esac 
} 

Solution2: Was ich vor verwendet (nur ein Anruf, aber wahrscheinlich spröde):

is_btrfs_subvolume() { 
    btrfs subvolume show "$1" >/dev/null 2>&1 
} 

EDIT: Korrigierte und ersetzte list durch show, da das Verhalten von list nicht entsprechend antworten würde in jedem normalen Verzeichnis btrfs.

EDIT2: als @kdave keine Vollversion seiner übergeordneten Antwort posten, fügte ich es meiner Antwort hinzu.

+1

prüft wird Diese Funktion wird nicht gearbeitet. Für meinen Fall ist $ 1 ein beliebiges Verzeichnis, das in einer Btrfs-Partition vorhanden ist. Es wird immer alle Subvolume-Listen in dieser Partition zurückgegeben, obwohl $ 1 nur ein normales Verzeichnis ist. Wenn das aktuelle Verzeichnis ein Subvolume ist, wird dieses Verzeichnis als letzte Zeile der Liste aufgeführt, andernfalls nicht. Ich weiß nicht, wie ich die Antwort abtun soll ... – zw963

+0

Oh, ja, guter Fang. Entschuldigung, ich habe 'Liste' durch 'Zeige' ersetzt. Funktioniert es jetzt so wie es sollte? – vaab

+0

Sie sollten Ihr Skript als root ausführen. – ceremcem

9

Die Subvolume wird von Inode-Nummer 256, identifiziert, so können Sie es einfach überprüfen, indem

if [ `stat --format=%i /path` -eq 256 ]; then ...; fi 

Es gibt auch eine so genannte Leer Subvolume, dh. Wenn ein verschachtelter Unterdatenträger als Momentaufnahme erstellt wird, wird diese Entität anstelle des ursprünglichen Unterdatenträgers vorhanden sein. Seine Inode-Nummer 2.

Für eine im Allgemeinen zuverlässige Überprüfung ist wheter jedes Verzeichnis ein Teilvolumen ist, sollte der Dateisystem-Typ als auch

stat -f --format=%T /path 
+0

All dies scheint zu kompliziert im Vergleich zu der derzeit zur Verfügung gestellten Lösung, und spröde, wenn irgendeine neue Inode - Nummer verwendet wird, nicht wahr? Wie auch immer, ich mag die zusätzlichen peripheren Informationen, die Sie zur Verfügung gestellt haben, es könnte tatsächlich eine gute Lösung sein, die sich nicht so weit versteckt. – vaab

+2

Der Befehl "btrfs subvolume list" benötigt root-Berechtigungen, da er ein privilegiertes ioctl verwendet, um die Informationen über Subvolumes zu lesen, was in der ursprünglichen Antwort nicht erwähnt wurde. Der Inode-Nummer-basierte Test hat keine solche Beschränkung. Als nächstes verstehe ich nicht, was meinst du mit "spröde, wenn irgendeine neue Inode-Nummer verwendet wird". Jedes Subvolumen hat eine Inode Nummer 256, dies wird sich nicht ändern. Reguläre Dateien und Verzeichnisse in einem Sub-Volume haben Inode-Nummer 257 und höher. – kdave

+0

Sie haben Recht. Ihre Antwort ist nett und vermisst nur die bash Funktion Implementierung (die ursprünglich gefragt wurde) und es wäre auch eine schöne TLDR Zusammenfassung des Tests. – vaab