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