Wenn man regelmäßig Daten transferieren oder abgleichen möchte, dann ist Rsync in der Regel das beste Mittel der Wahl. Rsync überträgt nur geänderte Dateien, tut dies sehr effizient, komprimiert dabei noch und verschlüsselt die Daten während des Transfers. Rsync funktioniert für regelmäßige Dateitransfers also extrem gut.

Schön wäre es nun, wenn man so etwas wie Rsync auch für sehr große Dateien oder Logical Volumes eines LVM verwenden könnte. Ein typischer Anwendungsfall ist die Sicherung von virtuellen Maschinen, bei denen diese Images auch schon mal mehrere hundert GB groß sind.

An sich funktioniert das technisch zwar, allerdings kommt einem die Praxis in die Quere, denn…

  • Überträgt man eine Datei, die in Verwendung ist, erhält man im Ziel fast automatisch Inkosistenzen, sofern man die virtuelle Maschine nicht für die Dauer des Vorgangs anhalten oder herunterfahren kann. Da ein solcher Vorgang allerdings bei großen Images auch sehr lange dauern kann, scheidet ein Anhalten oder Herunterfahren für mehrere Stunden oft aus. Eine Möglichkeit dies zu umgehen sind Snapshots. Allerdings können die meisten heute verwendeten Dateisysteme (ext3, ext4, reiserfs, xfs, etc.) keine Snapshots erstellen. Ausnahmen wie BTRFS sind noch sehr neu und kommen daher erst selten zum Einsatz.
  • Liegen die virtuellen Maschinen auf Logical Volumes eines LVM, kann man Snapshots erstellen und damit sogar konsistente, lange laufende Backups erzeugen. Rsync ist jedoch nicht wirklich darauf ausgelegt, Logical Volumes zu transferieren, da es Block Devices nicht unterstützt. Zudem müsste man sich eine Lösung scripten, die zunächst einen Snapshot erstellt, dann diesen Snapshot per Rsync überträgt und danach den Snapshot wieder entfernt.

Es gibt mehrere Projekte, die Lösungen dafür anbieten. So richtig glücklich bin ich allerdings auch noch mit keinem davon:

  • LVMSync - kümmert sich um die Erstellung von Snapshots und nutzt Rsync um Logical Volumes zu transferieren.
  • bscp - Kopiert Block Devices über scp. In Python implementiert und so gut wie undokumentiert.
  • Nur die Inhalte kopieren mit Rsync - ein durchaus interessanter Ansatz, das Block Device muss jedoch im Ziel einmal vorhanden sein.
  • Lsyncd - Live Sync Daemon - klinkt sich ins Filesystem ein und transferiert Änderungen sofort, wenn sie geschehen. Also sowas wie ein Live-Backup.
  • dd über ssh - Oldie but goldie. Geht natürlich. Dauert ewig und ist fehleranfällig. Transferiert alles, nicht nur Änderungen.
  • Blocksync - synchronisiert Block Devices über Netzwerke. Sollte man mal testen.

Ich persönlich würde mir für den Zweck LVMSync oder Blocksync anschauen. Wenn jemand weitere Möglichkeiten oder Projekte zu diesem Zweck kennt würde ich mich über einen Hinweis in den Kommentaren oder per Mail freuen.