„Hardlinken“ von Teilen einer großen Datei, in der sich nur ein kleiner Teil geändert hat

„Hardlinken“ von Teilen einer großen Datei, in der sich nur ein kleiner Teil geändert hat

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 btrfsDateisystems eröffnet hier einige sehr nützliche Möglichkeiten. Beachten Sie, dass btrfsdies 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 btrfsDateisystem 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 subvolumenicht 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 btfrskönnen Sie auch erwägen, das Image der virtuellen Maschine auf einer oder beiden Seiten des Backups zu mounten und rsynczwischen den beiden Mount-Punkten zu verwenden.

Dieser Blogzeigt, wie man ein Virtual Box- .vdiImage 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 --inplaceOption 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 rsyncVersionen <2.6.4 sind die beiden vollständig inkompatibel), da am Ziel trotzdem eine Kopie der Datei erstellt werden muss.

verwandte Informationen