Snapshots und Backup mit btrfs

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Sicherheit ‹ Snapshots und Backup mit btrfs


Baustelle.png Baustelle: Dieser Artikel ist eine Baustelle. Das heißt, jemand hat sich dieses Artikels angenommen und überarbeitet ihn gerade.


Ein Backupskript für Btrfs

Ausgangslage

Warum btrfs ein tolles Dateisystem ist, möge an anderer Stelle nachgelesen werden. Hier geht es darum, wie btrfs im allgemeinen täglichen Einsatz mit einem Skript verwendet werden kann.

Datensicherung für Daheim oder im Büro leicht gemacht: Du hast zu Hause oder in deinem einen oder mehrere Computer und spielst deine Datensicherung auf eine externe Festplatte. Btrfs bietet zusätzlich noch mit geringstem Speicherplatzmehrverbrauch, dass du von der lokalen Festplatte am Computer/Laptop mehrere sogenannte Snapshots haben, und sogar von diesen booten kannst!!

Warum will ich mehrere Snapshots auf meiner Lokalen Festplatte gespeichert haben? Nun, du kannst z.B. alle 10 Minuten einen Snapshot deines Systems machen (und hebst dabei nur jeweils die aktuellsten 6 auf), und kannst so bei einem Absturz oder Totalausfall deines Rechners, oder wenn du einfach nur irrtümlich eine Datei gelöscht hast, in den Zustand von vor max. 10 Minuten booten (oder zumindest verlorene Dateien wiederherstellen).

Dazu bedarf es aber einiger Vorbereitungen.

Vorbereitungen

Stelle sicher, dass die btrfs-tools installiert sind:

root@debian:~# apt-get install btrfs-tools

Du richtest auf deinem System eine einzige möglichst große Partition ein, die du mit btrfs formatierst. Idealerweise lässt du nur etwas Platz für deinen SWAP-Bereich, und am Beginn für Grub2 den notwendigen. Der Rest wird EINE EINZIGE große Partition. Darauf kannst du sogar ein Multiboot mit mehreren Linux-Systemen installieren. Das ist mit btrfs möglich! Denn btrfs verwendet "Subvolumes" anstatt Partitionen. Und durch die Besonderheit des CoW "Copy on Write", ist so ein Subvolume ruck-zuck erstellt. Nicht nur das, Ein Snapshot eines Subvolumes ist in wenigen Augenblicken (für mein Video-Subvolume mit 140GB geht das in unter einer Sekunde!!) erstellt und wird wie ein Subvolume behandelt.

Wie man eine Festplatte partitioniert und formatiert, erfährst du an anderer Stelle. Hier geht es mit btrfs weiter. Du hast deine Partition erstellt und formatiert.

Erstes Subvolume erstellen

Du hast deinen Rechner mit einem Live-Stick gestartet, oder greifst auf die Partition über ein bestehendes Linux zu... in beiden Fällen mountest du diese Partition zuerst einmal.

root@debian:~# mount /dev/sda2 /mnt

dann wechselst du nach /mnt

root@debian:~# cd /mnt

Als erstes erstellst du sofort ein Subvolume. Ich habe meines nach der aktuellen Debian-Testing-Version benannt

root@debian:~# btrfs subvol create @debian-jessie

Weitere Subvolumes erstellen

Und nun erstellst du IN diesem Subvolume ein paar weitere Subvolumes

root@debian:~# cd @debian-jessie
root@debian:~# btrfs subvol create home
root@debian:~# btrfs subvol create home/user
root@debian:~# btrfs subvol create home/user/.cache
root@debian:~# btrfs subvol create home/user2
root@debian:~# btrfs subvol create home/user2/.cache
root@debian:~# btrfs subvol create var
root@debian:~# btrfs subvol create var/lib
root@debian:~# btrfs subvol create var/spool

In anderen Anleitungen werden Lösungen gezeigt, welche die einzelnen Subvolumes "nebeneinander" als alle im Root-Verzeichnis des Btrfs anlegen, oder in einem Verzeichnis "__active"... Ich habe mich für diese Vorgehensweise entschieden, da ich hier in meiner /etc/fstab nur einen einzigen Eintrag für das oberste Verzeichnis benötige. Das erleichtert erstens das Anfertigen von Snapshots und andererseits das Booten von einem älteren Snapshot im Recoverfall. Hier kannst du nämlich sogar mit Symlinks auf einen Snapshot arbeiten, und Grub und die /etc/fstab verstehen diesen Symlink... (Allerdings habe ich hier noch nicht fertig recherchiert, wie das am besten zu Lösen ist! Das folgt später)

Installation des (Grund)Systems

Jetzt ist dein System soweit vorbereitet, dass du dein Debian in das neue Subvolume @debian-jessie installieren kannst. Am besten gehst du nach dieser Anleitung vor [LINK ZU INSTALLATIONSANLEITUNG EINFÜGEN] und installierst dein Debian mit der Chroot-Methode und debootstrap.

Nach der Installation des Grundsystems, des Kernels und einiger weiterer Pakete (Windowmanager, Desktop-Umgebung... was du alles so benötigst) musst du vor dem ersten Reboot noch einige Anpassungen machen.

Anpassen der /etc/fstab

Du benötigst einerseits einen fixen Mountpunkt, wo du deine gesamte btrfs-Partion einhängen kannst (also jene, die du jetzt gerade ohne Angabe eines Subvolumes gemountet hast), und einen zweiten fixen Mountpunkt, wo du später deine externe HD für die Backups einhängen wirst. Außerdem musst du sowohl Grub als auch dem System mitteilen, dass du nicht von der Partition direkt bootest, sondern in ein Subvolume. Ich habe meiner btrfs-Partition das LABEL=SYSTEM verpasst. Außerdem habe ich eine externe Festplatte, welche ich derzeit noch mit crypsetup verschlüsselt habe (Sollte die mal verloren gehen... ) Wie auch immer die externe Festplatte heißt, Sie muss auch mit einem fixen Mountpunkt in die fstab. Hier ein Auszug aus meiner, den du deinen eigenen Gegebenheiten anpassen musst.

LABEL=SYSTEM    /                   btrfs   defaults,compress=lzo,space_cache,subvol=@debian-jessie                         0 0
LABEL=BACKUP    /var/cache/backup   btrfs   defaults,nofail,comment=systemd.automount,noauto,compress=lzo,space_cache       0 0
LABEL=SYSTEM    /var/cache/btrfs_pool_SYSTEM    btrfs   defaults,noauto,comment=systemd.automount,noatime,compress=lzo,space_cache      0 0

Wie du siehst, ist bei mir systemd am Werk, und ich nutze dessen Automounter-Funktion.

Skript für automatisierte Snapshot-Erstellung
Warnung.png Warnung: Das Skript ist noch in Entwicklung, daher übernehme ich keinerlei Verantwortung, für allfällige Schäden an deinem System, freue mich aber über Bugreports und Verbesserungsvorschläge. Du verwendest das auf EIGENE VERANTWORTUNG!!!


Lade dir folgendes Skript und die Config-Datei herunter (|Download von linux.xundeenergie.at) und entpacke es. Das Skript "mkbtrbackup" schiebst du nach /usr/local/bin, und die config-Datei nach /etc/mkbtrfbackup.conf

Erklärung des Skripts

Die Bedienung des Skripts ist ähnlich aufgebaut wie die Kommandos von btrfs selbst. Du kannst das Skript entweder in der Shell oder von Cron/Systemd-Cron ausführen (lassen).

Grundlegende Begriffserklärung

Dieses Skript arbeitet auf 3 Ebenen, bzw. in 3 von mir so genannten "Stores". Das ist wichtig bei allen weiteren Erklärungen zu bedenken!

  1. Einerseits gibt es den Store "SRC" also die Quelle. (Das ist in der Regel das Aktuelle Verzeichnis, oder ein absoluter Pfad zu einem Verzeichnis, in dem ein btrfs-Subvolume ist)
  2. Dann gibt es den "SNP" also den Snapshot-Store. Hier werden vom Programm alle Snapshots mit Timestamp versetzt abgelegt. Von diesen Snapshots kannst du später sogar booten.
  3. Und dann gibt es noch den Store "BKP" - also Backup-Store. Das ist auf der externen Festplatte. Datenübertragungen dorthin können bei großen Datenmengen entsprechend lange dauern!

Zuerst erkläre ich, wie das Programm von der Shell aus zu bedienen ist, Danach folgt die Verwendung mittels Config-File.

Snapshot anlegen

Du hast dein Grundsystem angelegt, und das Booten funktioniert? Dann bist du bereit für einen ersten Test. Kontrolliere bitte, ob auch wirklich das Subvolume "@debian-jessie" auf / gemountet ist.

root@debian:~# grep debian /proc/self/mountinfo

liefert bei mir unter vielem anderem diese Zeile

...
20 0 0:17 /@debian-jessie / rw,relatime shared:1 - btrfs /dev/sda2 rw,compress=lzo,space_cache
...

Das heißt, mein System ist wirklich vom Subvolume @debian-jessie gebootet.

Wenn du die selben Mountpunkte wie in der Anleitung angelegt und dich vergewissert hast, dass sowohl die externe Festplatte als auch deine btrfs-Root-Partition auf /var/cache/backup und /var/cache/btrfs_pool_SYSTEM gemountet sind - bzw. werden können, dann kannst du einen ersten Versuch wagen.

root@debian:~# cd /var/cache/btrfs_pool_SYSTEM
root@debian:~# mkbtrbackup create @debian-jessie

bzw., wenn du deinen Snapshot mit einem Interval-Tag versehen willst...

root@debian:~# mkbtrbackup create @debian-jessie --interval hourly

Du siehst einige Ausgaben, (die du im Übrigenmit der Option -q unterdrücken kannst) und am Ende findest du im Verzeichnis in dem du gerade bist (/var/cache/btrfs_pool_SYSTEM) zwei weitere Verzeichnisse mit dem Namen

@debian-new.20141122-200051
@debian-new.20141123-200055.hourly_0

Wechsle in eines der beiden Verzeichnisse und vergewissere dich, dass auch wirklich die gesamte Verzeichnisstruktur deines Systems vorhanden ist!

Ob auch alle Subvolumes vorhanden sind, die du beim originalen System angelegt hast, kontrollierst du mit folgendem Befehl

root@debian:~# mkbtrbackup list @debian-new
root@debian:~# mkbtrbackup list @debian-new.20141122-200051
root@debian:~# mkbtrbackup list @debian-new.20141123-200055.hourly_0

Bei allen drei Befehlen müsste die selbe "Verzeichnis-Struktur" nur mit dem Unterschied des Snapshotnamens angezeigt werden. Das sind jeweils alle Subvolumes in dem Snapshot deines Systems.

Damit hast du bereits 3 bootbare Snapshots erzeugt!!! Es muss noch der Grub und die fstab angepasst werden, und schon könntest du von einem dieser Snapshots booten.

Um zu sehen, wie der Transfer auf die externe Festplatte funktioniert, legen wir ein Test-Subvolume an (denn das gesamte System jetzt zu sichern würde zum Testen etwas zu lange dauern!)

root@debian:~# btrfs subvol create TEST
root@debian:~# btrfs subvol create TEST/SUB1
root@debian:~# btrfs subvol create TEST/SUB2
root@debian:~# btrfs subvol create TEST/SUB1/SUB2

Fülle ein paar Dateien in die Verzeichnisse/Subvolumes:

root@debian:~# tree /var/cache/btrfs_pool_SYSTEM/TEST
 TEST
 ├── file1
 ├── SUB1
 │   ├── file2
 │   ├── HALLO
 │   └── SUB2
 │       ├── aber
 │       ├── file3
 │       └── so
 └── SUB3
     └── file4

An dieser Stelle sei »mkbtrbackup list« kurz erläutert:

USAGE: mkbtrbackup list[ SRC][ SNP][ BKP][ STR][ BTR] <Subvolumename>[ <Subvolumename>][ <Subvolumename>]

Die Angaben der Stores SRC, SNP, BKP, STR und BTR sind optional, müssen direkt auf "list" folgen, können in unterschiedlicher Reihenfolge sein oder ganz weggelassen werden. Wird keines angegeben, wird immer SCR genommen (Das heißt, entweder der angegebene absolute Pfad zum Subvolumename oder das aktuelle Verzeichnis) Wichtig ist auch, dass die Angaben des Stores direkt im Anschluss an das Kommando erfolgen!

mkbtrbackup <COMMAND> <STORE[S]> [other Options]... 

Andernfalls kann das zu unerwünschten Ergebnissen führen!!!

Was davon Subvolumes sind, siehst du mit

root@debian:~# mkbtrbackup list TEST
 /var/cache/btrfs_pool_SYSTEM/TEST
 /var/cache/btrfs_pool_SYSTEM/TEST/SUB1
 /var/cache/btrfs_pool_SYSTEM/TEST/SUB1/SUB2
 /var/cache/btrfs_pool_SYSTEM/TEST/SUB3
root@debian:~# mkbtrbackup list SNP STR TEST
/var/cache/btrfs_pool_SYSTEM/TEST
/var/cache/btrfs_pool_SYSTEM/TEST/SUB1
/var/cache/btrfs_pool_SYSTEM/TEST/SUB1/SUB2
/var/cache/btrfs_pool_SYSTEM/TEST/SUB3
/var/cache/btrfs_pool_SYSTEM/TEST

SNP listet alle Unterverzeichnisse von TEST im SNP-Store auf. STR listet lle von TEST erzeugten Snapshots im SNP-Store auf (also nur die Subvolumes mit Timestamp direkt im SNP-Store) Du siehst, "/var/cache/btrfs_pool_SYSTEM/TEST" ist beim zweiten Aufruf mit "SNP STR" zweimal aufgeführt. Einmal als Wurzel zur Liste der Subvolumes IN Test, und ein zweites Mal als einziger Snapshot in STR.

Ob im BKP-Store schon Snapshots sind, kontrolliere mit

root@debian:~# mkbtrbackup list BKP BTR TEST

BKP listet alle Unterverzeichnisse von TEST im BKP-Store auf. BTR listet lle von TEST erzeugten Snapshots im BKP-Store auf (also nur die Subvolumes mit Timestamp direkt im BKP-Store) Das muss jetzt noch leer sein.

Also erzeugen wir einen ersten Snapshot von TEST:

root@debian:~# mkbtrbackup create TEST
[II](3460:0)	Create snapshot from /var/cache/btrfs_pool_SYSTEM/TEST
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739'
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST/SUB1' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB1'
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST/SUB1/SUB2' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB1/SUB2'
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST/SUB3' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB3'

Es wird ein Snapshot im SNP-Store erzeugt.

Du kannst mit Dateilisting ls und mkbtrbackup list nachsehen, ob es tatsächlich geklappt hat

root@debian:~# ls /var/cache/btrfs_pool_SYSTEM|grep TEST
TEST
TEST.20141126-133739
root@debian:~# mkbtrbackup list TEST TEST.20141126-133739
/var/cache/btrfs_pool_SYSTEM/TEST
/var/cache/btrfs_pool_SYSTEM/TEST/SUB1
/var/cache/btrfs_pool_SYSTEM/TEST/SUB1/SUB2
/var/cache/btrfs_pool_SYSTEM/TEST/SUB3
/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739
/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB1
/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB1/SUB2
/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB3
root@debian:~# tree TEST.20141126-133739
TEST.20141126-133739
├── file1
├── SUB1
│   ├── file2
│   ├── HALLO
│   └── SUB2
│       ├── aber
│       ├── file3
│       └── so
└── SUB3
    └── file4

3 directories, 7 files

Super, alle Subvolumes und Files sind im Snapshot "TEST.20141126-133739" so vorhanden, wie im Original "TEST"

Damit können wir diesen ersten Snapshot in den BKP-Store kopieren (also auf die externe Festplatte, die auf /var/cache/backup gemountet ist und dort in das Verzeichnis "venus". Also nach /var/cache/backup/venus)

root@debian:~# mkbtrbackup transfer TEST.20141126-133739
[II](16126:0)	Start Transfer [0] /var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739 to /var/cache/backup/venus
[II](16175:0)	Set property to ro on /var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739
[II](16126:0)	Make initial transfer...
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739
At subvol TEST.20141126-133739
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB1
At subvol SUB1
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB1/SUB2
At subvol SUB2
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB3
At subvol SUB3
[II](16126:0)	Finished transfer [0] ...

}

Die dritte Zeile der Ausgabe zeigt "Make initial transfer...". Das bedeutet, weil die externe Festplatte noch jungfräulich ist, muss der gesamte Snapshot einmal zur Gänze dorthin gesendet werden. Dies kann entsprechend dem Datenvolumen schon einige Zeit dauern und hängt von der Bandbreite deiner Verbindung zur Festplatte ab. Mit USB3 wird es rascher gehen, als wenn du mit sshfs und einer lahmen Internetleitung eine Backuppartition irgendwo anders gemountet hast.

Übrigens, die Ausgabezeilen kannst du mit der Option »-q« vollkommen unterdrücken. Zeilen die mit [II] beginnen sind Debug-Informationen des Skriptes, die anderen sind die Ausgaben von btrfs. Die Zahlen in der Klammer nach [II] bedeuten

(12345:...) ist die pid des mkbtrfbackup-Aufrufes. Da das Programm sich mehrmals innerhalb verschachtelt selbst aufruft, können so die zusammenhängenden Meldungen eines Aufrufes gefunden werden.

(...:[0-9][0-9]) ist die Position des Subvolumenamens in der Commandline beginnend mit 0. Somit lassen sich auch die Meldungen zum jeweiligen Subvolume/Snapshot finden.

Kontrolliere ob der Snapshot auch tatsächlich im BKP-Store angekommen ist

root@debian:~# mkbtrbackup list STR BTR TEST
/var/cache/btrfs_pool_SYSTEM/TEST
/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739
/var/cache/backup/venus/TEST.20141126-133739

Du siehst, es ist im SNP-Store "TEST" und "TEST.20141126-133739" gelistet, im BKP-Store nur "TEST.20141126-133739". Den Unterschied der beiden Stores erkennst du am Pfad zum Snapshot!

Anlegen eines Snapshots und Übertragen in den BKP-Store in einem Aufruf

Bisher hast du gesehen, wie du einen Snapshot lokal erstellst und im zweiten Schritt auf die externe Festplatte überträgst. Das geht aber auch in einem Schritt. Zusätzlich erfährst du hier auch, wie du einen Interval-Tag anlegst.

root@debian:~# mkbtrbackup create -x --interval hourly TEST
[II](22873:0)	Create snapshot from /var/cache/btrfs_pool_SYSTEM/TEST
[II](22922:0)	Rotate snapshot TEST
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0'
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST/SUB1' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB1'
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST/SUB1/SUB2' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB1/SUB2'
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST/SUB3' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB3'
[II](23029:0)	Rotate snapshot TEST.20141126-140232.hourly_0
[II](23078:0)	Start Transfer [0] /var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0 to /var/cache/backup/venus
[II](23127:0)	Set property to ro on /var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0
[II](23078:0)	Start transfer differences ...
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0
At snapshot TEST.20141126-140232.hourly_0
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB1
At snapshot SUB1
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB1/SUB2
At snapshot SUB2
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB3
At snapshot SUB3
[II](23078:0)	Finished transfer [0] ...

Jetzt heißt es "Start transfer differences...". Es existiert ja schon ein Snapshot im BKP- UND im SNP-Store. Die erkennt das Programm anhand des Timestamps, dass sie gleich sind. Daher werden jetzt nur mehr die Unterschiede von diesem Snapshot zum gerade erzeugten übertragen. Und das auf Blockebene und nicht eine ganze Datei, wenn nur eine Kleinigkeit geändert wurde!!

root@debian:~# mkbtrbackup list STR BTR TEST
/var/cache/btrfs_pool_SYSTEM/TEST
/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739
/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0
/var/cache/backup/venus/TEST.20141126-133739
/var/cache/backup/venus/TEST.20141126-140232.hourly_0

Zeigt uns jetzt an, dass der Snapshot sowohl im SNP- aber auch im BKP-Store zu finden ist. Operation gelungen! :D

Snapshot löschen

Das Löschen eines gesamten Snapshots samt Unterverzeichnis funktioniert genauso einfach.

root@debian:~# mkbtrbackup delete <Snapshotname>

löscht diesen einen Snapshot samt Subvolumes darunter zur Gänze. Und zwar den im aktuellen Verzeichnis. Das ist in unserem Fall sowohl der SRC- als auch der SNP-Store. Da im Skript selber die Variable "SNPSTORE=" gesetzt ist, somit leer ist, und der SNP-Store direkt in /var/cache/btrfs_pool_SYSTEM list, das auch unser aktuelles Verzeichnis ist.

  1. Du möchtest den Snapshot "/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739" löschen.

Wir befinden uns im Verzeichnis /var/cache/btrfs_pool_SYSTEM/ und führen ein

root@debian:~# mkbtrbackup delete TEST.20141126-133739
[II](7868:0)	SRC Add to delete-list /var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739 TEST.20141126-133739
[II](7868:0)	Delete subvolumes from delete-list
[II](7910:0)	Set property to rw on /var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739
Transaction commit: none (default)
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB3'
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB1/SUB2'
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739/SUB1'
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-133739'

aus und stellen fest

root@debian:~# mkbtrbackup list STR TEST
/var/cache/btrfs_pool_SYSTEM/TEST
/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0

tatsächlich, der Snapshot ist gelöscht. ABER im BKP-Store ist er noch vorhanden.

root@debian:~# mkbtrbackup list BTR TEST
/var/cache/backup/venus/TEST.20141126-133739
/var/cache/backup/venus/TEST.20141126-140232.hourly_0

Also löschen wir ihn dort auch:

root@debian:~# mkbtrbackup delete BKP TEST.20141126-133739
[II](12951:0)	BKP Add to delete-list /var/cache/backup/venus/TEST.20141126-133739 TEST.20141126-133739
[II](12951:0)	Delete subvolumes from delete-list
[II](12993:0)	Set property to rw on /var/cache/backup/venus/TEST.20141126-133739
Transaction commit: none (default)
Delete subvolume '/var/cache/backup/venus/TEST.20141126-133739/SUB3'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-133739/SUB1/SUB2'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-133739/SUB1'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-133739'

Damit ist er auch im BKP-Store gelöscht.

Du kannst auch einen Snapshot in SNP und BKP auf einmal löschen:

root@debian:~# mkbtrbackup delete SNP BKP TEST.20141126-140232.hourly_0
[II](16444:0)	SNP Add to delete-list /var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0 TEST.20141126-140232.hourly_0
[II](16444:0)	BKP Add to delete-list /var/cache/backup/venus/TEST.20141126-140232.hourly_0 TEST.20141126-140232.hourly_0
[II](16444:0)	Delete subvolumes from delete-list
[II](16499:0)	Set property to rw on /var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0
[II](16499:1)	Set property to rw on /var/cache/backup/venus/TEST.20141126-140232.hourly_0
Transaction commit: none (default)
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB3'
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB1/SUB2'
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB1'
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-140232.hourly_0/SUB3'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-140232.hourly_0/SUB1/SUB2'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-140232.hourly_0/SUB1'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-140232.hourly_0'

Rotieren von Snapshots mit Intervall-Angabe

Intervall-Angaben bei Backups verwirren manchmal... Daher eine kurze Aufklärung, wie das mit diesem Skript gehandhabt wird. Mit einem Cron-Job lasse ich alle 10 Minuten einen Snapshot mit der Bezeichnung "hourly" anlegen. Diese Snapshots liegen nur lokal im SNP-Store. Und damit meine Festplatte nicht doch mit der Zeit vollgemüllt wird, verbleiben nur 6 Snapshots (hourly_0 bis hourly_6) auf der Platte. Kommt ein neuer Snapshot hinzu, wird *.hourly_6 in *.hourly_7 umbenannt, *.hourly_5 in *.hourly_6 ... *.hourly_0 in *.hourly_1.

Dann wird ein neuer Snapshot *.hourly_0 angelegt und *.hourly_7 wird gelöscht. Die Defaults im Programm sind hourly=6 daily=7 weekly=4 monthly=12

Ohne Angabe von Optionen im Aufruf ist es genau dieses Verhalten, wenn »--interval <INTERVAL>« verwendet wird. Die Option -m macht folgendes:

  • -m 0: Abschalten der Löschung höherer Snapshots
  • -m 1-99: Alle Snapshots mit einem Index zum angegebenen Interval höher als diese Zahl werden gelöscht.

Das Rotieren geschieht immer mit der Angabe eines absoluten Pfades zum Snapshot oder im aktuellen Verzeichnis und wird normalerweise nicht manuell auszuführen sein.

Durch die Option »-x« überträgt das Programm nicht nur den Snapshot in den BKP-Store, sondern rotiert ihn sowohl im SNP- als auch im BKP-Store automatisch.

Probieren wir es aus. In beiden Stores ist derzeit kein Snapshot mit Interval vorhanden, da wir den im letzten Schritt gelöscht haben. Also legen wir einen neuen Snapshot an:

root@debian:~# mkbtrbackup create -x --interval hourly TEST
[II](16444:0)	SNP Add to delete-list /var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0 TEST.20141126-140232.hourly_0
[II](16444:0)	BKP Add to delete-list /var/cache/backup/venus/TEST.20141126-140232.hourly_0 TEST.20141126-140232.hourly_0
[II](16444:0)	Delete subvolumes from delete-list
[II](16499:0)	Set property to rw on /var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0
[II](16499:1)	Set property to rw on /var/cache/backup/venus/TEST.20141126-140232.hourly_0
Transaction commit: none (default)
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB3'
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB1/SUB2'
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0/SUB1'
Delete subvolume '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-140232.hourly_0'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-140232.hourly_0/SUB3'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-140232.hourly_0/SUB1/SUB2'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-140232.hourly_0/SUB1'
Delete subvolume '/var/cache/backup/venus/TEST.20141126-140232.hourly_0'
root@venus[14:14]:/var/cache/btrfs_pool_SYSTEM # mkbtrbackup create -x --interval hourly TEST
[II](21529:0)	Create snapshot from /var/cache/btrfs_pool_SYSTEM/TEST
[II](21587:0)	Rotate snapshot TEST
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_0'
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST/SUB1' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_0/SUB1'
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST/SUB1/SUB2' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_0/SUB1/SUB2'
Create a snapshot of '/var/cache/btrfs_pool_SYSTEM/TEST/SUB3' in '/var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_0/SUB3'
[II](21689:0)	Rotate snapshot TEST.20141126-143257.hourly_0
[II](21774:0)	Start Transfer [0] /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_0 to /var/cache/backup/venus
[II](21825:0)	Set property to ro on /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_0
[II](21774:0)	Make initial transfer...
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_0
At subvol TEST.20141126-143257.hourly_0
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_0/SUB1
At subvol SUB1
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_0/SUB1/SUB2
At subvol SUB2
At subvol /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_0/SUB3
At subvol SUB3
[II](21774:0)	Finished transfer [0] ...

Und den selben Befehl gleich ein zweites Mal

root@debian:~# mkbtrbackup create -x --interval hourly TEST

Die Ausgabe ist ähnlich wie soeben. Nur der Timestamp hat sich geändert.

Beide Male wurde der Snapshot *.hourly_0 angelegt. Und in den BKP-Store übertragen.

Eine Kontrolle ergibt:

root@debian:~# mkbtrbackup list STR BTR TEST
/var/cache/btrfs_pool_SYSTEM/TEST
/var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_1
/var/cache/btrfs_pool_SYSTEM/TEST.20141126-143601.hourly_0
/var/cache/backup/venus/TEST.20141126-143257.hourly_1
/var/cache/backup/venus/TEST.20141126-143601.hourly_0

Es existiert im SNP-Store immer noch das Original "TEST" Und sowohl in SNP als auch BKP ist jetzt *.hourly_0 und *.hourly_1 vorhanden.

Ok, weiter zum Löschen. Angenommen, du willst diesen soeben erzeugten Snapshot doch nur lokal am Rechner behalten, dann führe ein beherztes

root@debian:~# mkbtrbackup delete BKP TEST.20141125-194722.hourly_0

aus. (Auch hier bitte wieder nur den Namen des letzten Snapshots angeben!!!)

Der Snapshot ist nun im BKP-Store (zur Erinnerung das ist unter /var/cache/backup/venus zu finden) wieder weg, jedoch im SNP-Store weiterhin vorhanden.

Read-only/Read-write setzen

Solltest du tatsächlich einmal von einem älteren Snapshot booten wollen, so stelle sicher, dass dieser Read-Write-Rechte hat:

root@debian:~# mkbtrbackup list rw TEST.20141126-143257.hourly_1 -v
[II](7904:0)	Set property to rw on /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_1
[II](7904:0)	Check: ro=false: /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_1
[II](7904:0)	Check: ro=false: /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_1/SUB1
[II](7904:0)	Check: ro=false: /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_1/SUB1/SUB2
[II](7904:0)	Check: ro=alse: /var/cache/btrfs_pool_SYSTEM/TEST.20141126-143257.hourly_1/SUB3

Hier habe ich die Option »-v« gewählt, damit sehe ich auch den Check, ob tatsächlich die Schreibrechte so gesetzt sind, wie gewünscht. Mehr -v macht "lauter" also more verbous. -vvv bringt mehr Debugmeldungen zu Tage. Das Gegenstück ist -q (weiter oben auch schon einmal erwähnt). Das unterdrückt sämtliche Ausgaben.

Ich freue mich, wenn du mit dem Skript etwas anfangen kannst und mir Rückmeldungen bzgl. Fehler gibts. Später einmal wirds auch ein Debian-Paket geben.

TODO: Crontab, systemd-units, von älterem Snapshot booten

Quelle: http://linux.xundeenergie.at/doku.php?id=mkbtrbackup