Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
BTRFS
BTRFS ist ein modernes Copy-on-Write-Dateisystem (COW) für Linux, das auf die Implementierung erweiterter Funktionen abzielt und gleichzeitig den Schwerpunkt auf Fehlertoleranz, Reparatur und einfache Verwaltung legt. Seine Hauptfunktionen und Vorteile sind:
- Snapshots, die keine vollständige Kopie der Dateien erstellen
- Integriertes Volume-Management, Unterstützung für softwarebasiertes RAID 0, RAID 1, RAID 10 und andere
- Selbstheilung – Prüfsummen für Daten und Metadaten, automatische Erkennung stiller Datenbeschädigungen
Dateisystem Erstellung
Ein BTRFS Dateisystem wird mit mkfs.btrfs erstellt. Die häufigsten Optionen die bei der Erstellung des Dateisystems mit angeben werden sind:
- -L Um dem Dateisystem ein Label zu geben
- --csum Um dem gewünschten checksum Algorithmus auszuwählen (Standard ist crc32c). Dies lässt sich nachträglich nicht mehr ändern!
- -O Um nicht benötigte Funktionen wie z.b. die
raid56
oderquota
an/abzuschalten. Für eine Vollständige Liste siehe auch-O list-all
Beispielbefehl
Dieser Befehl gibt dem Dateisystem einen Namen, verwendet den xxhash
Algorithmus für Checksummen und deaktiviert die Funktionen raid56
und quota
:
# mkfs.btrfs -L "Label-Name" --csum xxhash -O ^raid56,^quota
Subvolumen
Ein BTRFS-Subvolumen ist ein Teil eines Dateisystems mit einer eigenen, unabhängigen Datei-/Verzeichnishierarchie und einem Inode-Nummern-Namespace. Subvolumen können Dateibereiche gemeinsam nutzen.
Hinweis: Subvolumen können verwendet werden, um bei der Erstellung eines Snapshots dieses Subvolumen auszulassen. Da immer nur das angebe, Subvolumen von einem Snapshot betroffen ist und andere Subvolumen nicht mit gesichert werden.
Für weitere Informationen siehe:
- Suletuxe Forum Eintrag (Einfachere sinnbildliche Beschreibung eines Subvolumen)
Subvolumen Erstellung
Dieser Befehl geht davon aus, dass man sich im Root Verzeichnis seines Btrfs Dateisystems (Subvolume ID 5) befindet. Und legt gleich mehrere Subvolumen auf einmal an. @ für das Betriebssystem Wurzel Verzeichnis, @home für das /home
Verzeichnis @cache für /var/cache
und @.snapshots für spätere Snapshots Ablage unter /.snapshots
.
# btrfs subvolume create @ @home @cache @.snapshots
Optionales @log Subvolumen
Für spätere forensische Untersuchungen der Logs, könnte man das Verzeichnis /var/log
in einem eigenen Subvolumen @log auslagern, damit bei einem Rollback des @ Subvolumes die Logs erhalten bleiben.
Die Auslagerung des /var/log
Verzeichnisses in ein separates beschreibbaren Subvolumen ist eine Voraussetzung, falls man vorhat in einem Readonly Snapshots seines @ Subvolumen zu booten.
Subvolumes Mounten
Es folgt ein Beispiel Mount Befehl, um ein angelegtes Subvolumen direkt zu mounten. Die wichtige Mount Option ist hierbei subvol=
womit das gewünschte Subvolumen angeben wird. Andere beliebte Mount Optionen sind noatime,compress=zstd,discard
# mount -t btrfs -o noatime,subvol=@ /dev/sdX /mnt/
Beispiel fstab Eintrag
Es folgt ein umfangreicher Beispiel fstab Eintrag:
UUID=c6757eef-ba72-4038-847f-a2ef19cf9c52 / btrfs rw,noatime,compress=zstd:3,ssd,space_cache=v2,subvol=/@ 0 0
Snapshots
Ein Snapshot ist ebenfalls ein Subvolumen, jedoch mit einem vorgegebenen Anfangsinhalt des ursprünglichen Subvolumen. Ein Subvolumen hat immer die Inode-Nummer 256. Somit kann ein Snapshot wie eine schnelle Art von Referenzierung mit dem Inhalt eines anderen Subvolumen betrachtet werden, das sich nicht mit ändert.
Hinweis: Subvolumen können verwendet werden, um bei der Erstellung eines Snapshots dieses Verzeichnis (Subvolumen) auszulassen. Da immer nur das Angebe Subvolumen von einem Snapshot betroffen ist und andere Subvolumen nicht mit gesichert werden.
Snapshot Anlegen
Ein Snapshot wird so angelegt:
- -r legt ein Readonly Snapshot an.
btrfs subvolume snapshot [-r] <subvolume> <Speicherort des Snapshots>
Siehe auch
Snapshot Automation
Das Anlegen von eines Snapshots lässt sich mithilfe verschiederner Tools automatisieren. Eins davon ist yabsnap. Für eine Erläuterung siehe dazu:
chroot Hinweis
Es ist meist nicht gewollt, aus dem Wurzelverzeichnis (ID 5) in ein Subvolume zu chrooten. Angenommen die Dateisystem Wurzel ist unter /mnt/btrfs
gemountet und hier liegt ein Subvolume @ (/mnt/btrfs/@
):
Dann möchte man nicht:
chroot /mnt/btrfs/@
sondern vielmehr in das gemountet Subvolumen chrooten:
mount --mkdir -t btrfs -o noatime,subvol=@ /dev/sdX /mnt/btrfs-@/ chroot /mnt/btrfs-@/
Swapdatei
Wenn eine Swapdatei verwendet werden soll gibt es ein paar Dinge zu beachten:
- Das Subvolumen worin sich eine Swapdatei befindet, kann kein Snapshot für angelegt werden. Daher ist es ratsam die Swapdatei alleine für sich in ein eigenes Subvolume z.B.
@swap
anzulegen. Und diese z.b. unter/swap/
zu mounten. - Für die Swapdatei muss COW deaktiviert sein. COW lässt sich anfänglich nur für leere Dateien abschalten. um den Vorgang zu vereinfachen haben die btrfs tools eine Hilfefunktion dafür, die diese schritte mit erledigt, siehe weiter unten.
- Soll die Swapdatei z.B. für den Ruhezustand verwendet werden, so lässt sich das Offset der Swapdatei nicht mit
filefrag -v
bestimmen. Da Btrfs eine Abstraktionsschicht zum Mappen der Dateien verwendet. um das Offset zu bestimmen, gibt es auch eine Hilfefunktion in den btrfs tools siehe
Swapdatei anlegen
# btrfs filesystem mkswapfile -U clear -s 2G <Datei>
Offset der Swapdatei bestimmen
btrfs inspect-internal map-swapfile -r <swapdatei>