Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: [DE] Konvertierung von ext4 zu Btrfs  (Read 6597 times)

Offline scholle1

  • User
  • Posts: 85
[DE] Konvertierung von ext4 zu Btrfs
« on: 2023/04/10, 23:08:53 »
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: [Select]
# fsck.ext4 -f /dev/sda3

e) Konvertierung zu Btrfs:
Code: [Select]
# btrfs-convert /dev/sda3    Das benötigt einige Zeit.
    Achtung: Die UUID der Partition /dev/sda3 ändert sich.


f) Das neue Btrfs Dateisystem mounten:
Code: [Select]
# mount -t btrfs /dev/sda3 /mnt/
# cd /mnt/

    Btrfs Subvolumen anzeigen:
Code: [Select]
/mnt# btrfs subvolume list .
ID 256 gen 3 top level 5 path ext2_saved

    Der Inhalt des Btrfs Dateisystems nun mit ext2_saved und .snapshots:
Code: [Select]
/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


g) Die benötigten Btrfs Subvolumen erstellen:
Code: [Select]
/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'

    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: [Select]
/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]* @/

    Das Ergebnis sollte so aussehen:
Code: [Select]
/mnt# ls -a
.  ..  @  ext2_saved  @home  @root  .snapshots  @snapshots  @tmp  @var@log

    Das Subvolumen @ als Standard setzen.
Code: [Select]
/mnt# btrfs subvolume set-default @    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: [Select]
/mnt# cd @/etc/
/mnt/@/etc# cp fstab fstab-bac

    Auskommentieren des alten tmp Eintrages:
Code: [Select]
/mnt/@/etc# sed -i 's!^tmp!# tmp!' fstab
    Suche der alten UUID von /:
Code: [Select]
/mnt/@/etc# grep '^UU.* / ' fstab
UUID=0b99b209-fa46-4ae3-ab70-b247653ad6c1 /    ext4    defaults,noatime 0 1

    Suche der neuen UUID von /:
Code: [Select]
/mnt/@/etc# blkid | grep sda3
/dev/sda3: UUID="d9772d13-bd51-4d48-9f55-60fea4d369e5" UUID_SUB="ea8...

    Ändern des / Eintrages (UUID, Dateisystemtype, und Optionen):
    (benutze deine exakten UUIDs und verwende copy&past der vorangegangenen Ausgaben, um die UUIDs einzufügen)
Code: [Select]
/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

    Einfügen der Einträge für die anderen Subvolumen:
Code: [Select]
/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

    Die Datei fstab sollte so aussehen:
Code: [Select]
/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


i) Das neue Brtfs Dateisystem aushängen und das Terminal schließen:
Code: [Select]
/mnt# cd /
# umount /mnt
# exit


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: [Select]
# 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


l) Den Bootloader GRUB aktualisieren:
Code: [Select]
# mount /boot/efi/  (nur nötig bei UEFI/GPT)
    grub.cfg sichern
Code: [Select]
# cp /boot/grub/grub.cfg /boot/grub/grub.cfg-bac
    Reaktivieren der Datei 09_siduction-btrfs und entfernen der systemd maskierungs Links.
Code: [Select]
# chmod 755 /etc/grub.d/09_siduction-btrfs
# rm /etc/systemd/system/siduction_btrfs* 2>/dev/null

    Grub aktualisieren und installieren:
Code: [Select]
# update-grub
# grub-install
    oder,
    bei BIOS/MBR, sowie UEFI/GPT mit mehreren Festplatten im PC.
# grub-install /dev/sda


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: [Select]
# snapper -c root create-config -t default /    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: [Select]
# mount /.snapshots/
# systenctl daemon-reload

    Dann einige Schlüssel-Wert Paare der Snapperkonfiguration für '/' ändern.
Code: [Select]
# snapper -c root set-config ALLOW_USERS=<Username>
# snapper -c root set-config TIMELINE_CREATE=no
    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: [Select]
# btrfs-convert -r /dev/sda3
    Der Ordner '.snapshots' muss manuell entfernt werden.
Code: [Select]
# rmdir /.snapshots   

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: [Select]
# rm /etc/fstab-bac
# rm /boot/initrd.img-6.2.9-1-siduction-amd64-bac
# rm /boot/grub/grub.cfg-bac

    Die Subvolumen anzeigen:
Code: [Select]
# 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

    Das Subvolumen ext2_saved mit Hilfe seiner ID entfernen:
Code: [Select]
# btrfs subvolume delete --subvolid 256 /
Delete subvolume (no-commit): '//ext2_saved'


ALLES ERLEDIGT

Ich hoffe die Anleitung war hilfreich.
Sollten Fragen aufkommen, bitte hier im Forum melden.
« Last Edit: 2023/04/10, 23:25:40 by scholle1 »
Je mehr Bürgerinnen und Bürger mit Zivilcourage ein Land hat, desto weniger Helden wird es einmal brauchen.
(Franka Magnani)

Offline scholle1

  • User
  • Posts: 85
Re: Konvertierung von ext4 zu Btrfs
« Reply #1 on: 2023/06/03, 21:57:02 »
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: [Select]
# mount -t btrfs /dev/sda3 /mnt/
# ls /mnt/
@  @daten  @root  @snapshots  @tmp  @var@log

Beispiel nach setzten eines Standard Subvolumens:
Code: [Select]
# 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

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: [Select]
# mount -t btrfs -o subvolid=5 /dev/sda3 /mnt/
# ls /mnt/
@  @daten  @root  @snapshots  @tmp  @var@log

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: [Select]
/mnt/@/etc# blkid -s UUID -o value /dev/sda3
d9772d13-bd51-4d48-9f55-60fea4d369e5
"grep" ist nicht notwendig.

Je mehr Bürgerinnen und Bürger mit Zivilcourage ein Land hat, desto weniger Helden wird es einmal brauchen.
(Franka Magnani)