* Btrfs kennt 3 Arten von Daten
* Data (normale Nutzerdaten), Metadata, System
* Für die einzelnen Arten von Daten werden Chunks von Daten reserviert, diese sind in der Regel nach der Reservierung noch nicht komplett gefüllt, sind aber fest reserviert für diese Art von Daten
* df -h stimmt bei Btrfs nicht unbedingt
* Btrfs-Dateisysteme können über mehrere Platten erstellt werden
* man kann auch Platten hinzufügen oder entfernen im laufenden Betreib
* nach dem hinzufügen ist ein btrfs-balance empfehlenswert um die Dateien gleichmäßig über die Platten zu verteilen
====== Subvolume mounten ======
Syntax: mount -o subvol=//Subvolume-Pfad// //Device// //Mountpoint//
* //Subvolume-Pfad// ist der Pfad zum Sobvolume innerhalb der btrfs formatierten Partition/Laufwerks, wobei die Partition/das Laufwerk "/" ist, auch wenn es nicht im Dateisystem "/" ist
* //Device// das Device auf dem sich das Dateisystem (inkl. des Subvolumes) befindet - Beispielsweise /dev/sda2
* Mountpoint DAs Verzeichnis im Dateisystem an dem das Subvolume eingehängt werden soll
\\ \\
Beispiel: mount -o subvol=/second /dev/sda1 /media/disk1
\\ \\
In obigem Beispiel wird das Subvolume "second", welches sich direkt als Verzeichnis auf /dev/sda1 befindet, nach /media/disk1 gemountet. \\
Wäre /dev/sda1 nach /media/btrfsdisk gemountet und man würde ls machen, könnte die Ausgabe zum Beispiel so aussehen: \\
user@server /media/btrfsdisk $ ls
first second
====== fstab ======
Entspricht einem normalen Eintrag in der fstab, es kommt lediglich der Parameter subvol=//subvolume-Pfad// hinzu.
\\ \\
Beipsiel:
\\
UUID=dfe5e7bc-ed56-442b-8c94-8c66bbcd44dc / btrfs defaults,subvol=/newroot 0 1
\\ \\
"newroot" ist in obigem Beispiel das zu mountende Subvolume auf der Partition mit UUID "dfe5e7bc-ed56-442b-8c94-8c66bbcd44dc". \\
Zu beachten ist das "/" hier nicht die Wurzel des Dateisystems meint, sondern die Wurzel der Partition/des Dateisystems, sprich "newroot" liegt direkt oben in der Partition und nicht unterhalb irgend eines Verzeichnisses.
====== Subvolume als "/" ======
In diesem Fall liegt /boot (der Kernel und Grubs Konfiguration) nicht auf dem Btrfs Subvolume, sondern auf einer eigenen ext3 Partition.
* Kernel benötigt Parameter rootflags=subvol=//Subvolume-Pfad//
* //Subvolume-Pfad// ist der Pfad zum Subvolume-Verzeichnis auf der angegebenen Partition (wobei "/" die oberste Ebene innerhalb der Partition/Dateisystems ist)
* Subvolume muss über subvol-Option in /etc/fstab für "/" ebenfalls angegeben sein (siehe oben)
Beispieleintrag grub.cfg:
linux /vmlinuz-3.19.0-32-generic root=UUID=dfe5e7bc-ed56-442b-8c94-8c66bbcd44dc ro rootflags=subvol=/newroot quiet splash $vt_handoff
\\ \\
Gesamteintrag sieht so aus:
menuentry 'Linux Mint 17.3 Xfce 64-bit' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-dfe5e7bc-ed56-442b-8c94-8c66bbcd44dc' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 6d27fa00-8453-41aa-9a1f-6284457e9d50
else
search --no-floppy --fs-uuid --set=root 6d27fa00-8453-41aa-9a1f-6284457e9d50
fi
linux /vmlinuz-3.19.0-32-generic root=UUID=dfe5e7bc-ed56-442b-8c94-8c66bbcd44dc ro rootflags=subvol=/newroot quiet splash $vt_handoff
initrd /initrd.img-3.19.0-32-generic
}
bestehende Partitionen anklicken, als Dateisystem btrfs aus der Liste wählen, Formatieren nicht anklicken
* Wurde einmal mit dem Subvolume als "/" gebootet kann man update-grub aufrufen und es wird das neue subvolume für alle Einträge eingetragen
====== Snapshot beim Installieren neuer Pakete ======
* Für apt ist es apt-btrfs-snapshot (für andere Paketverwaltungssysteme gibt es ähnliche Tools)
* das Subvolume für "/" muss "@" sein, sonst funktioniert es nicht
* Installieren: apt-get install apt-btrfs-snapshot
* Danach prüfen ob es funktioniert: apt-btrfs-snapshot supported
* da muss Supported zurückkommen
* danach wird, egal welches Werkzeug man benutzt (apt-get, aptitude, graphische Werkzeuge) immer ein Snapshot vor dem Verändern erstellt
* der Snapshot wird nach @//Datum+Zeit// gespeichert
* befindet sich auf der gleichen Ebene (im Laufwerks-Root) wie "@"
* apt-btrfs-snapshot list -> Zeigt die vorhanden Snapshots mit Datum an
* apt-btrfs-snapshot set-default //Snapshot-Name// -> Aktiviert ein bestimmten Snapshot
* es muss rebootet werden
* nach dem reboot ersetzt der gewünschte Snapshot das Subvolume "@"
* das Snapshot-Verzeichnis wird nach "@" kopiert
* das ehemalige "@" wird unter neuer Bezeichnung gesichert
====== Tools ======
In den Man-Pages ist von und von die Rede. \\ \\
- ist der Mount-Point \\ \\
- ist das Device (/dev/something)
Das Tool Btrfs ist das zentrale Tool, es ruft letztendloch allerdings nur andere Programme auf die die spezielle Aufgabe ausführen - es gibt also meist einen Weg über den Vefehl Btrfs und einen zweiten über ein Tool welches in der Regel btrfs-//XYZ// heißt. \\ \\
Btrfs gliedert sich in u.a. (es gibt mehr folgende Unterbefehle: \\
* subvolume -> Snapshots/Subvolumes
* filesystem -> Filesystem-Aufgaben
* device -> Arbeiten mit "physischen" Devices bzw. dem was unter dem Fielsystem liegt
===== Btrfs =====
==== subvolume ====
*Operationen auf Subvolumes/Snapshots
^ Operation ^Erklärung ^
|list //Path// | Listet die Subvolumes auf die es für diesen Pfad gibt \\ \\ Syntax: btrfs subvolume list //Pfad// \\ \\ Beispiel: btrfs subvolume list /
\\ \\ Das mit @ markierte Sobvolume ist das aktive|
==== df ====
* Zeigt an wie sich der Speicherplatz auf die einzelnen Datenarten verteilt und wie viele Blöcke für was reserviert sind bzw. wieviel noch frei ist
Syntax: btrfs filesystem df //Mount-Point//
==== snapshot ====
Snapshots sind Abbilder eines anderen Subvolumes. Ein Snapshot erstellt ein neues Subvolume mit dem Abbild. \\
Das besondere dabei ist, dass keine Daten kopiert werden beim erstellen des Snapshots, vielmehr sind die Daten in Quelle und Ziel die gleichen (die gleichen Dateisystemblöcke). \\
Erst wenn das Quell- oder Zielsubvolumen geändert wird, verweisen die Dateisystemmetadaten des Subvolumes bei dem die Änderung stattgefunden hat auf neue Blöcke, für die Dateien die sich geändert haben. \\
Es wird also erst in dem Moment mehr Speicher benötigt wo ein Delta zwischen den beiden Subvolumes auftritt und auch dann nur in der Größe wie Groß die Unterschiede zwischen den beiden Subvolumes sind. \\
Snapshots resultieren nicht in Performance-Nachteilen, weil BTRFS Copy-on-write arbeitet, sprich Änderungen an bestehenden Daten werden sowieso immer in neue Sektoren geschrieben, statt die bestehenden Sektoren zu überschreiben, bei einem Snapshot werden die Originaldaten einfach nicht überschrieben, die Performance bleibt gleich, weil sowieso irgendwohin geschrieben werden muss.
Syntax: btrfs subvolume snapshot //Quellpfad// //Zielfpfad// \\
* //Quellpfad//: Der Dateisystempfad von dem der Snapshot gemacht werden soll
* //Zielpfad//: Das Verzeichnis in das der Snapshot gespeichert werden soll (muss nicht existieren, wird angelegt)
\\
Beispiel: btrfs subvolume /home /media/backup/home_2015_03_04 \\
Legt ein snapshot (subvolumen) mit den Daten von /home nach /media/backup/home_2015_03_04 an. \\
In dem Beispiel wird davon ausgegangen, dass /home ein Subvolumen auf der Partition ist, welche unter /media/backup gemountet ist. \\
ls auf /media/backup würde danach so aussehen: \\
home home_2015_03_04 \\ \\
Snapshots können nur auf innerhalb des gleichen Btrfs-Dateisystems gemacht werden - Quelle und Ziel müssen auf dem gleichen Btrfs-Dateisystem liegen (zum Beispiel der gleichen Partition).
Enthält ein Subvolume weitere Subvolumes, so sind die weiteren Subvolumes nicht Teil des Snapshots
==== restore ====
* btrfs restore wird genutzt um aus einem beschädigten Dateisystem Daten wiederherzustellen
===== btrfs-convert =====
* Convertiert ein ext//X//-Dateisystem in Btrfs
Syntax: btrfs-convert //Device//
**Hinweis:** Nach dem Convert befindet sich auf dem Dateisystem in der Wurzel ein Snapshot welches ein Image des vorhergehenden Dateisystems enthält. \\ Darüber lässt sich das Convert mit der Option "-r" rückgängig machen. \\ Es kann dadurch passieren das nach dem Convert kein Speicherplatz mehr frei ist - das Image/der Snapshot kann einfach gelöscht werden.
===== btrfsck =====
* Überprüft und repariert ein Dateisystem
* Das BTRFS-Dateisystem darf nicht gemountet sein, auch nicht read-only!
====== Linux-Mint/Ubuntu ======
* Wird grundsätzlich unterstützt (Stand: Linux Mint 17.3 Rosa)
* Installation auf BTRFS wird offiziell nicht unterstützt
* Während der Installation steht das Formatieren mit btrfs nicht zur verfügung
* Die Tools für btrfs sind im Live-/Installationsmedium nicht verfügbar
* Nach start des Live-Linux gparted installieren
* apt-get install gparted
* btrfs-utils installieren (ohne kann gparted keine btrfs-Dateisysteme anlegen)
* apt-get install btrfs
* gparted aufrufen
* erste Partition anlegen, als Dateisystem ext3 wählen
* 2 MB vor der Partition frei lassen (lässt sich einstellen beim erstellen der Partition)
* wird benötigt für Bootmanager grub
* eventuell kann man auf diese erste Partition verzichten, habe ich nicht getestet - wird für /boot benötigt - es war vor einiger Zeit nicht möglich direkt von btrfs zu booten
* zweite Partition anlegen - btrfs als Dateisystem wählen
* das wird "/" bzw. das Wurzelverzeichnis
* beliebige weitere Partitionen anlegen
* Installation starten
* Benutzerdefinierte Partitionierung wählen (heißt etwas anders)
* erste Partition
* Dateisystem ext3 wählen, nicht formatieren, als "/boot" einhängen
* zweite Partition
* Dateisystem btrfs wählen, nicht formatieren, als "/" wählen
* weitere Partitionen entsprechend verfahren
* Installation normal fortsetzen
Ubuntu/Mint erstellen innerhalb des Btrfs-Dateisystems ein Subvolume, es wird also in keinem Fall (egal welcher Mountpoint) direkt in das btrfs-Dateisystem geschrieben. \\ Die Namen sind jeweils @//Name des Mount-Points//. \\ "/" ist "@".
====== Infos ======
* Wiki-Seite von btrfs: https://btrfs.wiki.kernel.org/index.php/Main_Page