Im Jahr 2015 habe ich einen Beitrag dazu geschrieben, wie aus Basis eines Fitlet XA10 Computers ein Router eingerichtet werden kann. Das Gerät hat seinen Dienst bisher ohne Probleme verrichtet. Doch es ist nun an der Zeit, Neurungen zu implementieren.

    Das Ziel war die Umstellung des Dateisystems auf btrfs um mittels Snapper Snapshots erstellen zu können. Da ich bereits die damals beschriebene Einrichtung in Salt-States abgebildet habe, ist nachfolgend beshrieben, wie ein Debian 10 (Buster) mit btrfs für snapper eingerichtet werden kann.

    Während der Installation wurde bereits btrfs als Dateisystem für / ausgewählt. Weitere Partition wurde nicht angelegt. Damit snapper sauber mit dem System funktioniert sind zwei Dinge notwendig.

    Umzug des Root Dateisystems in ein Subvolunme

    cd /
    btrfs subvolume snapshot / @
    btrfs sub list /
    btrfs sub set-default 259 /

    Ziel Partition definieren

    disk=/dev/sda2
    

    Aufteilung weitere Verzeichnisse in Subvolumes

    Nicht alle Informationen sollten mittels Snapper auf alte Stände zurück gesetzt werden. Dazu zählen z.B. Log-Dateien. Hierbei kann man sich gut an der Subvolume Aufteilung von SUSE orientieren.

    Für Debian halte ich folgende Verzeichnisse für sinnvoll:

    • /srv
    • /root
    • /opt
    • /home
    • /var/cache
    • /var/log
    • (/var/lib/docker/)
    • /usr/local
    • /boot/grub/x86_64-efi
      wenn kein UEFI verwendet wird, dann /boot/grub/i386-pc 

    Wenn docker betrieben werden soll, ist auch das Verzeichnis /var/lib/docker/ auf ein Subvolume zu legen. Docker legt subvolumes an, die eine spätere automatische Bereinigung der root snapshots durch snapper-cleanup.service verhindern.

    # Disk mounten
    $ mount -o subvol=@ $disk /mnt
    
    # System devices mounten
    $ for i in dev dev/pts proc run sys; do mount -o bind /$i /mnt/$i; done
    
    # Wechsel in den Snapshot @
    $ chroot /mnt
    $ cd /
    
    # Ordner im Snapshot @ bereinigen. /boot/grub/x86_64-efi gibt es noch nicht
    $ for i in /srv /root /opt /home /var/log /var/cache /usr/local /boot/grub/x86_64-efi ; do rm -r $i ; done
    $ mkdir /boot/grub
    
    # Subvolumes erstellen
    $ for i in srv root opt home var/log var/cache usr/local boot/grub/x86_64-efi; do btrfs sub create $i; done
    
    # Copy on Write für /var deaktivieren. Attribut wurd auf alle neue angelegten Dateien vererbt
    $ chattr -R +C /var
    $ exit
    $ cd /
    # $ for i in /srv /root /opt /home /var/log /var/cache /usr/local /boot/grub/x86_64-efi; do cp -afr $i/ /mnt/$i; done
    
    # Dateien kopieren
    $ for i in /srv /root /opt /home /var/log /var/cache /usr/local /boot/grub/x86_64-efi; do rsync -zahP $i/ /mnt/$i/; done

    Anpassen der /mnt/etc/fstab

    UUID=4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430 / btrfs noatime,nodiratime 0 0
    UUID=4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430 /srv btrfs subvol=/@/srv 0 0
    UUID=4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430 /root btrfs subvol=/@/root 0 0
    UUID=4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430 /opt btrfs subvol=/@/opt 0 0
    UUID=4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430 /home btrfs subvol=/@/home 0 0
    UUID=4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430 /var/log btrfs subvol=/@/var/log 0 0
    UUID=4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430 /var/cache btrfs subvol=/@/var/cache 0 0
    UUID=4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430 /usr/local btrfs subvol=/@/usr/local 0 0
    UUID=4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430 /boot/grub/x86_64-efi btrfs subvol=/@/boot/grub/x86_64-efi 0 0
    #UUID=4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430 /.snapshots btrfs subvol=/@/.snapshots 0 0
    ^ nach der Installation von snapper Kommentar entfernen
    
    UUID=1d0eb296-b60d-4f3e-ad45-c4d7ca94a122 none swap swap 0 0
    UUID=CE32-027F /boot/efi vfat umask=0077 0 1
    
    tmpfs       /tmp            tmpfs           rw,nodev,nosuid 0 0
    tmpfs       /dev/shm        tmpfs           rw,nodev,nosuid,noexec 0 0

    UUID aktualisieren

    $ blkid $disk
    $ sed 's/UUID/4a9fdfa5-aeaf-4d4f-a3b8-ab82cda95430/g' -i /mnt/etc/fstab

    Grub aktualisieren

    Grub2 ist unter Debian so eingerichtet, dass bei der Verwendung von BTRFS Subvolumes das zu bootende Subvolume in der Datei /boot/grub/grub.cfg fest eingetragen ist.

    […] rootflags=subvol=@/[…]

    Daraus resutliert Problem, dass selbst wenn mittels snapper rollback [ID] oder btrfs set-default [ID] ein anderer Snapshot zum booten ausgewählt wird, Grub diesen ignoriert. Die Lösung ist, in der Datei /mnt/etc/grub.d/10_linux in der Zeile 79 folgende Zeile zu ändern:

    Vorher: GRUB_CMDLINE_LINUX=“rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}“

    Nachher: GRUB_CMDLINE_LINUX=“${GRUB_CMDLINE_LINUX}“

    Danach Grub einmal neu schreiben:

    $ chroot /mnt
    $ update-grub

    Quelle: https://github.com/Antynea/grub-btrfs/issues/61

    Snapper installieren und einrichten

    $ apt-get install snapper
    $ snapper create-config /
    $ exit
    
    # System neustarten
    $ reboot

    Test der Snapshot Funktion

    $ snapper create --description "Vorher"
    $ apt-get install powertop
    $ snapper create --description "Nachher"
    
    $ snapper list
    #  | Typ      |Vorher # | Datum                        | Benutzer | Bereinigen | Beschreibung   | Benutzerdaten
    ---+----------+---------+------------------------------+-----------+------------+---------------+--------------
    0  | single   |         |                              |     root  |            |       current | 
    1  | single   |         | So 13 Okt 2019 16:14:27 CEST |     root  |            | minimal setup | 
    5* | single   |         | So 13 Okt 2019 16:14:50 CEST |     root  |            |               | 
    6  | single   |         | So 13 Okt 2019 16:54:23 CEST |     root  |            |       Vorher  | 
    7  | pre      |         | So 13 Okt 2019 16:54:30 CEST |     root  |     number |           apt | 
    8  | post     |      7  | So 13 Okt 2019 16:54:31 CEST |     root  |     number |           apt | 
    9  | single   |         | So 13 Okt 2019 16:54:34 CEST |     root  |            |       Nachher |
    
    $ dpkg -l | grep powertop
    ii  powertop          2.8-1+b2          amd64        diagnose issues with power consumption and management
    
    $ snapper rollback 6
    Nur-Lesen Schnappschuss des laufenden Systems erstellen. (Schnappschuss 11.)
    Lesen-Schreiben Schnappschuss des Schnappschusses 6 erstellen. (Schnappschuss 12.)
    Einstellung des Standard Subvolumens zu Schnappschuss 12.
    
    $ reboot
    $ dpkg -l | grep powertop

    Booten eines Snapshots

    Es ist auch möglich mit Schreibschutz einen bestehenden Snapshot zu booten. Was dafür benötigt wird, ist die Snapshotnummer. Anschließend kann bei einem Neustart im Grub Menü durch drücken der Taste „e“ der Boot Eintrag editiert werden. Über den Parameter rootflags kann dann der zu bottende Snapshot angegeben werden.

    linux /vmlinuz-linux initrd /initramfs-linux.img options rw cryptdevice=UUID=11111111-1111-1111-1111-111111111111:luks-11111111-1111-1111-1111-111111111111 root=UUID=2222222-2222-2222-2222-22222222222 rootfstype=btrfs rootflags=subvol=@/.snapshots/1/snapshot

    Weitere Quellen

    Ein Kommentar

    1. Hi, eine schöne Anleitung, die Darstellung ist auch super.
      🙂

      Zitat: Für Debian halte ich folgende Verzeichnisse für sinvoll: < mal anschauen

      /srv
      /root
      /opt
      /home
      /var/cache
      /var/log
      /usr/local
      /boot/grub/x86_64-efi
      wenn kein UEFI verwendet wird, dann /boot/grub/i386-pc

      Warum hast Du hier keine Klammeraffen aufgeführt, es sind doch Subvolumes, oder irre ich?

      https://rootco.de/2018-01-19-opensuse-btrfs-subvolumes/

    Leave A Reply