
Ich verwende rsync, um Backups zu erstellen:
rsync -a --link-dest=PATHTO/$PREVIOUSBACKUP $SOURCE $CURRENTBACKUP
Auf diese Weise spare ich Platz durch die Verwendung von Hardlinks.
Das Problem tritt auf, wenn ich eine große Datei sichern muss, die sich ständig ändert (Image einer virtuellen Maschine).
Ist es möglich, nicht das ganze Bild, sondern nur die geänderten Teile per Hardlink zu verknüpfen? Gibt es ein Tool, das dies erledigt?
Antwort1
Es gibt eine Reihe von Dingen, die hier getan werden könnten. Beachten Sie, dass keines davon tatsächlich Hardlinks verwendet, da sie nur auf eine vollständige Datei verweisen können. Die Verwendung des btrfs
Dateisystems eröffnet hier einige sehr nützliche Möglichkeiten. Beachten Sie, dass btrfs
dies derzeit (die neueste Version ist v3.13) noch experimentell ist. Es ist jedochKUH(Copy-on-Write) ist für solche Dinge perfekt (vorausgesetzt natürlich, dass das Backup auf demselben Dateisystem vorhanden sein darf). Wenn Sie beispielsweise ein btrfs
Dateisystem einhängen /mnt
, können Sie einen atomaren Snapshot des gesamten Dateisystems erstellen mit:
btrfs subvolume snapshot /mnt /mnt/snapshot
Um Teil-Snapshots zu ermöglichen, müssen Sie die zu sichernden Dateien in einem Verzeichnis und subvolume
nicht in einem Verzeichnis ablegen. Beispiel:
btrfs subvolume create /mnt/subvol
mv stuff /mnt/subvol
btrfs subvolume snapshot /mnt/subvol /mnt/subvol_snapshot
Neben der Verwendung btfrs
können Sie auch erwägen, das Image der virtuellen Maschine auf einer oder beiden Seiten des Backups zu mounten und rsync
zwischen den beiden Mount-Punkten zu verwenden.
Dieser Blogzeigt, wie man ein Virtual Box- .vdi
Image mountet qemu-utils
. Die Befehle als Root (ungetestet):
modprobe nbd
qemu-nbd -c /dev/nbd0 <vdi-file>
mount /dev/nbd0p1 /mnt
...
umount /mnt
qemu-nbd -d /dev/nbd0
Der einfachste Ansatz, der möglicherweise von Nutzen ist, ist die --inplace
Option für rsync
. Aus der Manpage:
--inplace
This option changes how rsync transfers a file when its data needs to
be updated: instead of the default method of creating a new copy of the
file and moving it into place when it is complete, rsync instead writes
the updated data directly to the destination file.
...
This option is useful for transferring large files with block-based
changes or appended data, and also on systems that are disk bound, not
network bound.
Das Problem hierbei ist natürlich, dass die Verwendung in Kombination mit keinerlei Vorteilen verbunden ist --link-dest
(in rsync
Versionen <2.6.4 sind die beiden vollständig inkompatibel), da am Ziel trotzdem eine Kopie der Datei erstellt werden muss.