So erstellen Sie ein Backup mit Btrfs-Snapshots

BTRFS ist ein Open-Source- und modernes Dateisystem mit erweiterten Funktionen. Es funktioniert mit dem Copy-on-Write-Mechanismus (CoW).

Es ist im Mainline-Linux-Kernel enthalten. Bemerkenswerte Funktionen von Btrfs sind das Kopieren von Daten und Metadaten beim Schreiben, Snapshots, integrierte RAID-Unterstützung, Online-Größenänderung und -Defragmentierung, transparente Komprimierung, effiziente Speicherung kleiner Dateien usw.

Schnappschuss ist eine Kopie von Btrfs Teilvolumen. Snapshots sind standardmäßig beschreibbar. Btrfs ermöglicht die Erstellung lesbarer Snapshots, die für die Erstellung von Backups hilfreich sind.

In diesem Tutorial erfahren wir, wie Sie Btrfs-Snapshots und inkrementelle Backups erstellen und wiederherstellen.

System Information

ich benutze Fedora und nun Fedora 33 hat standardmäßig Btrfs. Mein System hat 20 GB Boot-Disk und 10 GB zusätzliche Disk mit Btrfs-Dateisystem darauf.

Hier ist sda die Boot-Festplatte, während sdb die zusätzliche Festplatte ist, die wir für den Btrfs-Snapshot verwenden.

Auflisten der Datenträgerinformationen:

$ ls -l /dev | grep sd
brw-rw----. 1 root disk 8, 0 Nov 21 08:42 sda
brw-rw----. 1 root disk 8, 1 Nov 21 08:42 sda1
brw-rw----. 1 root disk 8, 2 Nov 21 08:42 sda2
brw-rw----. 1 root disk 8, 16 Nov 21 08:57 sdb
brw-rw----. 1 root disk 8, 17 Nov 21 08:57 sdb1

Zur Erklärung habe ich LVM erstellt und unter /mnt/linoxide_btrfs1 mit dem btrfs-Dateisystem gemountet.

Auflistung von PV, VG und LV erstellt:

$ pvs && vgs && lvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 linoxide_vg lvm2 a-- <10.00g <5.00g
VG #PV #LV #SN Attr VSize VFree
linoxide_vg 1 1 0 wz--n- <10.00g <5.00g
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
linoxide_lv1 linoxide_vg -wi-a----- 5.00g

Die Ausgabe von Mount-Informationen:

$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 286M 0 286M 0% /dev
tmpfs 294M 0 294M 0% /dev/shm
tmpfs 294M 4.5M 289M 2% /run
tmpfs 294M 0 294M 0% /sys/fs/cgroup
/dev/sda2 20G 2.3G 18G 12% /
/dev/sda1 200M 12M 189M 6% /boot/efi
tmpfs 59M 0 59M 0% /run/user/1000
tmpfs 59M 0 59M 0% /run/user/0
/dev/mapper/linoxide_vg-linoxide_lv1 5.0G 17M 4.5G 1% /mnt/linoxide_btrfs1

Btrfs-Schnappschuss

Um einen btrfs-Snapshot zu erstellen, erstellen Sie zuerst a Teilvolumen.

Schritt 1. Subvolume erstellen

Um ein Subvolume namens ‘/mnt/linoxide_btrfs1/subvol1’ zu erstellen, führen Sie Folgendes aus:

$ sudo btrfs subvolume create /mnt/linoxide_btrfs1/subvol1

Schritt 2. Dateien auf Untervolume kopieren

Lassen Sie uns einige Datendateien auf ein Subvolume kopieren. Der folgende Befehl kopiert einige Dateien von /etc/ nach subvol1.

$ cd /mnt/linoxide_btrfs1/subvol1
$ cp /etc/[abc]* .
$ ls -l
-rw-r--r--. 1 root root 16 Nov 21 09:25 adjtime
-rw-r--r--. 1 root root 1529 Nov 21 09:25 aliases
-rw-r--r--. 1 root root 12288 Nov 21 09:25 aliases.db
-rw-------. 1 root root 541 Nov 21 09:25 anacrontab
-rw-r--r--. 1 root root 55 Nov 21 09:25 asound.conf
-rw-r--r--. 1 root root 2853 Nov 21 09:25 bashrc
-rw-r--r--. 1 root root 112 Nov 21 09:25 boto.cfg
-rw-r--r--. 1 root root 37 Nov 21 09:25 centos-release
-rw-r--r--. 1 root root 51 Nov 21 09:25 centos-release-upstream
-rw-r--r--. 1 root root 1053 Nov 21 09:25 chrony.conf

Schritt 3. Schnappschuss erstellen

Erstellen wir einen Snapshot des Subvolumes1 (/mnt/linoxide_btrfs1/subvol1).

Beachten Sie das -r Flag für schreibgeschützt. Stellen Sie sicher, dass Sie den Snapshot schreibgeschützt erstellen, wenn Sie Sende-/Empfangsbefehle verwenden (erläutert im nächsten Abschnitt).

Um einen schreibgeschützten Snapshot von ‘/mnt/linoxide_btrfs1/subvol1’ in ‘/mnt/linoxide_btrfs1/.snapshots/subvol1-day1’ zu erstellen, führen Sie Folgendes aus:

$ sudo btrfs subvolume snapshot -r /mnt/linoxide_btrfs1/subvol1 /mnt/linoxide_btrfs1/.snapshots/subvol1-day1

Überprüfen Sie den Inhalt des Snapshots:

$ cd .snapshots/
$ ls -l
drwxr-xr-x. 1 root root 446 Nov 21 09:25 subvol1-day1
$ cd subvol1-day1/
$ ls -l
-rw-r--r--. 1 root root 16 Nov 21 09:25 adjtime
-rw-r--r--. 1 root root 1529 Nov 21 09:25 aliases
-rw-r--r--. 1 root root 12288 Nov 21 09:25 aliases.db
-rw-------. 1 root root 541 Nov 21 09:25 anacrontab
-rw-r--r--. 1 root root 55 Nov 21 09:25 asound.conf
-rw-r--r--. 1 root root 2853 Nov 21 09:25 bashrc
-rw-r--r--. 1 root root 112 Nov 21 09:25 boto.cfg
-rw-r--r--. 1 root root 37 Nov 21 09:25 centos-release
-rw-r--r--. 1 root root 51 Nov 21 09:25 centos-release-upstream
-rw-r--r--. 1 root root 1053 Nov 21 09:25 chrony.conf

Btrfs-Snapshot mit send

Wir haben einen Snapshot auf der gleichen Festplatte wie das Subvolume gemacht, was für die Backup-Strategie nicht gut ist. Im Falle einer Katastrophe wie einer Festplattenbeschädigung geht die Wiederherstellungsoption verloren.

BTRFS hat dafür eine Lösung. Wir können Snapshots mit den Befehlen btrfs send und btrfs receive an ein entferntes System oder eine externe Festplatte senden. Sie basieren auf SSH. Das Remote-System sollte ebenfalls als BTRFS formatiert sein.

Lass es mich erklären mit example.

Erstellen Sie eine neue Festplatte mit dem btrfs-Dateisystem, das unter /mnt/linoxide_btrfs2 eingehängt ist.

$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 286M 0 286M 0% /dev
tmpfs 294M 0 294M 0% /dev/shm
tmpfs 294M 4.5M 289M 2% /run
tmpfs 294M 0 294M 0% /sys/fs/cgroup
/dev/sda2 20G 2.3G 18G 12% /
/dev/sda1 200M 12M 189M 6% /boot/efi
tmpfs 59M 0 59M 0% /run/user/1000
tmpfs 59M 0 59M 0% /run/user/0
/dev/mapper/linoxide_vg-linoxide_lv1 5.0G 17M 4.5G 1% /mnt/linoxide_btrfs1
/dev/mapper/linoxide_vg2-linoxide_lv2 5.0G 17M 4.5G 1% /mnt/linoxide_btrfs2

In diesem example, das Ziel-Btrfs-Volumen ist die zweite btrfs-Festplatte, die als /mnt/linoxide_btrfs2 eingehängt ist.

Der folgende Befehl zum Senden des Snapshots an das Remote-Ziel:

$ sudo sudo btrfs send /mnt/linoxide_btrfs1/.snapshots/subvol1-day1 | sudo btrfs receive /mnt/linoxide_btrfs2
At subvol /mnt/linoxide_btrfs1/.snapshots/subvol1-day1
At subvol subvol1-day1

Überprüfen Sie die Datendateien:

$ cd /mnt/linoxide_btrfs2/
$ ls -l
drwxr-xr-x. 1 root root 446 Nov 21 09:25 subvol1-day1
$ cd subvol1-day1/
$ ls -l
-rw-r--r--. 1 root root 16 Nov 21 09:25 adjtime
-rw-r--r--. 1 root root 1529 Nov 21 09:25 aliases
-rw-r--r--. 1 root root 12288 Nov 21 09:25 aliases.db
-rw-------. 1 root root 541 Nov 21 09:25 anacrontab
-rw-r--r--. 1 root root 55 Nov 21 09:25 asound.conf
-rw-r--r--. 1 root root 2853 Nov 21 09:25 bashrc
-rw-r--r--. 1 root root 112 Nov 21 09:25 boto.cfg
-rw-r--r--. 1 root root 37 Nov 21 09:25 centos-release
-rw-r--r--. 1 root root 51 Nov 21 09:25 centos-release-upstream
-rw-r--r--. 1 root root 1053 Nov 21 09:25 chrony.conf

Jetzt hast du eine vollständige Sicherung die auch als DR verwendet werden können.

Inkrementelles Backup

Snapshot kann Backups auch inkrementell senden. Wenn ein Verzeichnis umbenannt wird, löscht Rsync das Verzeichnis und überträgt alle Daten erneut, während BTRFs nur einige Bytes an Metadaten übertragen.

Machen wir noch einen Schnappschuss.

$ sudo btrfs subvolume snapshot -r /mnt/linoxide_btrfs1/subvol1 /mnt/linoxide_btrfs1/.snapshots/subvol1-day2

Verwenden von -p Flag müssen Sie den Basis-Snapshot angeben und dieser Snapshot muss in der Quelle und im Ziel vorhanden sein. Der folgende Befehl sendet die Differenz zwischen zwei Basis-Snapshots an das Ziel.

$ sudo btrfs send -p /mnt/linoxide_btrfs1/.snapshots/subvol1-day1 /mnt/linoxide_btrfs1/.snapshots/subvol1-day2 | sudo btrfs receive /mnt/linoxide_btrfs2

So stellen Sie einen Btrfs-Snapshot wieder her

In diesem Abschnitt erkläre ich, wie Sie Daten aus einem zuvor erstellten Snapshot wiederherstellen. Nehmen wir ein Szenario, in dem die Datei versehentlich gelöscht wird. Sie können den letzten Snapshot wiederherstellen oder sogar eine ältere Version der Datei aus einem älteren Snapshot wiederherstellen.

Sie können einfach den Befehl cp verwenden, um die gelöschte Datei wiederherzustellen:

$ sudo cp /mnt/linoxide_btrfs1/.snapshots/subvol1-day1/chrony.conf /mnt/linoxide_btrfs1/subvol1

Nehmen wir an, Sie haben das gesamte Subvolume gelöscht. Auch in diesem Fall können Sie mit dem Befehl cp den gesamten Inhalt aus dem Snapshot wiederherstellen:

$ sudo cp -r /mnt/linoxide_btrfs1/.snapshots/subvol1-day1 /mnt/linoxide_btrfs1/subvol1

Oder Sie können das Subvolume mit dem Befehl btrfs snapshot wiederherstellen:

$ sudo btrfs subvolume snapshot /mnt/linoxide_btrfs1/.snapshots/subvol1-day1 /mnt/linoxide_btrfs1/subvol1

Snapshot-Bereinigung

Wenn Sie regelmäßige inkrementelle Sicherungen mit btrfs-Snapshots durchführen, können sich viele davon anhäufen. Dies kann zu Verwirrung führen und viel Speicherplatz auf der Festplatte belegen. Sie können alte, unerwünschte Snapshots auch mit Snapshot delete löschen. Beachten Sie beim Bereinigen, dass Sie zum Ausführen eines inkrementellen Sendens den letzten Snapshot benötigen.

$ sudo btrfs subvolume delete /mnt/linoxide_btrfs1/.snapshots/subvol1-day1

Fazit

Btrfs ist schnell gereift. Heute verfügt es über eine breite Palette von Funktionen wie Komprimierung, Snapshots, Datenintegrität und Leistung, die es zu einem produktionsbereiten Dateisystem machen. Ich hoffe, dass dieser Artikel bei der Verwendung von Snapshots von BTRFS hilfreich ist. Teilen Sie mir Ihre Ansichten im Kommentarbereich mit.