Debian: Einsatz von Snapper

0

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 sinvoll:

  • /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 
# 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

Teilen.

Über den Autor

Seit der Ausbildung zum Fachinformatiker Systemintegration (2002-2005) bei der DaimlerChrysler AG, beruflich im Bereich der E-Mail Kommunikation (Exchange, Linux) sowie des ActiveDirectory, mit entsprechenden Zertifizierungen (MCSE 2003, MCITP Ent.-Admin 2008, MCSE 2012, LPIC 1-3) tätig. Abgeschlossenes Studium zum Master of Science der IT-Management an der FOM sowie zertifizierter Datenschutzbeauftragter. Aktuell als Teamleiter tätig.

Antworten