Arch auf BtrFS
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: