Siduction Forum > Scripting & Kernelhacking

[DE] Konvertierung von ext4 zu Btrfs

(1/1)

scholle1:
Einleitung

Die Anleitung behandelt das Konvertieren einer aktuellen siduction Installation mit dem Dateisystem ext4 zu dem Dateisystem Btrfs. Es sollen sämtliche Daten und Konfigurationen des Users erhalten bleiben. Das Ziel ist ein siduction auf Btrfs zu erhalten, dass bestmöglich einer Neuinstallation entspricht.
Gegenüber vielen Anleitungen, die im Internet zu finden sind, beziehe ich mich hier auf die Erfordernisse und Besonderheiten der siduction Installation.

Diese Anleitung habe ich mehrfach mit frisch installiertem siduction (KDE und XFCE Variante) getestet und anschließend erfolgreich auf eine meiner siduction Installationen (XFCE Variante) angewendet.

Bitte zuerst die Manpage btrfs-convert lesen, und beachten, dass ein Rollback der Konvertierung nicht möglich ist, nachdem der Befehl 'btrfs balance' ausgeführt wurde.


Warnung

Bei Arbeiten am Dateisystem besteht immer die Gefahr von Datenverlust. Es wird dringend empfohlen, alle wichtigen und persönlichen Daten auf einem externen Medium zu sichern.


Voraussetzungen

- "/" auf einer einzigen Partition (in unserem Beispiel /dev/sda3)
- Die "/"-Partition sollte mindestens 50 GB groß sein.
- Die Größe der "/"-Partition muss auch mindestens das 2,5-fache des derzeit genutzten Speicherplatzes betragen, da bei der Konvertierung ein Abbild des vorherigen Systems erstellt wird.
- Wo möglich, den Cache leeren.
- Das System muss aktuell sein. (apt update && apt full-upgrade)
- Nicht benutzte Kernel (kernel-remover) und verwaiste Pakete (apt autoremove) sollten entfernt werden.
- Systemjournal minimieren. (journalctl --vacuum-size 100M)
- Abschließend "apt clean" ausführen


Konvertierung durchführen

a) Das Paket siduction-btrfs installieren, falls es nicht bereits vorhanden ist.

b) siduction herunterladen und ein bootfähiges Medium erstellen.

c) Reboot in das Live-System, ein Terminal öffnen und zu root werden.

d) Dateisystem von /dev/sda3 prüfen. (nicht eingehangen):

--- Code: ---# fsck.ext4 -f /dev/sda3
--- End code ---


e) Konvertierung zu Btrfs:

--- Code: ---# btrfs-convert /dev/sda3
--- End code ---
    Das benötigt einige Zeit.
    Achtung: Die UUID der Partition /dev/sda3 ändert sich.


f) Das neue Btrfs Dateisystem mounten:

--- Code: ---# mount -t btrfs /dev/sda3 /mnt/
# cd /mnt/
--- End code ---

    Btrfs Subvolumen anzeigen:

--- Code: ---/mnt# btrfs subvolume list .
ID 256 gen 3 top level 5 path ext2_saved
--- End code ---

    Der Inhalt des Btrfs Dateisystems nun mit ext2_saved und .snapshots:

--- Code: ---/mnt# ls -a
.             fll             media       sys
..            home            mnt         tmp
.autorelabel  initrd.img      opt         usr
bin           initrd.img.old  proc        var
boot          lib             root        vmlinuz
dev           lib32           run         vmlinuz.old
disks         lib64           sbin        .xorgconfig-was-here
etc           libx32          .snapshots
ext2_saved    lost+found      srv
--- End code ---


g) Die benötigten Btrfs Subvolumen erstellen:

--- Code: ---/mnt# btrfs subvolume create @
Create subvolume './@'
/mnt# btrfs subvolume create @home
Create subvolume './@home'
/mnt# btrfs subvolume create @root
Create subvolume './@root'
/mnt# btrfs subvolume create @var@log
Create subvolume './@var@log'
/mnt# btrfs subvolume create @snapshots
Create subvolume './@snapshots'
/mnt# btrfs subvolume create @tmp
Create subvolume './@tmp'
--- End code ---

    Die Daten in die Subvolumen verschieben:
    Unbedingt die Reihenfolge einhalten, da wir die leeren Ordner /home, /root und /var/log im Subvolumen @ als Einhängepunkte benötigen.

--- Code: ---/mnt# rmdir lost+found  (in Btrfs nicht notwendig)
/mnt# mv home/* @home/
/mnt# mv root/.* @root/
    falls in /root auch Dateien ohne führenden Punkt existieren
/mnt# mv root/* @root/
/mnt# mv var/log/* @var@log/
/mnt# mv [b-d]* @/
/mnt# mv [f-z]* @/
/mnt# mv etc @/
/mnt# mv .[!s]* @/
--- End code ---

    Das Ergebnis sollte so aussehen:

--- Code: ---/mnt# ls -a
.  ..  @  ext2_saved  @home  @root  .snapshots  @snapshots  @tmp  @var@log
--- End code ---

    Das Subvolumen @ als Standard setzen.

--- Code: ---/mnt# btrfs subvolume set-default @
--- End code ---
    Das Subvolumen 'ext2_saved' enthält das Sicherungsimage des ursprünglichgen ext4-Dateisystems. Zu diesem Subvolumen gehört auch der Ordner '.snapshots'. Darüber hinaus sehen wir nur die neuen Subvolumen.

    Optional kann man @data anstelle von @home verwenden. Das Verzeichnis /home bleibt in @. Alle persönlichen Daten des Verzeichnisses /home/<user> verschiebt man nach @data und verlinkt sie in /home/<user>. Die Konfiguration bleibt in /home. Auf diese Weise wird die Konfiguration des Benutzers auch von System-Snapshots erfasst.


h) Anpassen der /etc/fstab:
    fstab sichern:

--- Code: ---/mnt# cd @/etc/
/mnt/@/etc# cp fstab fstab-bac
--- End code ---

    Auskommentieren des alten tmp Eintrages:

--- Code: ---/mnt/@/etc# sed -i 's!^tmp!# tmp!' fstab
--- End code ---

    Suche der alten UUID von /:

--- Code: ---/mnt/@/etc# grep '^UU.* / ' fstab
UUID=0b99b209-fa46-4ae3-ab70-b247653ad6c1 /    ext4    defaults,noatime 0 1
--- End code ---

    Suche der neuen UUID von /:

--- Code: ---/mnt/@/etc# blkid | grep sda3
/dev/sda3: UUID="d9772d13-bd51-4d48-9f55-60fea4d369e5" UUID_SUB="ea8...
--- End code ---

    Ändern des / Eintrages (UUID, Dateisystemtype, und Optionen):
    (benutze deine exakten UUIDs und verwende copy&past der vorangegangenen Ausgaben, um die UUIDs einzufügen)

--- Code: ---/mnt/@/etc# sed -i 's!<old UUID>!<new UUID>!' fstab
/mnt/@/etc# sed -i 's!ext4.*!btrfs    subvol=@,defaults,noatime,space_cache=v2,autodefrag,compress=zstd 0 1!' fstab
--- End code ---

    Einfügen der Einträge für die anderen Subvolumen:

--- Code: ---/mnt/@/etc# grep ' / ' fstab | sed -e 's!/    !/home!' -e 's!=@!=@home!' >>fstab
/mnt/@/etc# grep ' / ' fstab | sed -e 's!/    !/root!' -e 's!=@!=@root!' >>fstab
/mnt/@/etc# grep ' / ' fstab | sed -e 's!/      !/var/log!' -e 's!=@!=@var@log!' >>fstab
/mnt/@/etc# grep ' / ' fstab | sed -e 's!/  !/tmp!' -e 's!=@!=@tmp!' >>fstab
/mnt/@/etc# grep ' / ' fstab | sed -e 's!/          !/.snapshots!' -e 's!=@!=@snapshots!' -e 's!^!#!' >>fstab
--- End code ---

    Die Datei fstab sollte so aussehen:

--- Code: ---/mnt/@/etc# cat fstab
# <file system>            <mount point>  <type>  <options>  <dump>  <pass>
UUID=<new-UUID> /              btrfs    subvol=@,defaults,noatime,space_cache=v2,autodefrag,compress=zstd 0 1
# tmpfs           /tmp           tmpfs    defaults,noatime,mode=1777 0 0
UUID=<new-UUID> /root          btrfs    subvol=@root,defaults,noatime,space_cache=v2,autodefrag,compress=zstd 0 1
UUID=<new-UUID> /home          btrfs    subvol=@home,defaults,noatime,space_cache=v2,autodefrag,compress=zstd 0 1
UUID=<new-UUID> /var/log       btrfs    subvol=@var@log,defaults,noatime,space_cache=v2,autodefrag,compress=zstd 0 1
UUID=<new-UUID> /tmp           btrfs    subvol=@tmp,defaults,noatime,space_cache=v2,autodefrag,compress=zstd 0 1
#UUID=<new-UUID> /.snapshots    btrfs    subvol=@snapshots,defaults,noatime,space_cache=v2,autodefrag,compress=zstd 0 1
--- End code ---


i) Das neue Brtfs Dateisystem aushängen und das Terminal schließen:

--- Code: ---/mnt# cd /
# umount /mnt
# exit
--- End code ---


j) chroot in siduction auf Btrfs unter Verwendung des Desktop Icons
    "Siduction Chroot Helfer"


k) initrd sichern und neu erstellen:
    (verwende deine exakte Kernel Bezeichnung)

--- Code: ---# cp /boot/initrd.img-6.2.9-1-siduction-amd64 /boot/initrd.img-6.2.9-1-siduction-amd64-bac
# mkinitramfs -o /boot/initrd.img-6.2.9-1-siduction-amd64 6.2.9-1-siduction-amd64
--- End code ---


l) Den Bootloader GRUB aktualisieren:

--- Code: ---# mount /boot/efi/  (nur nötig bei UEFI/GPT)
--- End code ---

    grub.cfg sichern

--- Code: ---# cp /boot/grub/grub.cfg /boot/grub/grub.cfg-bac
--- End code ---

    Reaktivieren der Datei 09_siduction-btrfs und entfernen der systemd maskierungs Links.

--- Code: ---# chmod 755 /etc/grub.d/09_siduction-btrfs
# rm /etc/systemd/system/siduction_btrfs* 2>/dev/null
--- End code ---

    Grub aktualisieren und installieren:

--- Code: ---# update-grub
# grub-install
    oder,
    bei BIOS/MBR, sowie UEFI/GPT mit mehreren Festplatten im PC.
# grub-install /dev/sda
--- End code ---


m) chroot verlassen und in siduction auf Btrfs rebooten.


n) Snapper konfigurieren:
    Ein Terminal öffnen und root werden.
    Die Konfiguration für das Verzeichnis '/' mit dem neuen Namen 'root' erstellen.

--- Code: ---# snapper -c root create-config -t default /
--- End code ---
    Hierbei sind während der Tests gelegentlich Fehler mit Snapper aufgetreten. Es konnte keine Konfiguration erzeugt werden.
    Abhilfe gelang nur, indem die betreffenden Pakete mittels 'purge' entfernt und neu installiert wurden.
        # apt purge snapper* siduction-btrfs libbtrfs0 libsnapper6
        # apt install snapper* siduction-btrfs libbtrfs0 libsnapper6

    Nun die Datei /etc/fstab in einem Editor mit root Rechten editieren.
    Das Kommentarzeichen '#' vor der Zeile mit /.snapsnots entfernen. Die Datei speichern und den Editor schließen.

    Das Subvolumen '@snapshots' einhängen und den systemd neu laden.

--- Code: ---# mount /.snapshots/
# systenctl daemon-reload
--- End code ---

    Dann einige Schlüssel-Wert Paare der Snapperkonfiguration für '/' ändern.

--- Code: ---# snapper -c root set-config ALLOW_USERS=<Username>
# snapper -c root set-config TIMELINE_CREATE=no
--- End code ---
    Jetzt ist Snapper für das Verzeichnis "/" aktiv.
    Die Snapper Konfiguration sollte man mit Hilfe der Anleitung unter
    https://manual.siduction.org/ "Systemverwaltung > Snapper"
    an die eigenen Bedürfnisse anpassen.
   

o) Notfall Rollback von btrfs-convert:
    Wenn signifikante Probleme auftreten, ist es möglich ein Rollback der Konvertierung durchzuführen.

    Reboot in das Live-System, ein Terminal öffnen und zu root werden.

--- Code: ---# btrfs-convert -r /dev/sda3
--- End code ---

    Der Ordner '.snapshots' muss manuell entfernt werden.

--- Code: ---# rmdir /.snapshots
--- End code ---
   

p) Sicherungskopien entfernen:
    Wenn das System ordnungsgemäß funktioniert, entfernen wir die während der Konvertierung erstellen Sicherungskopien.
    Ein Terminal öffnen und zu root werden.

    Dateien entfernen:

--- Code: ---# rm /etc/fstab-bac
# rm /boot/initrd.img-6.2.9-1-siduction-amd64-bac
# rm /boot/grub/grub.cfg-bac
--- End code ---

    Die Subvolumen anzeigen:

--- Code: ---# btrfs subvolume list /
ID 256 gen 3 top level 5 path ext2_saved
ID 257 gen 283 top level 5 path @
ID 258 gen 286 top level 5 path @home
ID 269 gen 319 top level 5 path @root
ID 260 gen 328 top level 5 path @var@log
ID 261 gen 196 top level 5 path @snapshots
ID 262 gen 228 top level 5 path @tmp
--- End code ---

    Das Subvolumen ext2_saved mit Hilfe seiner ID entfernen:

--- Code: ---# btrfs subvolume delete --subvolid 256 /
Delete subvolume (no-commit): '//ext2_saved'
--- End code ---


ALLES ERLEDIGT

Ich hoffe die Anleitung war hilfreich.
Sollten Fragen aufkommen, bitte hier im Forum melden.

scholle1:
Einige Ergänzungen zum Artikel:

Zu
g) Das Subvolumen @ als Standard setzen.
siduction setzt für einen Rollback den Befehl "snapper rollback <Nr>" ein.
Wurde zuvor noch kein Standard Subvolumen gesetzt, so erledigt das jetzt Snapper
mit dem Rollback Subvolumen.
Das kann zu erheblichen Verwirrungen führen, wenn der Benutzer in der Konsole die
root-Partition gewöhnlich mittels der Gerätedatei mountete. Denn nach setzen eines
Standard Subvolumens sind die 'top level 5' Subvolumen mit diesem Befehl nicht
mehr erreichbar.

Beispiel ohne Standard Subvolumen:

--- Code: ---# mount -t btrfs /dev/sda3 /mnt/
# ls /mnt/
@  @daten  @root  @snapshots  @tmp  @var@log
--- End code ---

Beispiel nach setzten eines Standard Subvolumens:

--- Code: ---# mount -t btrfs /dev/sda3 /mnt/
# ls /mnt/
bin    dev    fll         initrd.img.old  lib64   mnt   run    usr  vmlinuz.old
boot   disks  home        lib             libx32  proc  sbin   sys  var
daten  etc    initrd.img  lib32           media   root  srv    tmp  vmlinuz

--- End code ---

Um wieder zu den 'top level 5' Subvolumen zu gelangen, muss die 'subvolid' im
Mountbefehl angegeben werden:

Beispiel mit Standard Subvolumen und Mountoption 'subvolid=5':

--- Code: ---# mount -t btrfs -o subvolid=5 /dev/sda3 /mnt/
# ls /mnt/
@  @daten  @root  @snapshots  @tmp  @var@log
--- End code ---

Aus diesem Grund wird in der Anleitung das Subvolumen @ als Standard gesetzt.
Somit erzeugt der kurze Mountbefehl von Anfang an die gleiche Ausgabe.

Zu
h) Suche der neuen UUID von /:
Es geht etwas einfacher, denn der Befehl "blkid" verfügt über Optionen um die UUID auszugeben
--- Code: ---/mnt/@/etc# blkid -s UUID -o value /dev/sda3
d9772d13-bd51-4d48-9f55-60fea4d369e5
--- End code ---
"grep" ist nicht notwendig.

Navigation

[0] Message Index

Go to full version
Powered by Advanced Topic Prefix Pro
Powered by SMFPacks WYSIWYG Editor