Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:archlinux_-_minimal_server_installation_-_mit_lvm_und_btrfs_snapper

ArchLinux - Minimal Server Installation - mit LVM und Btrfs - snapper

Mein besonderer Dank gilt hier an dieser Stelle Nicolai Mladenoff (unicks.eu), welcher mich durch seine Videos auf seinem Youtube™-Kanal: unicks.eu erst auf die Idee gebracht hat, unter ArchLinux das Dateisystem Btrfs einzusetzen und mir auch wertvolle Verbesserungen zu meinen bisherigen DokuWiki-Einträgen gegeben hat. Vielen Dank noch mal an dieser Stelle!

snapper ist ein Werkzeug zur Verwaltung von Linux-Dateisystem-Snapshots. Abgesehen von der offensichtlichen Erstellung und Löschung von Snapshots, kann snapper Snapshots vergleichen und Unterschiede zwischen Snapshots rückgängig machen. Vereinfacht ausgedrückt ermöglicht dies Root- und Nicht-Root-Benutzern, ältere Versionen von Dateien anzuzeigen und Änderungen rückgängig zu machen.

* Quelle: YouTube - Channel: unicks.eu - Total Arch Linux | 3.4 Snapper auf die leichte Art!

Ab hier werden root-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um der Benutzer root zu werden, geben Sie bitte nachfolgenden Befehl ein:

$ su -
Password: 

Voraussetzungen

Für die nachfolgende Installation wird vorausgesetzt,

  1. dass eine lauffähige Version von ArchLinux mit dem Dateisystem: Btrfs vorhanden ist

Eine der unter nachfolgenden Links beschriebenen Installationen von ArchLinux wird hier als Mindestvoraussetzung angenommen:

Installation: snapper

Zum erstellen von Snapshots ist die Nutzung des Programms snapper erforderlich.

Mit nachfolgendem Befehl, kann snapper installiert werden:

[root@archlinux ~]# pacman --noconfirm -S snapper
resolving dependencies...
looking for conflicting packages...

Packages (2) boost-libs-1.72.0-4  snapper-0.8.14-1

Total Download Size:    3.33 MiB
Total Installed Size:  13.81 MiB

:: Proceed with installation? [Y/n] 
:: Retrieving packages...
 boost-libs-1.72....     2.6 MiB  9.95 MiB/s 00:00 [#####################] 100%
 snapper-0.8.14-1...   756.2 KiB  12.3 MiB/s 00:00 [#####################] 100%
(2/2) checking keys in keyring                     [#####################] 100%
(2/2) checking package integrity                   [#####################] 100%
(2/2) loading package files                         [#####################] 100%
(2/2) checking for file conflicts                    [#####################] 100%
(2/2) checking available disk space                [#####################] 100%
:: Processing package changes...
(1/2) installing boost-libs                        [#####################] 100%
Optional dependencies for boost-libs
    openmpi: for mpi support
(2/2) installing snapper                           [#####################] 100%
Optional dependencies for snapper
    pam: pam_snapper [installed]
:: Running post-transaction hooks...
(1/3) Reloading system manager configuration...
(2/3) Arming ConditionNeedsUpdate...
(3/3) Reloading system bus configuration...

Konfiguration: snapper

snapper: root

Nach der erfolgreichen Installation von snapper, soll dieser so konfiguriert werden, dass vom Btrfs: Subvolume - / (root) - Snapshots erstellt werden können.

Dazu ist die Anlage einer Konfiguration für das Btrfs: Subvolume - / (root) erforderlich, welche mit nachfolgendem Befehl erzeugt werden kann:

[root@archlinux ~]# snapper -c root create-config /

Die so neu erstellte Konfigurationsdatei ist in nachfolgendem Verzeichnis mit nachfolgendem Namen root zu finden:

  • /etc/snapper/configs/root

Mit der Erstellung der Konfiguration für das Btrfs: Subvolume - / (root), wird auch ein Btrfs: Unter-Subvolume, mit der Bezeichnung

  • .snapshots

erstellt, wie nachfolgender Befehl zeigt:

[root@archlinux ~]# btrfs subvolume list /
ID 256 gen 6 top level 5 path @tmp
ID 258 gen 7 top level 5 path @home
ID 259 gen 8 top level 5 path @var_log
ID 260 gen 9 top level 5 path @var_pkg
ID 261 gen 33 top level 5 path @root
ID 263 gen 20 top level 5 path @srv
ID 264 gen 13 top level 5 path @opt
ID 265 gen 20 top level 5 path @usr_local
ID 266 gen 15 top level 5 path @snapshots
ID 269 gen 23 top level 262 path @var/lib/portables
ID 270 gen 24 top level 262 path @var/lib/machines
ID 271 gen 33 top level 261 path .snapshots

:!: HINWEIS - Das Btrfs: Unter-Subvolume - .snapshots von root kann NICHT verwendet werden!

Erklärung

Da bei einem möglichen Zurücksetzen auf einen vorherigen Snapshot, dann die Snapshots darin ebenfalls nicht mehr vorhanden wären! - Dafür wurde ein eigenes Btrfs: Subvolume /.snapshots angelegt. Siehe auch den nachfolgenden internen Link

Um das automatisch neu erstellte Btrfs: Unter-Subvolume - .snapshots zu löschen, kann nachfolgender Befehl verwendet werden:

[root@archlinux ~]# btrfs subvolume delete /.snapshots/
Delete subvolume (no-commit): '//.snapshots'

Zur Überprüfung, ob das Entfernen auch korrekt funktioniert hat, kann nachfolgender Befehl verwendet werden:

[root@archlinux ~]# btrfs subvolume list /
ID 256 gen 6 top level 5 path @tmp
ID 258 gen 7 top level 5 path @home
ID 259 gen 8 top level 5 path @var_log
ID 260 gen 9 top level 5 path @var_pkg
ID 261 gen 34 top level 5 path @root
ID 263 gen 20 top level 5 path @srv
ID 264 gen 13 top level 5 path @opt
ID 265 gen 20 top level 5 path @usr_local
ID 266 gen 15 top level 5 path @snapshots
ID 269 gen 23 top level 262 path @var/lib/portables
ID 270 gen 24 top level 262 path @var/lib/machines

Anschließend legen wir im Wurzelverzeichnis ein neues Verzeichnis mit dem Namen

  • /.snapshots

mit nachfolgendem Befehl an:

# [root@archlinux ~]# mkdir /.snapshots

Jetzt muss nur noch die Konfigurationsdatei

  • /etc/fstab

wie folgt erweitert werden, so dass das neue Verzeichnis /.snapshots auch auf die mit der ursprünglichen Installation angelegtes Btrfs: Subvolume /.snapshots (welches KEIN Btrfs: Unter-Subvolume ist), automatisch bei jedem Start mit gemounttet wird:

[root@archlinux ~]# vim /etc/fstab
# /dev/mapper/archlinux-root LABEL=ROOT
UUID=1c250bce-9e86-4d82-b921-3eca687f8403	/         	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvol=/@root,subvol=@root	0 0
 
# /dev/mapper/archlinux-tmp LABEL=TMP
UUID=9c21c98c-57ea-4b0d-9064-4584393cc97f	/tmp      	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/	0 0
 
# /dev/mapper/archlinux-home LABEL=HOME
UUID=85d0ca9b-def5-4478-9f75-ce20b121a49d	/home     	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/	0 0
 
# /dev/mapper/archlinux-var_log LABEL=VAR_LOG
UUID=3aca2eca-ab55-4655-a844-cac43f8fea6a	/var/log  	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/	0 0
 
# /dev/mapper/archlinux-var_pkg LABEL=VAR_PKG
UUID=24b7d52d-ba82-4173-b730-daca60f076e8	/var/cache/pacman/pkg	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/	0 0
 
# /dev/mapper/archlinux-root LABEL=ROOT
UUID=1c250bce-9e86-4d82-b921-3eca687f8403	/srv      	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvol=/@srv,subvol=@srv	0 0
 
# /dev/mapper/archlinux-root LABEL=ROOT
UUID=1c250bce-9e86-4d82-b921-3eca687f8403	/opt      	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvol=/@opt,subvol=@opt	0 0
 
# /dev/mapper/archlinux-root LABEL=ROOT
UUID=1c250bce-9e86-4d82-b921-3eca687f8403	/usr/local	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvol=/@usr_local,subvol=@usr_local	0 0
 
# /dev/mapper/archlinux-root LABEL=ROOT
UUID=1c250bce-9e86-4d82-b921-3eca687f8403	/btrfs    	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/	0 0
 
# /dev/mapper/archlinux-swap LABEL=SWAP
UUID=b76e9dd3-ffc3-483d-8e2b-fd397bf7c4a8	none      	swap      	defaults  	0 0
 
# /dev/mapper/archlinux-root LABEL=ROOT
UUID=1c250bce-9e86-4d82-b921-3eca687f8403	/.snapshots         	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvol=/@snapshots,subvol=@snapshots	0 0

*Der letzte Eintrag ist hinzugekommen!

Erklärung

  • # /dev/mapper/archlinux-root LABEL=ROOT
    UUID=1c250bce-9e86-4d82-b921-3eca687f8403	/.snapshots         	btrfs     	rw,relatime,compress=zstd:3,space_cache=v2,subvol=/@snapshots,subvol=@snapshots	0 0

Hinzufügen eines Mount-Points (Einhängepunktes im Dateisystem) für das Btrfs: Subvolume - snapshots auf das Verzeichnis /.snapshots.

Um den in der Konfigurationsdatei /etc/fstab neu hinzugefügten Eintrag per Hand zu aktivieren, was sonst ja mit dem Starten des Betriebssystems erfolgen wird, kann nachfolgender Befehl verwendet werden:

[root@archlinux ~]# mount /.snapshots/

Ob das mounten von Hand erfolgreich war, kann mit nachfolgendem Befehl überprüft werden:

[root@archlinux ~]# mount | grep /dev/mapper
/dev/mapper/archlinux-root on / type btrfs (rw,relatime,compress=zstd:3,space_cache=v2,subvolid=261,subvol=/@root)
/dev/mapper/archlinux-root on /btrfs type btrfs (rw,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/)
/dev/mapper/archlinux-root on /opt type btrfs (rw,relatime,compress=zstd:3,space_cache=v2,subvolid=264,subvol=/@opt)
/dev/mapper/archlinux-root on /srv type btrfs (rw,relatime,compress=zstd:3,space_cache=v2,subvolid=263,subvol=/@srv)
/dev/mapper/archlinux-root on /var type btrfs (rw,relatime,compress=zstd:3,space_cache=v2,subvolid=265,subvol=/@usr_local)
/dev/mapper/archlinux-tmp on /tmp type btrfs (rw,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/)
/dev/mapper/archlinux-home on /home type btrfs (rw,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/)
/dev/mapper/archlinux-var_pkg on /var/cache/pacman/pkg type btrfs (rw,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/)
/dev/mapper/archlinux-var_log on /var/log type btrfs (rw,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/)
/dev/mapper/archlinux-root on /.snapshots type btrfs (rw,relatime,compress=zstd:3,space_cache=v2,subvolid=266,subvol=/@snapshots)

Um sicher zu gehen, das snapper auch weiterhin korrekt funktioniert, kann nachfolgender Befehl verwendet werden, welche den aktuellen Status aller Snapshots auflistet:

[root@archlinux ~]# snapper list
 # | Type   | Pre # | Date | User | Cleanup | Description | Userdata
---+--------+-------+------+------+---------+-------------+---------
0  | single |       |      | root |         | current     |

/etc/snapper/configs/root

Nachfolgende Einstellungen passen das Verhalten von snapper an.

  1. Es sollen KEINE stündlichen Snapshots durchgeführt werden.
  2. Die Anzahl von aufzubewahrenden Snapshots soll begrenzt werden.
  3. Die Anzahl der als wichtig gekennzeichneten Snapshots soll begrenzt werden.
[root@archlinux ~]# vim /etc/snapper/configs/root
# subvolume to snapshot
SUBVOLUME="/"
 
# filesystem type
FSTYPE="btrfs"
 
 
# btrfs qgroup for space aware cleanup algorithms
QGROUP=""
 
 
# fraction of the filesystems space the snapshots may use
SPACE_LIMIT="0.5"
 
# fraction of the filesystems space that should be free
FREE_LIMIT="0.2"
 
 
# users and groups allowed to work with config
ALLOW_USERS=""
ALLOW_GROUPS=""
 
# sync users and groups from ALLOW_USERS and ALLOW_GROUPS to .snapshots
# directory
SYNC_ACL="no"
 
 
# start comparing pre- and post-snapshot in background after creating
# post-snapshot
BACKGROUND_COMPARISON="yes"
 
 
# run daily number cleanup
NUMBER_CLEANUP="yes"
 
# limit for number cleanup
# Tachtler
# default: NUMBER_MIN_AGE="1800"
NUMBER_MIN_AGE="0"
# Tachtler
# default: NUMBER_LIMIT="50"
NUMBER_LIMIT="10"
# Tachtler
# default: NUMBER_LIMIT_IMPORTANT="10"
NUMBER_LIMIT_IMPORTANT="3"
 
 
# create hourly snapshots
# Tachtler
# default: TIMELINE_CREATE="yes"
TIMELINE_CREATE="no"
 
# cleanup hourly snapshots after some time
TIMELINE_CLEANUP="yes"
 
# limits for timeline cleanup
TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="10"
TIMELINE_LIMIT_DAILY="10"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="10"
TIMELINE_LIMIT_YEARLY="10"
 
 
# cleanup empty pre-post-pairs
EMPTY_PRE_POST_CLEANUP="yes"
 
# limits for empty pre-post-pair cleanup
EMPTY_PRE_POST_MIN_AGE="1800"

Erklärungen:

  • # run daily number cleanup
    NUMBER_CLEANUP="yes"

Falls nicht bereits auf „yes“ gesetzt, bewrikt dies, das ab einer gewissen Anzahl ältere Snaphots wieder gelöscht werden

  • # limit for number cleanup
    # Tachtler
    # default: NUMBER_MIN_AGE="1800"
    NUMBER_MIN_AGE="0"

Bewrikt, das das Alter eines Snapshats ignoriert und nur die Anzahl entscheinden ist, da sonst ggf. unbeabsichtigt automatisch evtl. ein Snapshot gelöscht wird.

  • # Tachtler
    # default: NUMBER_LIMIT="50"
    NUMBER_LIMIT="10"

Anzahl der zu speichernden Snapshots.

  • # Tachtler
    # default: NUMBER_LIMIT_IMPORTANT="10"
    NUMBER_LIMIT_IMPORTANT="3"

Anzahl der zu speichernden - wichtigen - Snapshots.

  • # create hourly snapshots
    # Tachtler
    # default: TIMELINE_CREATE="yes"
    TIMELINE_CREATE="no"

Verhindert, das jede Stunde automatisch ein Snapshot erstellt wird.

/usr/lib/systemd/system/snapper-cleanup.timer

Damit jedoch stündlich durch den systemd - timer ältere, anhand der Anzahl der vorhandenen Snapshots automatishc auch gelöscht werden können, muss mit nachfolgendem Befehl der mit der Installation mit gekommene Timer

  • /usr/lib/systemd/system/snapper-cleanup.timer

aktiviert werden:

[root@archlinux /]# systemctl enable --now snapper-cleanup.timer
Created symlink /etc/systemd/system/timers.target.wants/snapper-cleanup.timer → /usr/lib/systemd/system/snapper-cleanup.timer.

* Die Angabe des Parameters –now bewirkt die sofortige Ausführung!

Ob dies korrekt funktioniert hat, kann mit nachfolgendem Befehl überprüft werden:

[root@archlinux /]# systemctl list-timers
NEXT                        LEFT     LAST                        PASSED   UNIT                         ACTIVATES                     
Tue 2020-12-08 00:00:00 CET 6h left  n/a                         n/a      shadow.timer                 shadow.service                
Tue 2020-12-08 17:10:19 CET 23h left Mon 2020-12-07 17:10:19 CET 5min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Tue 2020-12-08 17:15:22 CET 23h left Mon 2020-12-07 17:15:22 CET 30s ago  snapper-cleanup.timer        snapper-cleanup.service       

3 timers listed.
Pass --all to see loaded but inactive timers, too.

Installation: grub-btrfs

Damit aus dem mit snapper erstellten Snapshots auch automatisch - Boot-Menü-Einträge für GRUB erstellt werden, ist die Installation des Programms

erforderlich.

Mit nachfolgendem Befehl, kann snapper installiert werden:

[root@archlinux ~]# pacman --noconfirm -S grub-btrfs
resolving dependencies...
looking for conflicting packages...

Packages (1) grub-btrfs-4.7.1-1

Total Download Size:   0.02 MiB
Total Installed Size:  0.06 MiB

:: Proceed with installation? [Y/n] 
:: Retrieving packages...
 grub-btrfs-4.7.1...    23.1 KiB  1155 KiB/s 00:00 [#################] 100%
(1/1) checking keys in keyring                     [#################] 100%
(1/1) checking package integrity                   [#################] 100%
(1/1) loading package files                         [#################] 100%
(1/1) checking for file conflicts                    [#################] 100%
(1/1) checking available disk space                [#################] 100%
:: Processing package changes...
(1/1) installing grub-btrfs                        [#################] 100%
Optional dependencies for grub-btrfs
    snapper: Snapper support [installed]
:: Running post-transaction hooks...
(1/3) Reloading system manager configuration...
(2/3) Arming ConditionNeedsUpdate...
(3/3) Updating linux initcpios...
==> Building image from preset: /etc/mkinitcpio.d/linux-lts.preset: 'default'
  -> -k /boot/vmlinuz-linux-lts -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-lts.img
==> Starting build: 5.4.81-1-lts
  -> Running build hook: [base]
  -> Running build hook: [udev]
  -> Running build hook: [autodetect]
  -> Running build hook: [modconf]
  -> Running build hook: [block]
  -> Running build hook: [lvm2]
  -> Running build hook: [btrfs]
  -> Running build hook: [filesystems]
  -> Running build hook: [keymap]
  -> Running build hook: [keyboard]
==> Generating module dependencies
==> Creating gzip-compressed initcpio image: /boot/initramfs-linux-lts.img
==> Image generation successful
==> Building image from preset: /etc/mkinitcpio.d/linux-lts.preset: 'fallback'
  -> -k /boot/vmlinuz-linux-lts -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-lts-fallback.img -S autodetect
==> Starting build: 5.4.81-1-lts
  -> Running build hook: [base]
  -> Running build hook: [udev]
  -> Running build hook: [modconf]
  -> Running build hook: [block]
==> WARNING: Possibly missing firmware for module: aic94xx
==> WARNING: Possibly missing firmware for module: wd719x
  -> Running build hook: [lvm2]
  -> Running build hook: [btrfs]
  -> Running build hook: [filesystems]
  -> Running build hook: [keymap]
  -> Running build hook: [keyboard]
==> Generating module dependencies
==> Creating gzip-compressed initcpio image: /boot/initramfs-linux-lts-fallback.img
==> Image generation successful

Die Konfiguration für das Programm grub-btrfs ist in nachfolgendem Verzeichnis mit nachfolgendem Namen zu finden:

  • /etc/grub.d/41_snapshots-btrfs

:!: HINWEIS - Anpassungen müssen hier keine erfolgen!

Installation: snap-pac

Hierbei handelt es sich um eine Reihe von pacman-„Hooks“ und ein Skript, das automatisch bewirkt, dass snapper ein Snapshot vor und nach einer pacman-Transaktionen durchgeführt wird.

Dies bietet eine einfache Möglichkeit, Änderungen an einem System nach einer pacman-Transaktion rückgängig zu machen.

Mit nachfolgendem Befehl, kann snap-pac installiert werden:

[root@archlinux ~]# pacman --noconfirm -S snap-pac
resolving dependencies...
looking for conflicting packages...

Packages (1) snap-pac-2.3.1-2

Total Download Size:   0.02 MiB
Total Installed Size:  0.03 MiB

:: Proceed with installation? [Y/n] 
:: Retrieving packages...
 snap-pac-2.3.1-2-any   15.5 KiB   516 KiB/s 00:00 [#################] 100%
(1/1) checking keys in keyring                     [#################] 100%
(1/1) checking package integrity                   [#################] 100%
(1/1) loading package files                         [#################] 100%
(1/1) checking for file conflicts                    [#################] 100%
(1/1) checking available disk space                [#################] 100%
:: Processing package changes...
(1/1) installing snap-pac                          [#################] 100%
:: Running post-transaction hooks...
(1/3) Arming ConditionNeedsUpdate...
(2/3) Performing snapper post snapshots for the following configurations...
(3/3) You are installing snap-pac, so no post transaction snapshots will be taken.

Konfiguration: grub-btrfs.path.service

Nachfolgender systemd-Dienst überwacht das standardmässig Verzeichnis

  • /.snapshots

auf Änderungen und erstellt daraufhin die Konfigurationsdaten für den „Bootloader“ - GRUB neu.

:!: HINWEIS - Falls ein anderes Verzeichnis als /.snapshots überwacht werden soll, ist dies in einer neu zu erstellenden Konfigurationsdatei in nachfolgenden Verzeichnis mit ebenfalls nachfolgendem Namen zu erstellen:

  • /etc/systemd/system/grub-btrfs.path.d/override.conf

:!: HINWEIS - Eine Vorlage für den Inhalt, hält die Konfigurationsdatei /usr/lib/systemd/system/grub-btrfs.path bereit.

:!: ACHTUNG - Hier ist aktuelle keine Anpassung an der Konfigurationsdatei durchzuführen!

grub-btrfs.path.service-Dienst/Deamon einrichten

Um den grub-btrfs.path.service-Dienst/Deamon als Hintergrundprozesse auch nach einem Neustart des Servers zur Verfügung zu haben, soll der Dienste/Daemons mit dem Server mit gestartet werden, was mit nachfolgenden Befehlen realisiert werden kann:

[root@archlinux ~]# systemctl enable grub-btrfs.path
Created symlink /etc/systemd/system/multi-user.target.wants/grub-btrfs.path → /usr/lib/systemd/system/grub-btrfs.path.

Eine Überprüfung, ob beim Neustart des Server der grub-btrfs.path-Dienst/Deamon wirklich mit gestartet wird, kann mit nachfolgendem Befehl erfolgen und sollte eine Anzeige, wie ebenfalls nachfolgend dargestellt ausgeben:

[root@archlinux ~]# systemctl list-unit-files --type=service | grep grub-btrfs
grub-btrfs.service                         static          -

bzw.

[root@archlinux ~]# systemctl is-enabled grub-btrfs
static

Abschließend kann der SSH-Dienst/Daemon - grub-btrfs.path mit nachfolgendem Befehl gestartet werden:

[root@archlinux ~]# systemctl start --now grub-btrfs.path

Eine Überprüfung ob der grub-btrfs.path.service-Dienst/Daemon auch ordnungsgemäß gestartet wurde, kann durch ausführen des nachfolgenden Befehls durchgeführt werden und sollte eine Ausgabe in etwa wie nachfolgende zur Folge haben:

[root@archlinux ~]# systemctl status grub-btrfs.path
● grub-btrfs.path - Monitors for new snapshots
     Loaded: loaded (/usr/lib/systemd/system/grub-btrfs.path; enabled; ven>
     Active: active (waiting) since Mon 2020-12-07 17:36:55 CET; 26s ago
   Triggers: ● grub-btrfs.service

Dec 07 17:36:55 vml010 systemd[1]: Started Monitors for new snapshots.

Praxis

Auf einen snapshot zurücksetzen

Nachfolgender soll das Programm screenfatch installoert werden und anschließend die Installation durch starten eines vorhergehenden Snapshots rückgängig gemacht werden.

Mit nachfolgendem Befehl, kann screenfetch installiert werden:

[root@archlinux ~]# pacman --noconfirm -S screenfetch
resolving dependencies...
looking for conflicting packages...

Packages (18) bc-1.07.1-4  libx11-1.7.0-1  libxau-1.0.9-3  libxcb-1.14-1
              libxcomposite-0.4.5-3  libxdmcp-1.1.3-3  libxext-1.3.4-3
              libxfixes-5.0.3-4  libxi-1.7.10-3  libxinerama-1.1.4-3
              libxrender-0.9.10-4  libxtst-1.2.3-4  libxxf86vm-1.1.4-4
              xcb-proto-1.14.1-3  xorg-xdpyinfo-1.3.2-4
              xorg-xprop-1.2.5-1  xorgproto-2020.1-1  screenfetch-3.9.1-1

Total Download Size:    3.95 MiB
Total Installed Size:  17.84 MiB

:: Proceed with installation? [Y/n] 
:: Retrieving packages...
 bc-1.07.1-4-x86_64     87.8 KiB  2.14 MiB/s 00:00 [#################] 100%
 xcb-proto-1.14.1...   108.0 KiB  3.52 MiB/s 00:00 [#################] 100%
 libxdmcp-1.1.3-3...    27.4 KiB  0.00   B/s 00:00 [#################] 100%
 libxau-1.0.9-3-x...    10.9 KiB  0.00   B/s 00:00 [#################] 100%
 libxcb-1.14-1-x86_64  999.8 KiB  8.14 MiB/s 00:00 [#################] 100%
 xorgproto-2020.1...   237.9 KiB  11.6 MiB/s 00:00 [#################] 100%
 libx11-1.7.0-1-x...     2.1 MiB  9.42 MiB/s 00:00 [#################] 100%
 libxext-1.3.4-3-...   107.3 KiB  10.5 MiB/s 00:00 [#################] 100%
 libxi-1.7.10-3-x...   148.3 KiB  14.5 MiB/s 00:00 [#################] 100%
 libxfixes-5.0.3-...     13.4 KiB  0.00   B/s 00:00 [#################] 100%
 libxtst-1.2.3-4-...    29.5 KiB  0.00   B/s 00:00 [#################] 100%
 libxxf86vm-1.1.4...    15.7 KiB  0.00   B/s 00:00 [#################] 100%
 libxrender-0.9.1...    26.0 KiB  0.00   B/s 00:00 [#################] 100%
 libxcomposite-0....    11.4 KiB  0.00   B/s 00:00 [#################] 100%
 libxinerama-1.1....    10.1 KiB  1015 KiB/s 00:00 [#################] 100%
 xorg-xdpyinfo-1....    16.0 KiB  0.00   B/s 00:00 [#################] 100%
 xorg-xprop-1.2.5...    26.3 KiB  0.00   B/s 00:00 [#################] 100%
 screenfetch-3.9....    50.9 KiB  4.97 MiB/s 00:00 [#################] 100%
(18/18) checking keys in keyring                   [#################] 100%
(18/18) checking package integrity                 [#################] 100%
(18/18) loading package files                       [#################] 100%
(18/18) checking for file conflicts                  [#################] 100%
(18/18) checking available disk space              [#################] 100%
:: Running pre-transaction hooks...
(1/1) Performing snapper pre snapshots for the following configurations...
==> root: 1
:: Processing package changes...
( 1/18) installing bc                              [#################] 100%
( 2/18) installing xcb-proto                       [#################] 100%
( 3/18) installing libxdmcp                        [#################] 100%
( 4/18) installing libxau                          [#################] 100%
( 5/18) installing libxcb                          [#################] 100%
( 6/18) installing xorgproto                       [#################] 100%
( 7/18) installing libx11                          [#################] 100%
( 8/18) installing libxext                         [#################] 100%
( 9/18) installing libxi                           [#################] 100%
(10/18) installing libxfixes                        [#################] 100%
(11/18) installing libxtst                         [#################] 100%
(12/18) installing libxxf86vm                      [#################] 100%
(13/18) installing libxrender                      [#################] 100%
(14/18) installing libxcomposite                   [#################] 100%
(15/18) installing libxinerama                     [#################] 100%
(16/18) installing xorg-xdpyinfo                   [#################] 100%
(17/18) installing xorg-xprop                      [#################] 100%
(18/18) installing screenfetch                     [#################] 100%
Optional dependencies for screenfetch
    scrot: to take screenshot
:: Running post-transaction hooks...
(1/3) Arming ConditionNeedsUpdate...
(2/3) Updating the info directory file...
(3/3) Performing snapper post snapshots for the following configurations...
==> root: 2

Anhand der Ausgabe bei der Installation, kann in Erfahrung gebracht werden das zwei Snapshots erstellt wurden:

  1. Snapshot: 1 - Vor der Installation von screenfetch
  2. Snapshot: 2 - Nach der Installation von screenfetch

Dies kann auch durch Abfrage mit nachfolgendem Befehl bestätigt werden:

[root@archlinux ~]# snapper list
 # | Type   | Pre # | Date                            | User | Cleanup | Description                                                                 | Userdata
---+--------+-------+---------------------------------+------+---------+-----------------------------------------------------------------------------+---------
0  | single |       |                                 | root |         | current                                                                     |         
1  | pre    |       | Mon 07 Dec 2020 05:39:43 PM CET | root | number  | pacman --noconfirm -S screenfetch                                           |         
2  | post   |     1 | Mon 07 Dec 2020 05:39:44 PM CET | root | number  | bc libx11 libxau libxcb libxcomposite libxdmcp libxext libxfixes libxi l... |

Eine Überprüfung, ob das Programm screenfetch aufgrufen und ausgeführt werden kann, kann durch Aufruf von screenfetch durchgeführt werden:

root@archlinux ~]# screenfetch
                   -`                 
                  .o+`                 root@archlinux
                 `ooo/                 OS: Arch Linux 
                `+oooo:                Kernel: x86_64 Linux 5.4.81-1-lts
               `+oooooo:               Uptime: 47m
               -+oooooo+:              Packages: 198
             `/:-:++oooo+:             Shell: bash 5.0.18
            `/++++/+++++++:            Disk: 13G / 228G (6%)
           `/++++++++++++++:           CPU: Intel Core (Skylake, IBRS) @ 2.304GHz
          `/+++ooooooooooooo/`         GPU: Red Hat, Inc. Virtio GPU (rev 01)
         ./ooosssso++osssssso+`        RAM: 224MiB / 983MiB
        .oossssso-````/ossssss+`      
       -osssssso.      :ssssssso.     
      :osssssss/        osssso+++.    
     /ossssssss/        +ssssooo/-    
   `/ossssso+/:-        -:/+osssso+-  
  `+sso+:-`                 `.-/+oso: 
 `++:.                           `-/+/
 .`                                 `/

Um jetzt die Installation von screenfetch rückgängig machen zu können, kann nachfolgender Befehl nun angewendet werden:

[root@archlinux ~]# snapper -v undochange 1..2
create:0 modify:2 delete:4235
...

Ein erneuter Aufruf von screenfetch, sollte nun zu einer Fehlermeldung führen und anzeigen, dass das Programm nicht gefunden werden kann und somit auch nicht installiert ist:

[root@archlinux ~]# screenfetch 
-bash: /usr/bin/screenfetch: No such file or directory

In einen snapshot starten (booten)

Alle möglichen Snapshots in die gestartet werden kann, sind in einem Untermenü beim Neustart in GRUB ersichtlich, wie nachfolgende Bildschirmkopien zeigen:

Neustart GRUB

Druch Auswahl des GRUB-Menüpunktes Arch Linux snapshots, sollte in etwa ein Bildschirm wie nachfolgender zum Vorschein kommen:

Neustart GRUB - Arch Linux snapshots

Durch Auswahl des obersten Menüpunktes, sollte nun eine Anzeige wie nachfolgende erscheinen, in dem der zu startende (boot) Kernel ausgewählt werden kann:

Neustart GRUB - Arch Linux snapshots - Auswahl Kernel

Nach einem erfolgreichen Startvorgang (booten), kann das Programm screenfetch wieder verwendet werden, wie nachfolgender Aufruf zeigt:

[root@archlinux ~]# screenfetch 
                   -`                 
                  .o+`                 root@archlinux
                 `ooo/                 OS: Arch Linux 
                `+oooo:                Kernel: x86_64 Linux 5.4.81-1-lts
               `+oooooo:               Uptime: 47m
               -+oooooo+:              Packages: 198
             `/:-:++oooo+:             Shell: bash 5.0.18
            `/++++/+++++++:            Disk: 13G / 228G (6%)
           `/++++++++++++++:           CPU: Intel Core (Skylake, IBRS) @ 2.304GHz
          `/+++ooooooooooooo/`         GPU: Red Hat, Inc. Virtio GPU (rev 01)
         ./ooosssso++osssssso+`        RAM: 224MiB / 983MiB
        .oossssso-````/ossssss+`      
       -osssssso.      :ssssssso.     
      :osssssss/        osssso+++.    
     /ossssssss/        +ssssooo/-    
   `/ossssso+/:-        -:/+osssso+-  
  `+sso+:-`                 `.-/+oso: 
 `++:.                           `-/+/
 .`                                 `/
[root@archlinux ~]#

:!: ACHTUNG - Der gestartet Snapshot ist ein „read-only“ Snapshot !!!

Der Versuch in das Btrfs: Subvolume - / (root) zu schreiben schlägt fehl, wie nachfolgendes Beispiel zeigt:

[root@archlinux ~]# touch /test.txt
touch: cannot touch '/test.txt': Read-only file system

Damit wieder eine read-write Snapshot aus dem aktuell gestarteten Snapshot wird, sind nachfolgende Schritte erforderlich.

Einen read-write snapshot erzeugen

Mit nachfolgenden Befehlen und einem Neustart wird aus einem read-only Snapshot wieder ein read-write Snapshot.

Nachfolgender Befehl überprüft, welcher Snapshot aktuell gemountet ist (Hier die Nummer 4):

[root@archlinux ~]# mount | grep /@snapshots/
/dev/mapper/archlinux-root on / type btrfs (rw,relatime,space_cache=v2,subvol=/@snapshots/2/snapshot)

Um jetzt mit einen Rollback (zurücksetzen) auch auf einen beliebigen startbaren (boot) Snapshot gehen zu können, ist es erforderlich aus dem read-only Snapshot wieder einen read-write Snapshot zu erstellen, was mit nachfolgendem Befehl durchgeführt werden kann:

[root@archlinux ~]# snapper -a classic rollback 2
Ambit is classic.
Creating read-only snapshot of current system. (Snapshot 3.)
Creating read-write snapshot of snapshot 2. (Snapshot 4.)
Setting default subvolume to snapshot 4.

Wichtig ist hier der Snapshot mit der Nummer 4, welcher einen startbereiten (boot) read-write Snapshot darstellt.

:!: WICHTIG - Leider kann nur über das editieren beim Starten via GRUB dieser Snapshot gestartet (boot) werden !!!

Nachfolgend ist wieder ein Neustart durchzuführen:

[root@archlinux ~]# systemctl reboot

Neustart GRUB

Durch Auswahl des GRUB-Menüpunktes Arch Linux snapshots, sollte in etwa ein Bildschirm wie nachfolgender zum Vorschein kommen:

Neustart GRUB - Arch Linux snapshots

Durch Auswahl des obersten Menüpunktes, sollte nun eine Anzeige wie nachfolgende erscheinen, in dem der zu startende (boot) Kernel ausgewählt werden kann:

Neustart GRUB - Arch Linux snapshots - Kernel Auswahl

:!: WICHTIG - Jetzt ist die [e]-Taste zu drücken um den GRUB-Kernel-Bootmenü-Eintrag editieren zu können !!!

Neustart GRUB - Arch Linux snapshots - Kernel Auswahl - Editiert

:!: WICHTIG - Ersetzen der Snapshot-Nummer 2 durch die Snapshot_nummer 4 !!!

:!: WICHTIG - Um die Änderungen wirksam werden zu lassen, ist die [F10]-Taste oder [Ctrl-x]|[Strg-x] zu betätigen !!!

Jetzt kann mit nachfolgendem Befehl überprüft werden, ob der Snapshot mit der Nummer 12 gestartet (boot) wurde:

[root@archlinux ~]# mount | grep /@snapshots/
/dev/mapper/archlinux-root on / type btrfs (rw,relatime,space_cache=v2,subvol=/@snapshots/4/snapshot)

Und ob dieser auch ein read-write Snapshot ist, wie nachfolgender Befehl beweist:

[root@archlinux ~]# touch /test.txt
[root@archlinux ~]# ls -la /test.txt
-rw-r--r-- 1 root root 0 Dec  7 18:14 /test.txt

:!: WICHTIG - Damit zukünftig von diesem Snapshot - standardmässig gestartet wird, muss nachfolgender Befehl ausgeführt werden:

Hier wird der Bootloader - hier GRUB neu installiert:

[root@archlinux ~]# grub-install /dev/vda
Installing for i386-pc platform.
Installation finished. No error reported.

Anschließend muss noch der Bootloader - hier GRUB neu konfiguriert werden:

[root@archlinux ~]# grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux-lts
Found initrd image: /boot/initramfs-linux-lts.img
Found fallback initrd image(s) in /boot: initramfs-linux-lts-fallback.img
Detecting snapshots ...
Info: Separate boot partition not detected 
Info: snapper detected, using config 'root'
Found snapshot: 2020-12-07 18:00:31 | @snapshots/4/snapshot | single | writable copy of #2
Found snapshot: 2020-12-07 18:00:31 | @snapshots/3/snapshot | single | rollback backup
Found snapshot: 2020-12-07 17:39:44 | @snapshots/2/snapshot | post   | bc libx11 libxau libxcb libxcomposite libxdmcp libxext libxfixes libxi l...
Found snapshot: 2020-12-07 17:39:43 | @snapshots/1/snapshot | pre    | pacman --noconfirm -S screenfetch
Found 4 snapshot(s)
done
[root@archlinux ~]# systemctl reboot

Nach einem erneuten Neustart sollte jetzt der Snapshot mit der Nummer 6 der Snapshot sein, welcher auch über den Standardeintrag gestartet wird, was nachfolgende Bildschirmkopie zeigt:

Neustart GRUB - Standard Kernel

Eine Überprüfung, welcher Snapshot gestartet (boot) ist, kann nochmals mit nachfolgendem Befehl durchgeführt werden:

[root@archlinux ~]# mount | grep /@snapshots/
/dev/mapper/archlinux-root on / type btrfs (rw,relatime,space_cache=v2,subvol=/@snapshots/4/snapshot)

Einen snapshot zu root zurücksetzen

Nachdem in einen read-write Snapshot gestartet (boot) wurde, soll dieser wieder zum root gemacht werden, damit ggf. später auch der aktuelle Snapshot von dem gerade gestartet (boot) wurde auch gelöscht werden kann.

Dazu soll zuerst der „alte“ Stand von root mit nachfolgendem Befehl gelöscht werden:

[root@archlinux ~]# rm /btrfs/@root -rf

Anschließend soll ein read-write - Snapshot vom aktuellen Snapshot von dem gerade gebootet wurde via snapper kopiert werden, was mit nachfolgendem Befehl durchgeführt werden soll:

[root@archlinux ~]# btrfs subvol snapshot /.snapshots/4/snapshot /btrfs
Create a snapshot of '/.snapshots/4/snapshot' in '/btrfs/snapshot'

Der so erzeugte read-write Snapshot in nachfolgendem Verzeichnis mit nachfolgendem Namen

  • /btrfs/snapshot

muss nun noch umbenannt werden, was mit nachfolgendem Befehl durchgeführt werden soll:

[root@archlinux ~]# mv /btrfs/snapshot /btrfs/@root

Abschließend muss nun die GRUB-Konfigurationsdatei in nachfolgendem Verzeichnis mit nachfolgendem Namen

  • /boot/grub/grub.cfg

noch entsprechend angepasst werden.

[root@archlinux ~]# vim /boot/grub/grub.cfg

:!: WICHTIG - font=„/snapshots/4/snapshot/usr/share/grub/unicode.pf2“ muss gegen font=„/usr/share/grub/unicode.pf2“ ausgetauscht werden.

:!: HINWEIS - Alle Einträge mit snapshots/4/snapshot müssen gegen root ausgetauscht werden!

Nachfolgend eine Liste der relevanten Stellen (nur relevanter Ausschnitt):

  •     font="/usr/share/grub/unicode.pf2"

Eine Suche im Editor nach font=„ findet die Stelle am schnellsten.

  •         linux   /@snapshots/4/snapshot/boot/vmlinuz-linux-lts root=/dev/mapper/archlinux-root rw rootflags=subvol=@snapshots/4/snapshot  loglevel=3 net.ifnames=0

menuentry 'Arch Linux' - Wichtig ist hier alle Angabe @snapshots/4/snapshot, die wie oben gezeigt, angepasst werden müssen und gegen @root ausgetauscht werden müssen.

  •         initrd  /@snapshots/4/snapshot/boot/initramfs-linux-lts.img

menuentry 'Arch Linux' - initrd Wichtig ist hier alle Angabe @snapshots/4/snapshot, die wie oben gezeigt, angepasst werden müssen und gegen @root ausgetauscht werden müssen.

  •                 linux   /@snapshots/4/snapshot/boot/vmlinuz-linux-lts root=/dev/mapper/archlinux-root rw rootflags=subvol=@snapshots/4/snapshot  loglevel=3 net.ifnames=0

submenu 'Advanced options for Arch Linux' - Wichtig ist hier alle Angabe @snapshots/4/snapshot, die wie oben gezeigt, angepasst werden müssen und gegen @root ausgetauscht werden müssen.

  •                 initrd  /@snapshots/4/snapshot/boot/initramfs-linux-lts.img

submenu 'Advanced options for Arch Linux' - initrd Wichtig ist hier alle Angabe @snapshots/4/snapshot, die wie oben gezeigt, angepasst werden müssen und gegen @root ausgetauscht werden müssen.

  •                 linux   /@snapshots/4/snapshot/boot/vmlinuz-linux-lts root=/dev/mapper/archlinux-root rw rootflags=subvol=@snapshots/4/snapshot  loglevel=3 net.ifnames=0

menuentry 'Arch Linux, with Linux linux-lts (fallback initramfs)' - Wichtig ist hier alle Angabe @snapshots/4/snapshot, die wie oben gezeigt, angepasst werden müssen und gegen @root ausgetauscht werden müssen.

  •                 initrd  /@snapshots/4/snapshot/boot/initramfs-linux-lts-fallback.img

menuentry 'Arch Linux, with Linux linux-lts (fallback initramfs)' - initrd Wichtig ist hier alle Angabe @snapshots/4/snapshot, die wie oben gezeigt, angepasst werden müssen und gegen @root ausgetauscht werden müssen.

:!: WICHTIG - Damit zukünftig von diesem Snapshot - standardmässig gestartet wird, muss nachfolgender Befehl ausgeführt werden:

Hier wird der Bootloader - hier GRUB neu installiert:

[root@archlinux ~]# grub-install /dev/vda
Installing for i386-pc platform.
Installation finished. No error reported.
[root@archlinux ~]# systemctl reboot

Nach einem Neustart, sollte nun wieder root gestartet (boot) werden, was nachfolgende Bildschirmkopie zeigt:

Neustart GRUB - Standard Kernel

Eine Überprüfung, ob root gestartet (boot) wurde, kann mit nachfolgendem Befehl durchgeführt werden:

[root@archlinux ~]# mount | grep /@root
/dev/mapper/archlinux-root on / type btrfs (rw,relatime,space_cache=v2,subvol=/@root)

Anschließend soll das Subvolume - / wieder der default werden, was mit nachfolgendem Befehl durchgeführt werden kann:

[root@archlinux ~]# btrfs subvolume set-default 0 /

Zur Überprüfung kann nachfolgende Befehl verwendet werden:

[root@archlinux ~]# btrfs subvolume get-default /
ID 276 gen 100 top level 5 path @root

Nun können auch beispielsweise alle Snapshots mit nachfolgendem Befehl gelöscht werden:

[root@archlinux ~]# snapper delete 4
[root@archlinux ~]# snapper delete 3
[root@archlinux ~]# snapper delete 2
[root@archlinux ~]# snapper delete 1

Abschließend würde dann die Anzeige aller Snapshots wie folgt aussehen:

[root@archlinux ~]# snapper list
 # | Type   | Pre # | Date | User | Cleanup | Description | Userdata
---+--------+-------+------+------+---------+-------------+---------
0  | single |       |      | root |         | current     |

Auch die Anzeige des via BtrfS verwendeten Speicherplatzes zeigt nur die für root verwendeten daten an:

[root@archlinux ~]# df -Th | grep /dev/mapper
/dev/mapper/archlinux-root    btrfs      30G  1.8G   28G   6% /
/dev/mapper/archlinux-tmp     btrfs     1.0G  3.6M  905M   1% /tmp
/dev/mapper/archlinux-home    btrfs     1.0G  3.6M  905M   1% /home
/dev/mapper/archlinux-root    btrfs      30G  1.8G   28G   6% /.snapshots
/dev/mapper/archlinux-root    btrfs      30G  1.8G   28G   6% /btrfs
/dev/mapper/archlinux-root    btrfs      30G  1.8G   28G   6% /opt
/dev/mapper/archlinux-root    btrfs      30G  1.8G   28G   6% /srv
/dev/mapper/archlinux-root    btrfs      30G  1.8G   28G   6% /usr/local
/dev/mapper/archlinux-var_pkg btrfs      12G   11M   12G   1% /var/cache/pacman/pkg
/dev/mapper/archlinux-var_log btrfs     3.0G  3.6M  2.5G   1% /var/log

bzw.

[root@archlinux ~]# btrfs filesystem df /
Data, single: total=2.01GiB, used=1.54GiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=256.00MiB, used=97.94MiB
GlobalReserve, single: total=7.11MiB, used=0.00B

:!: WICHTIG - Damit zukünftig von diesem Snapshot - standardmässig gestartet wird, muss nachfolgender Befehl ausgeführt werden:

Hier wird der Bootloader - hier GRUB neu installiert:

[root@archlinux ~]# grub-install /dev/vda
Installing for i386-pc platform.
Installation finished. No error reported.

Anschließend muss noch der Bootloader - hier GRUB neu konfiguriert werden:

[root@archlinux ~]# grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux-lts
Found initrd image: /boot/initramfs-linux-lts.img
Found fallback initrd image(s) in /boot: initramfs-linux-lts-fallback.img
Detecting snapshots ...
Info: Separate boot partition not detected 
Info: snapper detected, using config 'root'
Found snapshot: 2020-12-07 18:25:56 | @root
Found 1 snapshot(s)
done
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/archlinux_-_minimal_server_installation_-_mit_lvm_und_btrfs_snapper.txt · Zuletzt geändert: 2020/12/17 10:52 von klaus