Arch auf BtrFS

Aus wiki.archlinux.de

Arch-Linux auf ein BtrFS-System

Hier wird beschrieben wie ich ein BtrFS-System erstelle, wo man mit einem Snapshot nur / speichert. Die Verzeichnisse /home, /var/lib/cache/pacman/pkg und wie bei mir /Daten bleiben aussen vor und sind extra per snapshot zu sichern. Dies ist interessant für System-Updates, schnell ein System-Update mit vorherigen snapshot der Root-Partition erstellen ohne Ballast wie pkg oder home, Daten etc. also ein kleines schnelles snapshot.
Inspiriert wurde ich von unicks.eu, der inzwischen eine kpl. neue Serie gedreht hat die da lautet "Arch my way"

Der Artikel ist so beschrieben wie mein System läuft und möglichts viel integriert. So kann man weglassen was man nicht braucht oder weitere scripte einbinden. Es sind also viele Änderungen möglich. Wenn jemand kein EFI nutzt so braucht man auch keine vFat Formatierung und EFI-Partition. Man kann diese Partition aber als ext4 formatieren da grub evtl. Probleme mit BtrFS Boot-Partition hat.
Datensicherung- und Update-Script sind unter Scripte zu finden, sowie auch ein kpl. Terminal-Menü. Links unten am Ende dieses Artikels.

Ich gehe davon aus, dass ein USB-Stick mit neustem Arch-Images startbar vorliegt. Weiter, das es eine kpl. Neuinstallation ist ohne Dualboot. Sonst entsprechend die Plattenbezeichnung ändern. Diese Beschreibung erklärt die Installation mit 2 SSD die im Raid0 / 1 (raid 5/6 läuft zur Zeit nicht stabil) laufen. Es ist aber auch möglich nur eine Platte zu nutzen

Mit hilfe des Sticks starten wir den Rechner, ist der Prompt zu sehen, stellen wir das System auf der deutschen Tastatur um, mit loadkeys de. Die Arbeit wird hier durch doch erleichtert.

Jetzt prüfe ich erstmal was an Platten vorhanden ist. Mit fdisk -l (l = kleines L)
Anmerkung:sudo ist nicht von nöten, da das System per Stick mit root gestartet wird
Die Ausgabe fdisk -l ist bei mir (man sieht wie es mal aussehen sollte, da schon eingerichtet):

[Amber@DX1701 ~]$ sudo fdisk -l
[sudo] Passwort für Amber: 
Festplatte /dev/sda: 232,9 GiB, 250059350016 Bytes, 488397168 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: gpt
Festplattenbezeichner: 8445CB1C-5B69-453B-A039-BB98A9C39955

Gerät         Anfang      Ende  Sektoren Größe Typ
/dev/sda1       2048   1026047   1024000  500M EFI-System
/dev/sda2    1026048 470788095 469762048  224G Linux-Dateisystem
/dev/sda3  470788096 488397134  17609039  8,4G Linux Swap
 
Festplatte /dev/sdb: 223,6 GiB, 240057409536 Bytes, 468862128 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: gpt
Festplattenbezeichner: 8A3B18E3-CDAB-4880-8B42-4B13359A488C

Gerät      Anfang      Ende  Sektoren  Größe Typ
/dev/sdb1    2048 468862094 468860047 223,6G Linux-Dateisystem


Anmerkung:Das Amber@DX1701 ist mein Name und Rechnername, bei euch steht also etwas anderes wie [root@xxxxx ~]#

Man sieht, die erste Platte sda hat die Partitionen

/dev/sda1       2048   1026047   1024000  500M EFI-System
/dev/sda2    1026048 470788095 469762048  224G Linux-Dateisystem
/dev/sda3  470788096 488397134  17609039  8,4G Linux Swap

die zweite Platte folgende

/dev/sdb1    2048 468862094 468860047 223,6G Linux-Dateisystem

So habe ich das ganze aufgebaut:

Ich haben hier also sda und sdb als Platten und fangen mit sda an und rufe ein Partitionierungsprogramm auf mit Hilfe von fdisk /dev/sda um die erste Platte einzurichten.
Es erscheint im Terminal:

[Amber@DX1701 ~]$ sudo fdisk /dev/sda
[sudo] Passwort für Amber: 
Willkommen bei fdisk (util-linux 2.30.1).                                                                                                                                                                             
Änderungen werden vorerst nur im Speicher vorgenommen, bis Sie sich
entscheiden, sie zu schreiben.
Seien Sie vorsichtig, bevor Sie den Schreibbefehl anwenden.
 
Befehl (m für Hilfe): m

Mit m (anschließend mit Enter/Return bestätigen) erhält man ein Hilfemenü um die Funktionen von fdisk zu sehen.
Es erscheint:

Hilfe:

 Allgemein
  d   Eine Partition löschen
  F   Größe des unpartitionierten Bereichs anzeigen
  l   Die bekannten Dateisystemtypen anzeigen
  n   Eine neue Partition anlegen
  p   Die Partitionstabelle ausgeben
  t   Einen Partitionstyp ändern
  v   Die Partitionstabelle überprüfen
  i   Informationen über eine Partition ausgeben

 Sonstiges
  m   Dieses Menü anzeigen
  x   Zusätzliche Funktionen (nur für Experten)

 Skript
  I   Plattenlayout aus einer sfdisk-Skriptdatei laden
  O   Plattenlayout in eine sfdisk-Skriptdatei schreiben

 Speichern und Beenden
  w   Die Tabelle auf die Festplatte schreiben und das Programm beenden
  q   Beenden ohne Speichern der Änderungen

 Eine neue Bezeichnung erstellen
  g   Eine neue leere GPT-Partitionstabelle erstellen
  G   Eine neue leere SGI (IRIX)-Partitionstabelle erstellen
  o   Eine neue leere DOS-Partitionstabelle erstellen
  s   Eine neue leere Sun-Partitionstabelle erstellen

 Befehl (m für Hilfe): 


Ich brauche also ausgehend von leeren Platten, g, n, t, p und w.
Anmerkung:Die arbeiten die man vornimmmt werden erst umgesetzt wenn man mit w speichern und Ende bestätige!!
Ich kann alles ausser Letzter Sektor mit Enter bestätigen, letzter Sektor wird mit Eingabe der Grüße der Partition (+Größe{K,M,G,T,P}). Beispiel +500M wäre 500MB groß.
Ich fange mit g an und erhalte:

Befehl (m für Hilfe): g
Eine neue GPT-Festplattenbezeichnung wurde erstellt (GUID: D85F0243-252D-412F-AAAE-89FCF5DA460C).
Befehl (m für Hilfe): 

Nun habe ich eine Partitionstabelle und mache weiter mit n (neue Partition):

Befehl (m für Hilfe): n
Partitionsnummer (1-128, Vorgabe 1): 
Erster Sektor (34-976773134, Vorgabe 34): 
Letzter Sektor, +Sektoren oder +Größe{K,M,G,T,P} (34-976773134, Vorgabe 976773134): +500M

Eine neue Partition 1 des Typs „Linux filesystem“ und der Größe 500 MiB wurde erstellt.

Befehl (m für Hilfe): 

Es wurde eine Partition mit 500MB erstellt, diese wird später in /boot eingehängt und in vFat formatiert (efi).
Weiter geht es mit n für die Root-Partition (eine /home wird es nicht geben da ich mit subvolume arbeite).

Befehl (m für Hilfe): n
Partitionsnummer (2-128, Vorgabe 2): 
Erster Sektor (1024034-976773134, Vorgabe 1024034): 
Letzter Sektor, +Sektoren oder +Größe{K,M,G,T,P} (1024034-976773134, Vorgabe 976773134): +224G

Eine neue Partition 2 des Typs „Linux filesystem“ und der Größe 224 GiB wurde erstellt.

Befehl (m für Hilfe):


Nun die letzte Partition für swap

Befehl (m für Hilfe): n
Partitionsnummer (3-128, Vorgabe 3): 
Erster Sektor (470786082-976773134, Vorgabe 470786082): 
Letzter Sektor, +Sektoren oder +Größe{K,M,G,T,P} (470786082-976773134, Vorgabe 976773134): 

Eine neue Partition 3 des Typs „Linux filesystem“ und der Größe 8,3 GiB wurde erstellt.

Befehl (m für Hilfe): 

Jetzt wird der Typ für die erste und letzte Partition festgelegt da diese EFI-Partition und swap sind. Mit l kann man sich eine Liste anzeigen lassen.
Ich brauche 1 und 19 also gebe ich t ein, wähle meine Partition, hier 1 tippe dann nochmals 1 ein und die Ausgabe ist:

Befehl (m für Hilfe): t
Partitionsnummer (1-3, Vorgabe 3): 1
Partitionstyp (geben Sie L ein, um alle Typen aufzulisten): 1

Partitionstyp von „Linux filesystem“ nach „EFI System“ geändert.

Befehl (m für Hilfe):

Das ganze nochmals für die dritte Partition aber mit 19 für swap. Ausgabe:

Befehl (m für Hilfe): t
Partitionsnummer (1-3, Vorgabe 3): 3
Partitionstyp (geben Sie L ein, um alle Typen aufzulisten): 19

Partitionstyp von „Linux filesystem“ nach „Linux swap“ geändert.
Befehl (m für Hilfe):

Mit "p" aufgelistet sieht es so aus:

Gerät         Anfang      Ende  Sektoren Größe Typ
/dev/sda1       2048   1026047   1024000  500M EFI-System          #EFI-Partition wird nach /boot gemountet
/dev/sda2    1026048 959424511 958398464  224G Linux-Dateisystem   #Root-Partition
/dev/sda3  959424512 976773134  17348623  8,3G Linux Swap          #Swap-Partition, wer viel Speicher hat kann diese weglassen oder verkleinern.

Befehl (m für Hilfe): 

Nun schließe ich das ganze mit w ab und mit Enter bestätigen. Ergebniss:

Befehl (m für Hilfe): w
Die Partitionstabelle wurde verändert.
ioctl() wird aufgerufen, um die Partitionstabelle neu einzulesen.
Festplatten werden synchronisiert.

[Amber@DX1701 ~]$

und damit bin ich wieder am Prompt.

Die sdb Platte muß noch eingerichtet werden. Das ist bei BtrFS nicht unbedingt notwendig, erstellt das Raid trotzdem, trotzdem mache ich es einfach wie folgt.

fdisk /dev/sdb
dann einmal g
nun n
dreimal mit Enter bestätigen (ich will ja nur eine Partition).
mit w abschließen.



Es geht weiter mit der Formatierung, ich nutze dabei Labels (Namen für die Partition). Der Befehl hierzu ist mkfs.btrfs -L "Name" /dev/sdXx und für Raid gibt es noch zusätzliche
Parameter wie -m (Metadaten) -d (daten) raidX (welches raid). Beispiel mkfs.btrfs -L "Name" -m raid1 -d raid0 -L "BTRFS_RAID" /dev/sda1 /dev/sdb1

Zuerst formatiere ich die EFI-Partition in vfat,setze Label mit EFI mit:

sudo mkfs.vfat -F 32 -n "EFI" /dev/sda1


Jetzt die Root-Partition, hier wird das raid gesetzt also sda2 mit sdb1. Hier habe ich für die Metadaten ein Raid1 (Mirroring – Spiegelung) und für die Daten also / Raid0 (Striping – Beschleunigung ohne Redundanz). weitere Infos hier

mkfs.btrfs -L "ARCH" -m raid1 -d raid0 /dev/sda2 /dev/sdb1

die swap erstelle ich mit

mkswap -L "SWAP" /dev/sda3


Die Installation

Als erstes muß man die Subvolumen erzeugen und dafur bindet man die Root-Partition sda2 ein, sdb1 wird dann automatisch mit eingebunden.

mount /dev/sda2 /mnt/


Die Subvolume erzeugen, ich brauche /=@ home=@home Daten=@daten pkg=@pkg .snapshots=@snapshots

btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@daten
btrfs subvolume create /mnt/@pkg
btrfs subvolume create /mnt/@snapshots


Diese subvolume sind alle gleichberechtigt wie man mit btrfs subvolume list -p /mnt sehen kann

[Amber@DX1701 /]$ sudo btrfs subvolume list -p /mnt
ID 257 gen 8 parent 5 top level 5 path @
ID 258 gen 9 parent 5 top level 5 path @home
ID 259 gen 10 parent 5 top level 5 path @pkg
ID 260 gen 11 parent 5 top level 5 path @snapshots
ID 261 gen 12 parent 5 top level 5 path @daten
[Amber@DX1701 /]$ 


alle liegen im top level 5 so wird mit ein snapshot von / also @ auch nur dieses gesichert, @home, @pkg, @snapshots, @daten bleiben aussen vor.
Da das System in / also @ installiert werden soll muß jetzt sda2 ausgehängt werden mit

umount /mnt


und @ entsprechend nach /mnt gemountet und zwar so wie es in der fstab stehen soll,wer keine SSD hat eben kein ssd usw.

mount -o rw,noatime,compress=lzo,ssd,space_cache,subvol=@  /dev/sdc2 /mnt


es müssen nun die Verzeichnisse angelegt werden

mkdir /mnt/home/
mkdir /mnt/boot/
mkdir /mnt/.snapshots/
mkdir -p /mnt/home/Daten/
mkdir -p /mnt/var/cache/pacman/pkg/


das -p steht für übergeordnete Verzeichnisse erzeugen was mit dem Verzeichniss pkg ja der Fall ist.
Jetzt kann der Rest eingebunden werden mit

mount -o rw,noatime,compress=lzo,ssd,space_cache,subvol=@home /dev/sdc2 /mnt/home/
mount -o rw,noatime,compress=lzo,ssd,space_cache,subvol=@pkg /dev/sdc2 /mnt/var/cache/pacman/pkg/
mount -o rw,noatime,compress=lzo,ssd,space_cache,subvol=@daten /dev/sdc2 /mnt/home/Daten/
mount -o rw,noatime,compress=lzo,ssd,space_cache,subvol=@snapshots /dev/sdc2 /mnt/.snapshots/
mount -o rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro /dev/sda1 /boot
swapon /dev/sda3

da alles vorbereitet ist Laufwerke eingebunden, diese mount-Parameter werden in der fstab durch genfstab übernommen. Daher kann die Installation starten mit

pacstrap /mnt base base-devel wpa_supplicant btrfs-progs

alles weitere unter

bitte genau nach Anleitung vorgehen, die fstab überprüfen. Diese sollte ungefähr so aussehen (hier ein EFI-SYSTEM)

# /dev/sda2 LABEL=ARCH
UUID=e3fdba80-b449-4266-8603-96691741c669       /                       btrfs   rw,noatime,compress=lzo,ssd,space_cache,subvol=@                                                     0 0
# /dev/sda1
UUID=10F4-2424                                  /boot                   vfat    rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 2
# /dev/sda2 LABEL=ARCH
UUID=e3fdba80-b449-4266-8603-96691741c669       /home                   btrfs   rw,noatime,compress=lzo,ssd,space_cache,subvol=@home                                                 0 0
# /dev/sda2 LABEL=ARCH
UUID=e3fdba80-b449-4266-8603-96691741c669       /var/cache/pacman/pkg   btrfs   rw,noatime,compress=lzo,ssd,space_cache,subvol=@pkg                                                  0 0
# /dev/sda2 LABEL=ARCH
UUID=e3fdba80-b449-4266-8603-96691741c669       /home/Amber/Daten      btrfs   rw,noatime,compress=lzo,ssd,space_cache,subvol=@daten                                                0 0
# /dev/sda2 LABEL=ARCH
UUID=e3fdba80-b449-4266-8603-96691741c669       /.snapshots             btrfs   rw,noatime,compress=lzo,ssd,space_cache,subvol=@snapshots                                            0 0
# /dev/sda3 LABEL=swap_arch
UUID=417b4d91-b330-4a29-9c26-a14935add34c       none                    swap    defaults


Selbstredend das die UUID anders ist oder Labels benutzt werden, je nach dem.
Den Bootloader prüfen, die Linuxzeile muß angepasst werden mit rootflags=subvol=@. Unter grub sieht es so aus
Beispiel = "linux /vmlinuz-linux root=UUID=e3fdba80-b449-4266-8603-96691741c669 rw rootflags=subvol=@ quiet"
unter systemctl-boot so
Beispiel = "root=LABEL=ARCH rootflags=subvol=@ rw quiet"

Wenn man sicher ist, alles korrekt ausgeführt zu haben, kommt nun der Neustart. Entfernen des Sticks und das neuinstallierte System fährt hoch.

Ist das System hochgefahren werden jetzt erstmal snapshots erstellt, dreimal. Da jetzt im User-Modus gearbeitet wird brauche ich sudo

sudo btrfs subvolume create /.snapshots/WORKING
sudo btrfs subvolume create /.snapshots/STABLE
sudo btrfs subvolume create /.snapshots/OlDSTABLE


es werden noch ein Kernel und initramfs erzeugt mit einfachen kopieren

cp /boot/vmlinuz-linux /boot/vmlinuz-linux-stable
cp /boot/initramfs-linux.img /boot/initramfs-linux-stable.img


erstelle im Bootloader-Menü entsprechend zwei neue Einträge mit rootflags statt auf /@ auf /@snapshots/WORKING und auf /@snapshots/STABLE. Wobei im Menü auf /@snapshots/STABLE auch die entsprechenden kernel und initramfs stehen sollte, vmlinuz-linux-stable und initramfs-linux-stable.img. In der fstab in /.snapshots/WORKING/etc/fstab ändert man diese Zeile:

UUID=e3fdba80-b449-4266-8603-96691741c669    /  btrfs  rw,noatime,compress=lzo,ssd,space_cache,subvol=@        0 0


in:

UUID=e3fdba80-b449-4266-8603-96691741c669     /  btrfs  rw,noatime,compress=lzo,ssd,space_cache,subvol=@snapshots/WORKING   0 0


um. So arbeiten wir nach einen Neustart, entsprechende Auswahl nur noch mit dem subvolume WORKING. Bei Updates und Systemrollback ist es wichtig.
Man kann einen passenden Menu-Abschnitt kopieren und das entscheidende ändern, wie rootflags oder linux-kernel.

Die diversen Scripte sind unter Scripte zu finden. Links folgen entsprechend.
Ein Script "Snapshot-Rollback" kommt später."

Danke an unicks.eu für die Video-Serie, die eine der wenigen ist, die es sehr anschaulich erklären Teile von den Scripten stammen von unicks.eu

have fun
Gruß Amber

Weitere Informationen: