Please scroll down for english version!

Gestern Abend hatte ich darüber nachgedacht, ob es mit dd irgendwie möglich ist, differentielle dumps zu erstellen.
Dabei sollen von einer Datei/einem Device nur die Blöcke in eine bestehende Datei/bestehendes Device geschrieben werden, die sich geändert haben. Hört sich kompliziert an, ist aber eigentlich ganz einfach:

Man macht einen Dump einer Festplatte mit dd. Dann einige Zeit später möchte man die Platte wieder dumpen ohne erneut das ganze File zu schreiben. Da wäre es praktisch, wenn man lediglich die Änderungen also quasi das Delta schreiben müsste.

Die kurze Version:
Es geht, hier ist das Skript. Bitte reinschauen und ggf. anpassen, das ist ganz schnell und dreckig runtergehackt.

Die lange Version:
Was das Skript macht ist erstmal die beiden Dateigrößen einzulesen. Die werden dann in K und M Blocks umgerechnet. Dann wird je ein Block der Quelle und des Ziels gelesen und die MD5 Summe erstellt. Unterscheiden sie sich, sind die Blöcke unterschiedlich, haben sich also geändert. Die Nummer des Blocks wird in einem Array gespeichert. Anschließend werden die unterschiedlichen Blöcke aus der Quelle gelesen und über skip/seek und notrunc in das Ziel geschrieben. Anschließen kann man sich die MD5 Summen von Quelle und Ziel berechnen lassen (optional).
Die ganze Aktion ist natürlich völliger Schwachsinn, weil man um die MD5 Summen der Blocks zu errechnen 1. die Quelle und 2. das Ziel komplett lesen muss. Das Ganze macht also nur Sinn, wenn man zwar rel. schnell lesen aber nur sehr langsam schreiben kann.

Zum Beispiel:
-Target liegt auf einem entfernten Rechner (Internet, WAN, etc. pp) und der entfernte Rechner hat hohen Upstream man selbst aber nur einen sehr geringen
-Source ist eine SSD die wesentlich schneller lesen als schreiben kann, sofern man on-the-fly auf das selbe Device schreibt

Aber es hat Spaß gemacht und vielleicht kann ja jemand etwas damit anfangen 😀

Wie gesagt, ist mit Vorsicht zu genießen und wie immer auf eigene Gefahr zu nutzen.

— english version —

Yesterday evening I thought about if it is possible with dd to make differential dumps.
Only changed blocks on a file/device should be written to the target. Sounds complicated but it is quite easy:

If you have a dump of a harddisk, for example, and some time later you want to do a new dump but without writing the whole disk again. Only the changed blocks should be written to the target file.

The short version:
It works, here is the script. Please look at it and modify to fit your needs, it is hacked very quick and dirty.

The long version:
What the script does, is first read the two file sizes and convert it to K and M blocks. Each block is then read from source and target and a MD5 sum is generated. If these two sums are different, then the block has changed. The number of the changed blocks is stored in an array and later the changed blocks are read from the source and written to the target with skip/seek and notrunc. Later you can calculate the MD5 sum of source and target (optional).
Of couse this is totally useless, because to calculate the MD5 sums of the blocks you both have to read the source AND the target file completely. This whole thing will only make sense if you can read very fast but only write very slow.

For example:
-Target lies on a remote machine (Internet, WAN, etc. pp) and the remote machine has a much higher upstream bandwith than your local machine
-Source is a SSD which can read much faster than it can write, if you read/write on the same device.

However, it was fun writing the script and maybe it is of use to someone.

Be careful, as always this comes without warranty and use at your own risk 😉