KVM etabliert sich als Standardlösung zur Virtualisierung unter Linux. Der ADMIN-Schwerpunkt hilft beim Bau virtueller Linux-Maschinen, stellt das ... (mehr)

Nur mit aktuellem Kernel

Stört die Last eines im Hintergrund laufendes »balance« zu sehr, lässt es sich abbrechen, für dieses Beispiel wäre ein »btrfs balance stop /mnt« zu verwenden. Es stellt sich heraus, dass alle Kommandos für »balance« außer »start« in Ubuntu 12.04 einen Fehler erzeugen. Um das zu beheben, müsste ein aktuellerer Kernel her. Neuere Kernel ab der Version 3.3 erlauben es dann auch, ein »balance« temporär anzuhalten und zu einem späteren Zeitpunkt wieder fortzusetzen oder auch, den aktuellen Fortschritt des Prozesses anzuzeigen. Ebenso ist ein unfreiwilliger Abbruch eines Balance-Vorganges, etwa durch einen Stromausfall, nicht kritisch, und die Aktion wird beim nächsten Mount des Dateisystems automatisch fortgeführt (ab Kernel 3.3 verhindert das die Mount-Option »skip_balance« ). Im praktischen Betrieb von Btrfs wird bei der Dimensionierung eines neuen Dateisystems der zusätzliche Platzbedarf für Metadaten Fall einkalkuliert werden müssen. Mit wie viel zu rechnen ist, wird wohl nur die Erfahrung zeigen können. Bekannt ist: Besonders hungrig auf Metadaten erweisen sich viele kleine Dateien, weil diese Daten direkt in den Metadaten-Bereichen abgelegt werden (auch leere Dateien). Außerdem sind Snapshots in dieser Hinsicht sehr anspruchsvoll.

Dateisystem im Dateisystem

Für das Management von Speicherplatz auf modernen Linux-Systemen ist LVM fixer Bestandteil im Portfolio vieler Systembetreuer geworden. Soll ein Unterverzeichnis in ein eigenes Dateisystem ausgelagert werden, sei es aus Sicherheits- oder aus rein organisatorischen Gründen, wird mit LVM ein eigenes Logical Volume erzeugt und darauf ein neues Dateisystem angelegt. Einen recht ähnlichen Mechanismus bietet Btrfs in der Form von »Subvolumes« , mit dem Unterschied: Hier entfällt das gesonderte Anlegen eines neuen Dateisystems.

Ein Subvolume verhält sich praktisch wie ein Verzeichnis. Es besitzt einen Namen und befindet sich irgendwo in einem schon bestehenden Pfad auf einem bereits bestehenden Volume.

Zum Start enthält jedes neue Btrfs-Dateisystem genau ein Subvolume, das sogenannte »Top-Level-Volume« mit der fixen Subvolume-ID 5. Dieses spezielle Subvolume wird auch standardmäßig beim Einhängen dieses Dateisystems verwendet. Praktisch verhält sich ein Subvolume wie ein vollwertiges eigenes Btrfs-Dateisystem, das sich aber seine Metadaten mit dem Top-Level-Volume teilt. Subvolumes können fast beliebig viele angelegt werden, das theoretische Limit liegt bei 264 256 Subvolumes pro Btrfs-Dateisystem.

Mit der Kommando-Gruppe »btrfs subvolume« können Subvolumes angelegt, gelöscht und aufgelistet werden. Sie sind auch an beliebiger Stelle im Verzeichnisbaum einzuhängen und können verschiedene Mount-Parameter verwenden (alle generischen und subvol,subvolid) (siehe Abbildung 5):

Abbildung 4: Balance kann nicht benötigte aber zugewiesene Chunks wieder freimachen. Ein btrfs fi df und ein btrfs fi show vor und nach dem Balance zeigen, dass die Metadaten Chunkgröße auf 256 MByte reduziert wurden und somit wieder 1,5 GByte (2 x 750MByte) mehr frei verfügbar sind.
Abbildung 5: Ein neues Subvolume mit dem Namen subvol_test wird angelegt. Ein btrfs sub list zeigt die ID, den Namen und die ID des zugehörigen Top-Level Volumes an. Eigentlich sollte 256 die erste verwendete ID sein, warum Btrfs hier 276 wählt, ist unklar.
btrfs subvolume create /mnt/subvol_test
btrfs sub list /mnt
mkdir /mnt2 && mount -t Btrfs -o subvol=subvol_test /dev/vdb /mnt2

Die Ausgabe von »df -h« errinnert an Bind-Mounts. Dementsprechend besteht ein Weg, herauszufinden, welches Subvolume an welcher Stelle eingehängt ist, auch darin, einen Blick in »/proc/self/mountinfo« zu werfen (siehe Abbildung 6). Ein Subvolume, das sich nicht auf oberster Ebene seines Eltern-Volumens befindet, muss über seine ID mittels der Mount-Option »subvolid=ID« eingehängt werden. Dabei ist ein nicht unwichtiges Detail: Für das Anlegen von Subvolumes reichen normale Benutzerrechte. Mittels einer speziellen Btrfs-Mount-Option des Eltern-Subvolumes ist auch das Löschen des Subvolumes erlaubt.

Abbildung 6: Ein grep nach btrfs in /proc/self/mountinfo zeigt direkt, welche Subvolumes wo eingehängt sind.
Abbildung 7: Ein Snapshot des Top-Level Volumes wird erzeugt und eine 3 GByte große Datei in ein Subvolume verschoben. Das ändert die Sicht der Dinge für du und df auf unterschiedliche Weise.

Wer unter LVM Logical Volumes zur Begrenzung des maximalen Platzverbrauches eines bestimmten Bereiches in der Ordnerstruktur eingesetzt hat, wird mit Btrfs noch länger keine Freude haben: Es gibt noch keine Möglichkeit, die maximale Größe eines Subvolumes festzulegen. Wann die sogenannten Subvolume Quota Gruppen (QGroups) verfügbar sein werden, ist noch offen, die entsprechenden Patches existieren bereits.

Individuelle Snapshots von Teilen eines Dateisystems sind wohl einer der Hauptgründe für den Einsatz von Subvolumes. Dabei handelt es sich bei Snapshots um zum Zeitpunkt der Erstellung eingefrorene Abbilder eines Subvolumes, wie man sie schon vom LVM kennt. Im Gegensatz zu normalen Subvolumes sind Snapshots also nicht leere Ordner, sondern mit den Daten des Quell-Subvolumes zum Zeitpunkt der Snapshot-Erzeugung befüllt. Dabei handelt es sich zu Beginn der Existenz eines Snapshots fast ausschließlich um Referenzen auf die Daten-Blöcke des Quell-Subvolumes.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019