OpenSUSE verwendet aktuell Btrfs als Standard-Dateisystem und Snapper um regelmäßige Snapshots zu erstellen.
Beispielsweise wird vor und nach jedem Aktualisieren oder Installieren von Programmen ein Snapshot von der /-Partition erstellt.
Es lässt sich jeder Snapshot beim Start des Systems im Grub-Bootmenü auswählen und man kann direkt den Snapshot als nur-lesbares System booten um nach dem Start ein Rollback per snapper rollback
durchzuführen.
Der Name der Snapper-Konfigurationsdatei lautet: /etc/snapper/configs/root
und die Logdatei lautet: /var/log/snapper.log
Um eine Auflistung der btrfs-Subvolumes unter / zu sehen verwendet man btrfs subvolume list /
# btrfs subvolume list /
ID 257 gen 80 top level 5 path @
ID 258 gen 247 top level 257 path @/.snapshots
ID 259 gen 473 top level 258 path @/.snapshots/1/snapshot
ID 260 gen 122 top level 257 path @/boot/grub2/i386-pc
ID 261 gen 80 top level 257 path @/boot/grub2/x86_64-efi
ID 262 gen 257 top level 257 path @/home
Auflisten der vorhandenen Snapshots
für eine einfache Liste verwendet man snapper list
oder snapper ls
# snapper list
Type | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+----+-------+--------------------------+------+---------+-----------------------+--------------
single | 0 | | | root | | current |
single | 1 | | Mon Feb 5 10:39:38 2018 | root | | first root filesystem |
single | 2 | | Mon Feb 5 10:42:07 2018 | root | number | nach der Installation | important=yes
pre | 3 | | Mon Feb 5 10:54:14 2018 | root | number | zypp(zypper) | important=yes
post | 4 | 3 | Mon Feb 5 10:59:07 2018 | root | number | | important=yes
pre | 5 | | Mon Feb 5 11:48:20 2018 | root | number | zypp(zypper) | important=no
post | 6 | 5 | Mon Feb 5 11:48:21 2018 | root | number | | important=no
pre | 7 | | Mon Feb 5 11:51:45 2018 | root | number | zypp(zypper) | important=no
post | 8 | 7 | Mon Feb 5 11:52:04 2018 | root | number | | important=no
pre | 9 | | Mon Feb 5 12:43:25 2018 | root | number | zypp(zypper) | important=no
post | 10 | 9 | Mon Feb 5 12:43:27 2018 | root | number | | important=no
Typen:
single – ein einfacher Snapshot
pre / post – Vor- bzw. Nach dem Ereignis (Update, Installation von Programmen, etc.) erstellter Snapshot
Auflisten aller seperat gemachten (single) Snapshots
# snapper list -t single
# | Date | User | Description | Userdata
--+--------------------------+------+-----------------------+--------------
0 | | root | current |
1 | Mon Feb 5 10:39:38 2018 | root | first root filesystem |
2 | Mon Feb 5 10:42:07 2018 | root | nach der Installation | important=yes
Auflisten aller Pre/Post-Snapshots
# snapper list -t pre-post
Pre # | Post # | Pre Date | Post Date | Description | Userdata
------+--------+--------------------------+--------------------------+--------------+--------------
3 | 4 | Mon Feb 5 10:54:14 2018 | Mon Feb 5 10:59:07 2018 | zypp(zypper) | important=yes
5 | 6 | Mon Feb 5 11:48:20 2018 | Mon Feb 5 11:48:21 2018 | zypp(zypper) | important=no
7 | 8 | Mon Feb 5 11:51:45 2018 | Mon Feb 5 11:52:04 2018 | zypp(zypper) | important=no
9 | 10 | Mon Feb 5 12:43:25 2018 | Mon Feb 5 12:43:27 2018 | zypp(zypper) | important=no
Um zu nachzuschauen was sich zwischen den einzelnen Snapshots geändert hat, verwendet man snapper status 3..4
# snapper status 5..6
+..... /etc/rpm/macros.desktop-file-utils
+..... /etc/rpm/macros.update-desktop-files
+..... /usr/bin/desktop-file-edit
+..... /usr/bin/desktop-file-install
c..... /var/lib/rpm/Packages
c..... /var/lib/rpm/Providename
c..... /var/lib/rpm/Requirename
+ bedeutet, dass diese Datei hinzugefügt wurde
– bedeutet, dass diese Datei entfernt wurde
c bedeutet, dass sich der Inhalt dieser Datei geändert hat
wenn man es noch genauer wissen möchte, kann man sich die Veränderungen in den entsprechenden Dateien mit snapper diff 9..10
anschauen, hierbei werden sämtliche diffs der verschiedenen Dateien hintereinander ausgegeben.
# snapper diff 9..10
--- /.snapshots/9/snapshot/etc/group 2018-02-05 11:51:56.054090466 +0100
+++ /.snapshots/10/snapshot/etc/group 2018-02-05 12:43:26.751537011 +0100
@@ -46,3 +46,4 @@
maildrop:x:59:postfix
adm:x:487:
ntadmin:x:71:
+nginx:x:486:
--- /.snapshots/9/snapshot/etc/group- 2018-02-05 10:43:37.000000000 +0100
+++ /.snapshots/10/snapshot/etc/group- 2018-02-05 11:51:56.000000000 +0100
@@ -45,3 +45,4 @@
postfix:x:51:
maildrop:x:59:postfix
...
dabei kann man natürlich auch die Änderung in einer bestimmten Datei anschauen:
# snapper diff 9..10 /etc/group
--- /.snapshots/9/snapshot/etc/group 2018-02-05 11:51:56.054090466 +0100
+++ /.snapshots/10/snapshot/etc/group 2018-02-05 12:43:26.751537011 +0100
@@ -46,3 +46,4 @@
maildrop:x:59:postfix
adm:x:487:
ntadmin:x:71:
+nginx:x:486:
Änderung rückgängig machen
um die Änderungen zwischen 2 Snapshots rückgängig zu machen, benutzt man den Befehl
snapper undochange <snapshot-ID>..<snapshot-ID>
# snapper -v undochange 11..12
create:0 modify:11 delete:105
deleting /usr/share/scite/yaml.properties
deleting /usr/share/scite/vhdl.properties
deleting /usr/share/scite/verilog.properties
...
Hierbei habe ich den Parameter -v nur mit angegeben, damit die entsprechenden Änderungen angezeigt werden.
Snapshot löschen
Einen Snapshot entfernt man mit snapper delete <Snapshot-ID>
Es läst sich auch ein bestimmter Bereich mit einmal entfernen: snapper delete <Nummer1>-<Nummer2>
Ein Beispiel wäre: snapper delete 3-25
um alle Snapshots, beginnend mit der ID 3, bis zur ID 25 zu löschen.
# snapper -v delete 11
Deleting snapshot from root:
11
Andere Partition von snapper sichern lassen
hinzufügen von /home zu Snapper: snapper -c home create-config /home
Ob es funktioniert hat, kann man mit snapper list-configs
überprüfen:
Vorher
# snapper list-configs
Config | Subvolume
-------+----------
root | /
Nachher
# snapper list-configs
Config | Subvolume
-------+----------
home | /home
root | /
Snapshot manuell erstellen
Nun kann man /home wie folgt sichern: snapper -c home create --description "before the big cleanup"
Zur Überprüfung kann man snapper -c home list
verwenden:
# snapper -c home create --description "before the big cleanup"
# snapper -c home list
Type | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+---+-------+--------------------------+------+---------+------------------------+---------
single | 0 | | | root | | current |
single | 1 | | Tue Feb 6 13:38:23 2018 | root | | before the big cleanup |
Snapshot umbennen
Dies geschieht mit snapper modify --userdata "bootloader=<STRING>" <Snaphot-ID>
Beispiel:
# snapper modify --userdata "bootloader=Snapshot666" 9
Snapper Video
ein Video mit einer Demonstration von Snapper:
openSUSE | Btrfs - Snapper Basics