Zum Inhalt springen

Btrfs/Subvolumes

Aus Foxwiki

Subvolumes

Grundlagen

Ein Subvolume ist eine zusätzliche interne Dateisystemwurzel, die separat eingehängt werden kann

  • Aus Anwendungssicht erscheinen Subvolumes wie Verzeichnisse
  • Alle unterhalb eines eingehängten Subvolumes vorhandenen Subvolumes erscheinen gleichfalls als eingehängt
  • Bei der Nutzung von Subvolumes sind grundsätzlich zwei Vorgehensweisen denkbar: ein „flaches“ (flat) und ein „verschachteltes“ (nested) Layout

Subvolumes sind die Grundlage für Snapshots und Quotas

Flaches Layout

Beim flachen Layout wird die Dateisystemwurzel an sich nicht eingehängt, dafür aber die einzelnen Subvolumes

  • Es hat sich als Namenskonvention herausgebildet, die Namen solcher Subvolumes mit einem Klammeraffen beginnen zu lassen
toplevel (Dateisystemwurzel, wird nicht eingehängt)
+-- @root (Subvolume, das als Wurzelverzeichnis / eingehängt wird)
+-- @home (Subvolume, das als /home eingehängt wird)
+-- @topsecret (Subvolume, das nicht eingehängt wird)
+-- var (normales Verzeichnis)
+-- @lib (Subvolume, das unter /var/lib eingehängt wird)
+-- @www (Subvolume, das unter /var/www eingehängt wird)

Im Beispiel wird die Verzeichnisstruktur näherungsweise durch Einfügen des Verzeichnisses /var nachgebildet

  • Technisch ist dies nicht erforderlich

In der /etc/fstab wird der Verzeichnisbaum folgendermaßen zusammengebaut:

UUID=… / btrfs defaults,subvol=@root 0 0
UUID=… /home btrfs defaults,subvol=@home 0 0
UUID=… /var/lib btrfs defaults,subvol=/var/@lib 0 0
UUID=… /var/www btrfs defaults,subvol=/var/@www 0 0

Alles, was sich außerhalb/oberhalb der eingehängten Subvolumes befindet, ist aus Anwendersicht nicht vorhanden

  • Da das Subvolume @topsecret nicht explizit eingehängt wird und die Dateisystemwurzel auch nicht, kann auf Daten in @topsecret nicht zugegriffen werden

Anstelle des über subvol angegebenen Pfads des Subvolumes kann man auch dessen ID über subvolid angeben

  • Die ID eines Subvolume kann über btrfs subvolume list oder btrfs subvolume show ermittelt werden
  • Die Angabe der ID ist kompakter und unempfindlich gegen das Verschieben des Subvolumes im Dateisystem, dafür ist die fstab weniger „sprechend“

Verschachteltes Layout

Beim verschachtelten Layout wird die Dateisystemwurzel eingehängt

  • Damit werden auch automatisch alle Subvolumes eingehängt und erscheinen als Verzeichnisse
toplevel (Dateisystemwurzel, wird als / eingehängt)
+-- home (Subvolume, wird nicht explizit eingehängt, erscheint automatisch als Verzeichnis /home)
+-- topsecret (Subvolume, wird nicht explizit eingehängt, erscheint automatisch als Verzeichnis /topsecret)
+-- var (normales Verzeichnis)
+-- lib (Subvolume, wird nicht explizit eingehängt, erscheint automatisch als Verzeichnis /var/lib)
+-- www (Subvolume, wird nicht explizit eingehängt, erscheint automatisch als Verzeichnis /var/www)

Die fstab umfasst nur eine Zeile:

UUID=… / btrfs defaults 0 0

Wenn kein Subvolume angegeben wird, wird das als Default festgelegte Volume gemountet

  • Das ist im Regelfall die Dateisystemwurzel (das „top-level subvolume“); über btrfs subvolume set-default kann dieses geändert werden

Subvolumes verwalten

Subvolumes lassen sich über btrfs subvolume verwalten

  • Die wichtigsten Befehle sind
  • btrfs subvolume create: erzeuge ein Subvolume am angegebenen Ort
  • btrfs subvolume delete: lösche das angegebene Subvolume
  • btrfs subvolume list: zeige alle Subvolumes unterhalb des angegebenen Ortes
  • btrfs subvolume show: zeige Details des angegebenen Subvolumes
  • btrfs subvolume snapshot: erzeuge einen Snapshot des angegebenen Subvolumes
root@demo:~# btrfs subvolume create subvol1
Create subvolume './subvol1'
root@demo:~# btrfs subvolume create subvol2
Create subvolume './subvol2'
root@demo:~# btrfs subvolume list
ID 263 gen 3526 top level 5 path root/subvol1
ID 264 gen 3527 top level 5 path root/subvol2

Hier werden die eindeutigen numerischen IDs der Subvolumes angezeigt

  • Das „top-level subvolume“, also die Wurzel eines btrfs-Dateisystems, hat immer die ID 5
root@demo:~# btrfs subvolume delete subvol2
Delete subvolume (no-commit): '/root/subvol2'
root@demo:~# btrfs subvolume list
ID 263 gen 3526 top level 5 path root/subvol1

Jetzt hängen wir das verbliebene Subvolume ein und wieder aus:

root@demo:~# mkdir /mnt/subvol1
root@demo:~# mount -t btrfs -o subvol=/root/subvol1 /dev/sda1 /mnt/subvol1/
root@demo:~# touch subvol1/test
root@demo:~# ls /mnt/subvol1/
test
root@demo:~# umount /mnt/subvol1/
root@demo:~# rmdir /mnt/subvol1/
root@demo:~# ls subvol1/
test

Und nun löschen wir das verbliebene Subvolume:

root@demo:~# btrfs subvolume delete subvol1
Delete subvolume (no-commit): '/root/subvol1'
root@demo:~# btrfs subvolume list
root@demo:~# ls subvol1/
ls: Zugriff auf 'subvol1/' nicht möglich: Datei oder Verzeichnis nicht gefunden

Verzeichnisse in Subvolume umwandeln

Es gibt keinen Befehl, um ein Verzeichnis in ein Subvolume umzuwandeln

  • Man muss von Hand
  1. das Verzeichnis umbenennen,
  2. ein Subvolume mit dem ursprünglichen Namen des Verzeichnisses neu erzeugen,
  3. den Inhalt des Verzeichnisses in das Subvolume verschieben und
  4. das Verzeichnis löschen