Ubuntu 16.04 Xenial Xerus
Ubuntu 14.04 Trusty Tahr
Ubuntu 12.04 Precise Pangolin
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Um den aktuellen Befehlsumfang zu btrfs
zu erhalten (Optionen, Ergänzungen), sollte man den jeweiligen Befehl im Terminal [1] ohne Option (entspricht der Option --help
) abfragen - die Manpages sind teilweise fehlerhaft bzw. Hinweise fehlen ganz!
Bis Raring Ringtail (13.04) steht eine aktuellere Version der btrfs-tools unter den Links bereit.
Dieser Artikel befasst sich mit der Installation auf einem Btrfs-Dateisystem und verweist auf jeweilige Besonderheiten, die man beachten sollte - soweit diese den Autoren bekannt sind bzw. erwähnenswert eingestuft wurden.
Eine dieser Besonderheiten ist, dass bei einer Installation gleich die Unterlaufwerke (Subvolumes) für das Rootverzeichnis mit @ und für das Homeverzeichnis mit @home angelegt werden. Damit kann man dann auf einfache Art entsprechende Schnappschüsse (Quasi-Backups) anlegen.
Im separaten Artikel Befehle für das Btrfs-Dateisystem sind alle Befehle aufgelistet und deren Anwendung beschrieben, die für den Einsatz und die Überprüfung eines Btrfs-Dateisystems verfügbar sind.
Die Installation wird wie bei allen anderen Installationen ausgeführt, entweder über:
zu den Downloads
Alternate-CD
zu den Downloads
Online (Netzwerkinstallation)
von einem bestehenden Linux (Installation mit debootstrap)
Man sollte beachten, dass eine Installation von GRUB 2 nur unter besonderen Bedingungen in einen Partitionsbereich (PBR) möglich ist. Will man den bestehenden MBR nicht antasten, muss ein anderer Bootloader / Bootmanager benutzt werden, um das System zu starten. Dann sind entsprechende Vorbereitungen zu treffen. Diese sind hinsichtlich einem Btrfs-Dateisystem noch zu erweitern - siehe die ergänzenden Hinweise zu Externer GRUB_2.
Will man ein Betriebssystem mit Ubuntu bzw. eines der Derivate bootfähig mit einem Btrfs-Dateisystem auf einem Rechner installieren, sollte dieses vorab vorbereitet werden. Eine zusätzliche Installation (Multiboot), die von einem anderen Linux aus aufgerufen werden soll (via configfile oder Vergleichbarem), kann ggf. ohne weitere Vorbereitung nicht normal ausgeführt werden. Siehe dazu auch die Ausführungen unter Zusätzliche Maßnahmen. Dazu muss und darf dann auch kein PBR gesetzt werden!
Weitergehende Informationen zur Aufbereitung von Datenträgern, insbesondere bei einer GUID-Partitionstabelle, siehe auch unter GRUB 2 Grundlagen
Nachfolgend das Ergebnis für eine Partitionierung mit Installer alter Art:
Gerät boot. Anfang Ende Blöcke Id System /dev/sdc1 62 10566659 5283299 83 Linux /dev/sdc2 10566660 15650907 2542124 83 Linux ....
Und hier das vergleichbare Ergebnis mit GParted bzw. Installer neuer Art:
Gerät boot. Anfang Ende Blöcke Id System /dev/sdc1 2048 10565631 5281792 83 Linux /dev/sdc2 10566660 15650907 2542124 83 Linux ....
Insbesondere sei hier darauf hingewiesen, dass andere Partitionstabellen als der Standard (= MSDOS) ohnehin nur mit den Werkzeugen für eine Partitionierung erstellt werden können - als Beispiel das Ergebnis für eine "GUID"-Formatierung:
Gerät boot. Anfang Ende Blöcke Id System /dev/sdc1 1 15663103 7831551+ ee GPT
Das nachfolgende Werkzeug ist in der Regel auf den Installationsmedien enthalten
btrfs-tools
mit apturl
Paketliste zum Kopieren:
sudo apt-get install btrfs-tools
sudo aptitude install btrfs-tools
und enthält alle Programme zum Einrichten und Arbeiten mit einem Btrfs-Dateisystem.
Der Befehl mkfs.btrfs
kann keine Partition erstellen, sondern die angegebene Partition nur mit einem Btrfs-Dateisystem formatieren. Zum eigentlichen Erstellen einer Partition benutzt man die allgemein bekannten grafischen Werkzeuge für eine Partitionierung oder verwendet im Terminal [1] z.B. den Befehl cfdisk
[3]. Die in den nachfolgenden Beispielen verwendeten Begriffe und sonstige Angaben sind dem eigenen System sinngemäß anzupassen.
Eine Information über den Befehl erhält man mit der Eingabe in das Terminal [1] von:
mkfs.btrfs
Die Ausgabe enthält eine Übersicht zu den Optionen:
Die folgenden Vorgaben hinsichtlich der Optionen -A
bzw. -b
betreffen nur interne Daten innerhalb vom festgelegten Rahmen der Partition. Diese Einstellungen werden nur im Regelbetrieb bei der Belegung der Partition berücksichtigt!
Mögliche Optionen für das Formatieren eines Btrfs-Dateisystemes, einzusetzen vor der Bestimmung von einem oder mehrerer Laufwerke, sind:
Optionen zum Formatieren eines Btrfs-Dateisystems | |
-A --alloc-start | Einen nicht zugewiesenen Bereich zwischen dem Start der Partition (nach einer normalen Partitionierung) und dem Start der eigentlichen Datenablage in Bytes bestimmen (Integerzahl mit Faktor: g= GB, m= MB, k= KB). |
-b --byte-count | Größe des Laufwerkes, die Angabe erfolgt als Integerzahl mit Faktor: g= GB, m= MB, k= KB |
-d --data | Datenprofil -> Zulässig ist raid0, raid1, raid5, raid6, raid10 or single |
-m --metadata | Metadatenprofile -> Zulässig ist raid0, raid1, raid5, raid6, raid10, single or dup |
-l --leafsize | Größe btree leaves -> Default = Seitengröße |
-n --nodesize | Größe der btree nodes -> Default = Seitengröße |
-s --sectorsize | minimale Größe der Sektoren in Byte -> Default = 4096 |
-L --label | Dem Laufwerke eine Bezeichnung zuordnen. -> "HD_NAME" |
Die Option -d
single (= keine Redundanz) sollte man nur mit Bedacht wählen - denn defekte Metadaten bedeuten unlesbares Laufwerk! Die Standardwerte der Optionen -l
, -n
und -s
sollte man nur in begründeten Fällen setzen.
Eine normale Formatierung kann man mit den bekannten Werkzeugen für eine Partitionierung ausführen oder man gibt in das Terminal [1] ein:
sudo mkfs.btrfs -L "HD_NAME" /dev/sda1
Die angegebene Partition sda1 wird mit einem Btrfs-Dateisystem mit den Vorgabewerten versehen, löscht dabei alle Daten auf dieser Partition und bekommt die Bezeichnung "HD_NAME".
Für die Formatierung eines Btrfs-RAID-Verbundes mit einer Bezeichnung gibt man (beispielhaft) im Terminal [1] ein:
sudo mkfs.btrfs -m raid1 -d raid1 -L "BTRFS_RAID" /dev/sda1 /dev/sdb1
Bei der eigentlichen Installation wird dann nur eines der Laufwerke aus dem Btrfs-Raid-Verbund herangezogen / bestimmt. Die Information zur erfolgreichen Erstellung fragt man ab mit der Eingabe in ein Terminal [1] von:
sudo blkid
/dev/sdb1: LABEL="BTRFS_RAID" UUID="2f613613-85b4-46cf-bbbe-90a1748f7753" UUID_SUB="e88dd65c-f471-415a-827b-2fc47359ba2d" TYPE="btrfs" /dev/sda1: LABEL="BTRFS_RAID" UUID="2f613613-85b4-46cf-bbbe-90a1748f7753" UUID_SUB="80eb4ebe-9e95-4052-8162-dbc2a48f3899" TYPE="btrfs"
Zu beachten ist, dass auch bei einem Btrfs-RAID-Verbund für die Partitionen die gleiche UUID - jedoch je Partition eine unterschiedliche UUID_SUB vergeben wurde. In die /etc/fstab wird nur einmal die gemeinsame UUID eingetragen - das Dateisystem ordnet das schon richtig zusammen. Nachfolgend ein beispielhafter Eintrag für die Root-Partition eines Btrfs-RAID-Verbundes in der /etc/fstab:
UUID=2f613613-85b4-46cf-bbbe-90a1748f7753 / btrfs defaults,subvol=@,compress 0 1
Es darf die Option errors=remount -ro
bei einem Btrfs-Dateisystem nicht benutzt werden!
Nach Abschluss der Formatierung und bevor man diese Partition benutzt, kann und sollte man die Partitionen überprüfen - dazu dient der Befehl:
sudo btrfs filesystem show
Dann werden alle Laufwerke angezeigt, unabhängig von Mount-Status. Für alle ohne Btrfs-Dateisystem erhält man für ein einzelnes Btrfs-Laufwerk folgende (beispielhaften) Informationen:
failed to read /dev/sde failed to read /dev/sdd
Für ein einzelnes Laufwerk mit einem Btrfs-Dateisystem folgende (beispielhaften) Informationen:
Label: 'HD_NAME' uuid: ed1545d8-dc26-415c-b82b-e00d7f85d4c1 Total devices 1 FS bytes used 58.71MB devid 1 size 2.00GB used 445.31MB path /dev/sda1
Für einen Btrfs-RAID-Verbund folgende (beispielhaften) Informationen:
Label: 'BTRFS_RAID' uuid: 2f613613-85b4-46cf-bbbe-90a1748f7753 Total devices 2 FS bytes used 2.55GB devid 2 size 232.76GB used 2.76GB path /dev/sdc1 devid 1 size 232.76GB used 2.76GB path /dev/sdb1
Ausgehend vom obigen Beispielen kann und sollte der Bootloader bei einem Btrfs-RAID-Verbund nacheinander jeweils in eine der Festplatten geschrieben werden (siehe auch Defektes Btrfs-Raid). Von Interesse sind dabei für einen Btrfs-RAID-Verbund die "Device ID's", nur die Festplatte mit der höchsten, hier devid = 2
, sollte in einem Btrfs-RAID-Verbund als sogenannte erste Festplatte im BIOS zum Booten verwendet werden. Man sollte bei der Bestimmung im BIOS zur ersten Festplatte (von der gebootet werden soll) erst sicherstellen, dass das auch funktioniert. Bei der Wahl der "falschen" Festplatte wird der Suchvorgang nach den GRUB 2-Imagedateien abgebrochen und dann neu gebootet (Dauerschleife)!
Der Befehl mit einer Option
btrfs filesystem show /dev/sda1
begrenzt die Informationen auf das gewählte Laufwerk. Mögliche Option sind dabei (entweder!)
Device, Eingabe = /dev/sda1
UUID, Eingabe = ed1545d8-dc26-415c-b82b-e00d7f85d4c1
Label, Eingabe= HD_NAME
Nachfolgend sind einige Maßnahmen aufgeführt, die während der Installation standardmäßig nicht abgearbeitet werden, jedoch für den Betrieb von Interesse sein können. Teilweise ist ohne eine entsprechende Nachbearbeitung das Betriebssystem nicht uneingeschränkt nutzbar.
Man kann einerseits sowohl am Speicherplatz etwas einsparen - wesentlicher ist jedoch die Zugriffszeit auf den Speicherbereich zu optimieren. Dazu dient die Mountoption compress
. Da dieses bei der normalen Installation nicht berücksichtigt wird (und auch nur mit Risiken realisierbar ist), kann man das am frischen System nachholen. Als Beispiel wird hier davon ausgegangen, dass sich das Rootverzeichnis @ auf der Partition /dev/sda1 befindet.
Dazu startet man ein Live-System und gibt dort nacheinander in ein Terminal [1] ein:
sudo mount -o compress /dev/sda1 /mnt
sudo btrfs subvolume create /mnt/@plus
sudo chmod -R 755 /mnt/@plus
sudo cp -apr /mnt/@/* /mnt/@plus/
Dieser Vorgang kann je nach Rechnerleistung etwas dauern!
sudo btrfs subvolume delete /mnt/@
sudo mv /mnt/@plus /mnt/@
Bei dieser Gelegenheit kann man auch gleich den ersten Schnappschuss (Bezeichnung beispielhaft) anlegen mit:
sudo btrfs subvolume snapshot /mnt/@ /mnt/root-datum
Das System wird dann ausgehangen mit:
sudo umount /dev/sda1
Aufgrund der geringen Datenmenge kann das beim Homeverzeichnis (@home) vernachlässigt werden - in die /etc/fstab sollte man die Mountoption compress
aber auf jeden Fall einbringen!
Während der Installation werden in der /etc/fstab bei den Optionen nur die Basisparameter eingetragen. Bei einer Installation auf einem Btrfs-Dateisystem sollte man zusätzlich in der /etc/fstab folgende Positionen überprüfen und soweit erforderlich nachtragen.
Die Option ssd
und weitere:
Wurde die Installation auf ein Solid State Drive (Halbleiterlaufwerk) aufgebracht, so wird der entsprechende Eintrag (ssd
) dafür unter den Optionen in die /etc/fstab eingebracht. Es können noch weitere, nützliche Parameter verwendet werden - siehe hierzu die Artikelserie SSD sowie diese speziellen Ausführungen.
Die Option Mountoptionen compress
:
Dieser Eintrag in die /etc/fstab muss manuell nachgetragen werden und sorgt für eine Komprimierung der Daten, wenn diese auf das Laufwerk geschrieben werden. Diese Arbeit wird beim Komprimieren bzw. Dekomprimieren von der CPU erledigt und ist Teil der Kernelroutinen. Diese Zusatzbelastung dürfte aber bei heutigen CPUs keine fühlbaren Auswirkungen mehr haben, bringt jedoch eine Einsparung beim Speicherplatz und beschleunigt das Auslesen erheblich. Beispielhaft für das Rootverzeichnis kann dann diese Ergänzung wie folgt aussehen:
UUID=2f613613-85b4-46cf-bbbe-90a1748f7753 / btrfs defaults,compress,subvol=@ 0 1
Die Option errors=remount -ro
darf bei einem Btrfs-Dateisystem nicht benutzt werden! Dieses führt zu einem nicht betriebsfähigen System.
Da der GRUB 2-Bootloader in der Standardkonfiguration schreibende Zugriffe auf
das Verzeichnis /@/boot/grub und die Datei grubenv
ausführt und dieses zu einem Fehlerhinweis während des Bootvorganges führen würde, wird diese Funktion
recordfail
bei einem Btrfs-Dateisystem beim Installieren von GRUB 2 per Default unterdrückt. Der Aufruf innnerhalb der "menuentry" wird dann auf eine blinde Subroutine geleitet.
Auch das Schreiben, ausgelöst durch die Variable GRUB_SAVEDEFAULT=true in der Datei /etc/default/grub sollte man nicht benutzen.
Der jeweils ausgewählte Menüeintrag kann nicht auf einem Btrfs-Dateisystem abgespeichert werden.
Da in der Regel bei einem Btrfs-Dateisystem während der Installation Unterlaufwerke (Subvolume = @, @home usw.) angelegt werden, wird dieses (sekundäre) Betriebssystem nicht so ohne Weiteres über die Funktion des Skriptes
/etc/grub.d/30_os-prober
von einem anderen (primären) Betriebssystem gefunden! Man muss das primäre System (mit dem aktiven Bootloader) für den Zugriff auf das sekundäre System entsprechend einrichten.
Der Bootloader des nachfolgend als primär bezeichneten Systems muss in der Lage sein, ein Btrfs-Dateisystem zu lesen. Ansonsten muss man im primären System die btrfs-tools nachinstallieren.
Zum Einbinden des neuen Systems legt man sich das folgende Skript ausführbar im primären System ab unter:
/etc/grub.d/nn_btrfs-suchen
(wobei mit der Zahl (hier "nn") die Position im Grub-Menü festgelegt werden kann). Die Liste der zu ladenden Module (hier z.B. insmod gzio) sowie die der Kernel-Optionen (hier z.B. vt.handoff=7
) muss man aus dem sekundären System einmalig in das Skript übernehmen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #! /bin/bash set -e ###FIXME die Bezeichnung "DEVICE" muss auf die reale Partition # mit dem Btrfs-Dateisystem angepasst werden! DEVICE="/dev/sda5"; AUSSTIEG () { echo "Das Laufwerk ${DEVICE} ist kein \"Btrfs-Dateisystem\"!" >&2 exit 1 } TEST_UUID=$( blkid ${DEVICE} | grep btrfs ) >/dev/null || AUSSTIEG; UUID_BTRFS=$( blkid -c /dev/null -o value -s UUID ${DEVICE} ); echo "UUID = ${UUID_BTRFS} vom Btrfs-Dateisystem gefunden" >&2 echo "Startmenü für ein Btrfs-Dateisystem eingefügt" >&2 cat << EOF menuentry "Ubuntu (auf Btrfs-Dateisystem) starten" --class gnu-linux --class gnu --class os { recordfail insmod gzio insmod part_msdos insmod btrfs search --no-floppy --fs-uuid --set=root ${UUID_BTRFS} linux /@/boot/vmlinuz root=UUID=${UUID_BTRFS} ro rootflags=subvol=@ ${GRUB_CMDLINE_LINUX_DEFAULT} ${GRUB_CMDLINE_LINUX} vt.handoff=7 initrd /@/boot/initrd.img } EOF |
Mit der Eingabe in das Terminal [1] von:
sudo grub-mkconfig
kann man die erfolgreiche Suche überprüfen und dann mit der Eingabe von:
sudo update-grub
dieses in den aktiven Bootloader übernehmen.
Damit das primäre System immer einen aktuellen Kernel aufruft und somit die Daten unabhängig vom Zustand / Upgrade des sekundären Systems sind, wird im sekundären System das folgende Skript abgelegt unter:
/etc/grub.d/09_K-aktuell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/bin/sh # Hiermit wird bei einem 'update-grub' der aktuelle Kernel # intern auf eine einheitliche Form innerhalb '/boot' verlinkt. set -e SETZE_LINK () { rm -f ${SUCHE_WAS}; list=$( for i in ${SUCHE_WAS}-* ; do echo -n "$i " ; done ) [ "x$list" = "x" ] && exit linux=$( version_find_latest $list ) ln -s "$linux" ${SUCHE_WAS} > /dev/null echo "Link für $linux eingefügt" >&2; } . /usr/lib/grub/grub-mkconfig_lib cd /boot; SUCHE_WAS="vmlinuz" && SETZE_LINK; SUCHE_WAS="initrd.img" && SETZE_LINK; |
Nach jedem
sudo update-grub
und somit auch bei einem Kernel-Upgrade wird damit automatisch eine Verlinkung zum jeweils aktuellen Kernel hergestellt. Dieses ist erforderlich, weil der normale Link im Rootverzeichnis zum Zeitpunkt, wenn das Btrfs-Dateisystem noch nicht konfiguriert (eingehängt) ist, ins Leere weist. Bei einem EFI Bootmanagement wird diese Verlinkung automatisch an das secure-boot angepasst.
Falls es beim Booten in Zusammenhang mit dem Festplattentest zu einer Fehlermeldung kommt, sollte man überprüfen, ob es im Verzeichnis /sbin einen Link von fsck.btrfs nach btrfsck gibt und diesen ggf. im Terminal [1] anlegen mit:
sudo ln -s /sbin/btrfsck /sbin/fsck.btrfs
Eine Prüfung der Partitionen wird in der Regel beim Hochfahren des Systems aufgerufen, sofern in der /etc/fstab am Ende der Zeile zum Einbinden des Laufwerkes bzw. Unterlaufwerkes (Subvolume) die zweitletzte Prüfzahl ungleich 0
gesetzt ist. Man kann alle Prüfzahlen auf 0 0
setzen und verkürzt damit die Bootzeit je Eintrag erheblich. Dann sollte man aber in regelmäßigen Abständen eine Prüfung manuell bzw. mittels Cron mit dem Befehl btrfsck ausführen!
Der Befehl fsck.btrfs ist kein direkter Befehl aus den Paket btrfs-tools, sondern wird in der Regel bei der Installation im Verzeichnis /sbin als Link auf den Befehl btrfsck angelegt.
Damit wird sichergestellt, das mountall eine relevante Sequenz für die Prüfung des Dateisystemes beim Booten findet. mountall bildet aus fsck
und dem Eintrag in der /etc/fstab btrfs
als Angabe zum Dateisystem dann den Befehl fsck.btrfs
Wird in einem Btrfs-Dateisystem mit einem Btrfs-RAID-Verbund ein Teillaufwerk als defekt erkannt und das System will nicht mehr booten, so bieten sich zwei Varianten an:
Annahmen zum Beispiel
/dev/sda1 sei intakt
/dev/sdb1 sei defekt
/dev/sdc1 sei die Reserve
Sofern noch das Bootmenü erscheint, startet man mit der ersten Variante, ansonsten muss man gleich die zweite Variante benutzen.
Variante 1: Man drückt im Bootloader-Menü die Taste E
nachdem man die relevante Startzeile mit den Pfeiltasten ↑ / ↓ aufgerufen hat und ergänzt / editiert die folgenden Zeilen:
1 2 3 | set root='(hd1,msdos1)' search --no-floppy --fs-uuid --set=root 2f613613-85b4-46cf-bbbe-90a1748f7753 linux /@/boot/vmlinuz-3.2.0-7-generic root=UUID=2f613613-85b4-46cf-bbbe-90a1748f7753 ro rootflags=subvol=@ … |
Die Zeile 1
Sofern erforderlich, muss man hier die Daten auf die noch intakte Festplatte ändern, ausgehend vom Beispiel also auf:
set root='(hd0,msdos1)'
Die Zeile 2
Musste Zeile 1 angepasst werden, dann deaktiviert man die Zeile 2 durch Voranstellen mit # (man beachte US-Tastatur = ⇧ + 3 )
Die Zeile 3
Man editiert / ergänzt die Zeile 3 bei den rootflags um ,degraded
:
ro rootflags=subvol=@,degraded ...
und startet dann den Bootprozess mit F10 .
Variante 2: Man startet ein Live-System und überprüft als erstes mit
sudo btrfsck /dev/sdXY
nacheinander die relevanten Laufwerke dahingehend, welches keine Fehler aufweist und bindet das Laufwerk ohne Fehler, nachfolgend mit /dev/sda1 angenommen, ein. Weisen die Laufwerke keine Fehler auf, kann man versuchen, durch das Einsetzen von Schnappschüssen eine Lösung zu finden.
Man kann erst einmal versuchen, das nicht funktionsfähige Laufwerk neu zu formatieren und dieses als Ersatz einzusetzen, so lange nicht andere, eindeutige Hinweise die Verwendung ausschließen.
Bei beiden Varianten gibt man am jeweiligen Desktop nacheinander in ein Terminal [1] ein:
sudo mount -o degraded /dev/sda1 /mnt
sudo btrfs device add /dev/sdc1 /mnt
sudo btrfs device delete missing /mnt
Mit dem letzten Befehl wird gleichzeitig ein Abgleich der Daten vom ersten Laufwerk auf das neue Laufwerk eingeleitet - dieses kann je nach Umfang eine Zeit in Anspruch nehmen. Erst danach sollte man das defekte Laufwerk auch physisch aus dem Rechner entfernen.
Mit dem Befehl btrfs filesystem show
überprüft man die korrekte Ausführung - es sollte jetzt das Laufwerk /dev/sdc1 mit einer neuen devid
belegt und ein Teil des RAID-Verbundes sein. Man sollte noch (ggf. in einer chroot-Umgebung) den Zustand von GRUB_2 erneuern bzw. wieder herstellen.
Diese Revision wurde am 24. September 2016 18:05 von ArnoW erstellt.