Btrfs Send/Receive: Effiziente inkrementelle Backups auf Blockebene
AI generated
$
/etc
Linux
Btrfs Send/Receive
Effiziente inkrementelle Backups auf Blockebene

rsync vergleicht Dateien Datei für Datei und kostet bei Millionen kleiner Dateien wertvolle Zeit allein für den Vergleich. Btrfs Send und Receive umgeht dieses Problem vollständig, indem es direkt die Unterschiede zwischen zwei Snapshots auf Blockebene ermittelt und überträgt, ohne den Dateibaum überhaupt durchlaufen zu müssen.

10 Min. Lesezeit Linux Btrfs Backup

1. Warum blockbasierte inkrementelle Backups den Unterschied machen

Klassische Backup Werkzeuge wie rsync ermitteln Änderungen, indem sie den kompletten Dateibaum von Quelle und Ziel durchlaufen und Metadaten wie Größe und Änderungszeitpunkt vergleichen. Bei Verzeichnissen mit Millionen kleiner Dateien, wie sie etwa in Magento Media Verzeichnissen oder Log Archiven entstehen, wird allein dieser Vergleichsvorgang zum Flaschenhals, noch bevor überhaupt ein einziges Byte an Nutzdaten übertragen wurde.

Btrfs Send und Receive löst dieses Problem an der Wurzel, weil der Kernel die Unterschiede zwischen zwei Snapshots direkt aus der internen B Baum Struktur des Dateisystems liest, statt Dateien einzeln zu vergleichen. Das Ergebnis ist ein Datenstrom, der ausschließlich die tatsächlich geänderten Blöcke enthält und sich beliebig komprimieren, verschlüsseln oder über eine Pipe direkt an ein Zielsystem weiterreichen lässt.

2. Wie send und receive grundsätzlich funktionieren

btrfs send erzeugt aus einem read only Snapshot einen binären Datenstrom, der alle notwendigen Operationen enthält, um denselben Zustand auf einem anderen Btrfs Dateisystem wiederherzustellen, etwa das Anlegen von Dateien, das Schreiben bestimmter Blöcke oder das Setzen von Metadaten. Dieser Stream wird nicht direkt interpretiert, sondern muss auf der Empfängerseite mit btrfs receive wieder in ein tatsächliches Subvolume umgewandelt werden.

Beide Kommandos lassen sich über eine einfache Pipe verbinden, wenn Quelle und Ziel auf demselben System liegen, oder über SSH koppeln, wenn das Ziel auf einem entfernten Server liegt. Wichtig ist dabei, dass sowohl der Quell Snapshot als auch der eventuell für inkrementelle Übertragung benötigte Eltern Snapshot zum Zeitpunkt des Sendens read only sein müssen, da Btrfs sonst keine konsistente Ausgangslage garantieren kann.


# Vollstaendigen Snapshot lokal auf ein anderes Btrfs Dateisystem uebertragen
btrfs send /.snapshots/mysql-2026-08-08 | btrfs receive /mnt/backup

# Direkt per SSH auf einen entfernten Server uebertragen
btrfs send /.snapshots/mysql-2026-08-08 \
  | ssh backup-host btrfs receive /mnt/backup

3. Vollständige gegenüber inkrementellen Snapshots

Eine vollständige Übertragung mit btrfs send ohne weitere Optionen überträgt jeden einzelnen Block des Snapshots und ist entsprechend nur für die allererste Synchronisation oder sehr kleine Datenmengen sinnvoll. Für den laufenden Betrieb kommt stattdessen die inkrementelle Variante mit der Option -p zum Einsatz, die einen Eltern Snapshot als Referenzpunkt angibt und nur die Blöcke überträgt, die sich seit diesem Referenzpunkt tatsächlich geändert haben.

Voraussetzung für eine inkrementelle Übertragung ist, dass der als Elternteil verwendete Snapshot bereits identisch auf der Zielseite vorhanden ist, weil Btrfs die Änderungen relativ zu genau diesem Zustand berechnet. Fehlt der Eltern Snapshot auf der Zielseite oder wurde er dort gelöscht, schlägt die inkrementelle Übertragung fehl und es bleibt nur eine erneute vollständige Übertragung als Ausweg.


# Inkrementelle Uebertragung relativ zum vorherigen Snapshot
btrfs send -p /.snapshots/mysql-2026-08-07 \
  /.snapshots/mysql-2026-08-08 \
  | ssh backup-host btrfs receive /mnt/backup

4. Praxisworkflow: Offsite Replikation einrichten

Ein typischer Replikations Workflow beginnt mit einem einmaligen vollständigen Send zur Erstinitialisierung des Backup Ziels, gefolgt von regelmäßigen inkrementellen Übertragungen, die jeweils den zuletzt erfolgreich übertragenen Snapshot als Elternteil referenzieren. Ein Skript sollte nach jeder erfolgreichen Übertragung den Namen des zuletzt übertragenen Snapshots persistieren, damit der nächste Lauf den korrekten Referenzpunkt kennt.

Für die Übertragung über ein öffentliches Netzwerk empfiehlt sich zusätzlich Kompression auf SSH Ebene sowie ein dedizierter SSH Key mit eingeschränkten Rechten, der auf der Zielseite ausschließlich btrfs receive Aufrufe erlaubt, etwa über eine command= Einschränkung in der authorized_keys Datei.


#!/usr/bin/env bash
# scripts/btrfs-offsite-sync.sh: inkrementelle Offsite Replikation
set -euo pipefail

TS=$(date +%Y-%m-%d)
LAST=$(cat /var/lib/btrfs-sync/last-snapshot)

btrfs subvolume snapshot -r /mnt/data/mysql /.snapshots/mysql-$TS

btrfs send -p /.snapshots/mysql-$LAST /.snapshots/mysql-$TS \
  | ssh -C backup-host btrfs receive /mnt/backup

echo "mysql-$TS" > /var/lib/btrfs-sync/last-snapshot

5. Vergleich zu rsync basierten Backups

Bei der Geschwindigkeit hat Send/Receive einen strukturellen Vorteil, weil keine Datei Metadaten verglichen werden müssen und ausschließlich die tatsächlich geänderten Blöcke den Datenstrom bilden. Bei rsync wächst die Zeit für den reinen Änderungsabgleich mit der Anzahl der Dateien, während sie bei Btrfs Send praktisch unabhängig von der Dateianzahl ist und stattdessen von der Menge der geänderten Blöcke abhängt.

Bei der Konsistenz liegt der Vorteil ebenfalls klar bei Send/Receive: Da die Übertragung auf einem eingefrorenen, read only Snapshot basiert, kann sich der Quellzustand während der laufenden Übertragung nicht mehr ändern. rsync dagegen liest Dateien während des laufenden Betriebs direkt vom lebenden Dateisystem, wodurch sich Dateien zwischen Beginn und Ende eines Laufs ändern können und im schlimmsten Fall inkonsistente Zwischenzustände übertragen werden, insbesondere bei Datenbankdateien ohne separates Locking.

6. Automatisierung und Retention Strategie

Für den produktiven Einsatz sollte die Erstellung neuer Snapshots, deren Übertragung und die Bereinigung alter Snapshots auf beiden Seiten in einem einzigen, idempotenten Skript zusammengefasst werden, das sich über Cron oder einen systemd Timer regelmäßig ausführen lässt. Werkzeuge wie btrbk nehmen genau diese Orchestrierung ab und verwalten Retention Regeln, mehrere Zielsysteme sowie Fehlerbehandlung, ohne dass ein eigenes Skript von Grund auf gepflegt werden muss.

Bei der Retention gilt eine wichtige Einschränkung: Der jeweils älteste noch als Elternteil benötigte Snapshot darf auf keiner Seite gelöscht werden, solange nicht mindestens ein neuerer, bereits vollständig übertragener Snapshot als neue Referenz zur Verfügung steht. Eine unbedachte automatische Bereinigung kann sonst dazu führen, dass die nächste inkrementelle Übertragung fehlschlägt und eine erneute vollständige Übertragung notwendig wird.

7. Fehlerbehandlung und Verifikation der Übertragung

Bricht eine Übertragung durch einen Netzwerkfehler ab, bleibt auf der Zielseite häufig ein unvollständiges, temporäres Subvolume zurück, das mit der Option -e bei btrfs receive und einer erneuten Übertragung ab dem letzten intakten Zustand fortgesetzt werden kann, sofern die Verbindung nur kurzzeitig unterbrochen war. Bei dauerhaft fehlgeschlagenen Übertragungen sollte das unvollständige Subvolume vor einem erneuten Versuch bewusst gelöscht werden, um Inkonsistenzen zu vermeiden.

Da Btrfs bereits beim Lesen jedes Blocks dessen Prüfsumme validiert, wird eine während der Übertragung entstandene Korruption in der Regel spätestens beim nächsten Zugriff auf das empfangene Subvolume erkannt. Für besonders kritische Backups empfiehlt sich dennoch ein regelmäßiger Scrub auf der Zielseite, um Korruption proaktiv statt erst beim tatsächlichen Restore Versuch zu entdecken.

8. Praxisfall: Restore aus einem empfangenen Snapshot

Der eigentliche Restore Vorgang ist bei Send/Receive denkbar einfach, weil das empfangene Subvolume auf der Backup Seite bereits ein vollständig fertiges, direkt einsatzbereites Btrfs Subvolume ist und nicht erst aus einem Archivformat entpackt werden muss. Für einen Restore auf dem Produktivserver genügt es, den gewünschten Snapshot von der Backup Seite zurück zu senden, entweder in umgekehrter Richtung per Send/Receive oder, falls nur ein einzelner Ordner benötigt wird, per gezieltem Kopieren aus dem read only Snapshot heraus.

Für einen vollständigen Notfall Restore, etwa nach einem Hardware Defekt des Produktivservers, empfiehlt sich ein dokumentierter, regelmäßig getesteter Ablauf: neuen Pool oder neues Subvolume vorbereiten, gewünschten Snapshot per Send/Receive von der Backup Seite zurückspielen und anschließend über den Bootloader oder die jeweilige Mount Konfiguration aktivieren. Ein Restore Test, der nur in der Theorie funktioniert, aber nie tatsächlich durchgespielt wurde, ist im Ernstfall meist wertlos.


# Snapshot von der Backup Seite zurueck auf den Produktivserver senden
ssh backup-host btrfs send /mnt/backup/mysql-2026-08-08 \
  | btrfs receive /mnt/data/restore

# Zurueckgespieltes Subvolume an die produktive Stelle setzen
mv /mnt/data/mysql /mnt/data/mysql-old
mv /mnt/data/restore/mysql-2026-08-08 /mnt/data/mysql

9. Best Practices für den produktiven Einsatz

Snapshots, die als Elternteil für inkrementelle Übertragungen dienen, sollten grundsätzlich read only bleiben, da eine nachträgliche Änderung die Grundlage für zukünftige inkrementelle Berechnungen zerstört. Zudem sollte auf beiden Seiten dieselbe Btrfs Kernel Version oder zumindest eine kompatible Feature Menge vorliegen, da neuere Send Stream Formate von älteren Receive Implementierungen nicht immer verstanden werden.

Für die 3-2-1 Backup Regel eignet sich Send/Receive hervorragend als eine der beiden unterschiedlichen Speichertechnologien, sollte aber nicht die einzige Sicherungsmethode bleiben, weil ein grundlegender Fehler in der Btrfs Implementierung theoretisch sowohl Quelle als auch alle darüber erstellten Kopien betreffen könnte. Eine zusätzliche, technologisch unabhängige Sicherung bleibt deshalb auch bei konsequentem Einsatz von Send/Receive sinnvoll.

Aspekt Btrfs Send/Receive rsync
Änderungserkennung Direkt aus Dateisystem Metadaten, blockbasiert Dateibaum Traversierung und Metadaten Vergleich
Geschwindigkeit bei vielen kleinen Dateien Unabhängig von Dateianzahl Sinkt deutlich mit steigender Dateianzahl
Konsistenz während der Übertragung Garantiert durch eingefrorenen read only Snapshot Abhängig von parallelen Schreibzugriffen
Voraussetzung Btrfs auf Quelle und Ziel erforderlich Funktioniert auf beliebigen Dateisystemen
Inkrementelle Übertragung Nativ über Eltern Snapshot Referenz Über Änderungszeitpunkt und Dateigröße approximiert

Mironsoft

Server-Administration, Docker-Hosts und Performance-Tuning

Linux-Server, die niemand im Team richtig versteht?

Wir übernehmen Setup, Absicherung und Performance-Tuning von Linux-Servern und Docker-Hosts für Magento-Deployments, dokumentiert und nachvollziehbar statt gewachsen und unklar.

Server-Audit

Bestehende Server-Konfiguration auf Sicherheitslücken und Performance-Bremsen prüfen.

Docker-Host-Setup

Produktionsreife Docker-Umgebungen für Magento sauber aufsetzen und absichern.

Monitoring & Tuning

Ressourcenverbrauch messen und Systemd, Kernel und Dienste gezielt optimieren.

10. Zusammenfassung

Btrfs Send/Receive

Kernprinzip

Unterschiede zwischen zwei Snapshots werden direkt blockbasiert ermittelt

Kernbefehl

btrfs send -p vorheriger-snapshot neuer-snapshot | btrfs receive ziel

Größter Vorteil

Geschwindigkeit unabhängig von der Dateianzahl im Verzeichnis

Wichtigste Regel

Eltern Snapshot darf auf keiner Seite vor der nächsten Übertragung gelöscht werden

11. FAQ: Btrfs Send/Receive

1Muss das Zieldateisystem ebenfalls Btrfs sein?
Ja, sowohl Quelle als auch Ziel müssen Btrfs Dateisysteme sein, da der Empfänger den binären Send Stream direkt in eine Btrfs Subvolume Struktur umsetzt. Eine Übertragung auf ext4 oder XFS ist mit btrfs receive nicht möglich.
2Was passiert, wenn der Eltern Snapshot auf der Zielseite fehlt?
Die inkrementelle Übertragung schlägt dann fehl, weil Btrfs die Änderungen relativ zu diesem exakten Zustand berechnet. In diesem Fall bleibt nur eine erneute vollständige Übertragung ohne die Option -p.
3Warum müssen Snapshots für send read only sein?
Nur read only Snapshots garantieren einen eingefrorenen, konsistenten Zustand während der gesamten Übertragung. Ein beschreibbarer Snapshot könnte sich während des Sendevorgangs ändern, was zu einem inkonsistenten Datenstrom führen würde.
4Wie verhält sich Send/Receive im Vergleich zu rsync bei Millionen kleiner Dateien?
Send/Receive ermittelt Änderungen direkt aus der Dateisystemstruktur ohne Dateibaum Traversierung und ist deshalb praktisch unabhängig von der Dateianzahl. rsync muss dagegen jede Datei einzeln prüfen, was bei Millionen kleiner Dateien spürbar Zeit kostet.
5Kann eine abgebrochene Übertragung fortgesetzt werden?
Mit der Option -e bei btrfs receive lässt sich eine unterbrochene Übertragung unter bestimmten Bedingungen fortsetzen, sofern das teilweise empfangene Subvolume noch vorhanden ist. Bei dauerhaft fehlgeschlagenen Versuchen sollte das unvollständige Subvolume vor einem Neuversuch gelöscht werden.
6Welches Werkzeug hilft bei der Automatisierung von Send/Receive?
btrbk ist ein verbreitetes Werkzeug, das Snapshot Erstellung, Übertragung und Retention Regeln über eine zentrale Konfigurationsdatei orchestriert. Es unterstützt auch mehrere Zielsysteme und lokale sowie entfernte Replikation gleichzeitig.
7Wie sicher ist die Übertragung über ein öffentliches Netzwerk?
Über eine SSH Pipe wird der Datenstrom automatisch verschlüsselt übertragen, zusätzlich lässt sich SSH Kompression aktivieren. Ein eingeschränkter SSH Key mit einer command Einschränkung auf btrfs receive erhöht die Sicherheit auf der Zielseite zusätzlich.
8Erkennt Send/Receive Datenkorruption während der Übertragung?
Btrfs validiert Checksummen bereits beim Lesen jedes Blocks, sodass eine während der Übertragung entstandene Korruption in der Regel spätestens beim nächsten Zugriff auf das empfangene Subvolume auffällt. Für kritische Backups empfiehlt sich zusätzlich ein regelmäßiger Scrub auf der Zielseite.
9Ersetzt Send/Receive eine vollständige 3-2-1 Backup Strategie?
Nein, Send/Receive eignet sich hervorragend als eine der Speichertechnologien innerhalb der 3-2-1 Regel, sollte aber wegen der gemeinsamen Abhängigkeit von der Btrfs Implementierung nicht die einzige Sicherungsmethode bleiben.
10Können unterschiedliche Btrfs Versionen auf Quelle und Ziel Probleme verursachen?
Ja, neuere Send Stream Formate werden von älteren Receive Implementierungen teilweise nicht verstanden. Es empfiehlt sich, auf beiden Seiten eine vergleichbar aktuelle Btrfs Version einzusetzen, um Kompatibilitätsprobleme zu vermeiden.