In-Place-Delta schreibt aus einer Pipe

1084
Atemu

Ich suche nach einer Möglichkeit, nur die Teile einer Datei zu überschreiben, die sich von dem unterscheiden, was in die Datei geschrieben werden soll, sodass die Datei mit der geringst möglichen Anzahl von Schreibvorgängen auf die Festplatte geändert wird.

Mein Plan ist, ein wenig Deduplizierung durchzuführen, während ich meine NTFS-Partition in einer Image-Datei gesichert habe, indem diese Image-Datei eine reflinkierte Kopie eines vorherigen Backup-Images auf einem BTRFS ist.
(Betrachten Sie es als einen Hardlink, auf den Sie schreiben können, ohne die Originaldatei zu ändern.)

Ich fülle die unbenutzten Teile meiner NTFS-Partition mit Nullen auf, indem ich in sie hineinpfeife. partcloneDie Eingabe ist also eine Pipe anstelle eines Geräts.
Betrachten Sie es als

cat /dev/sda4 | command -i - -o newbackup.img

Wo commandist was ich suche und newbackup.imgist eine Datei, die bereits 894GiB an Daten enthält, die weitgehend der Eingabe entspricht, aber die tatsächliche Plattenbelegung der Image-Datei ist gleich der Anzahl Blöcke, die überschrieben werden.

rsyncMit den --no-whole-file --inplaceParametern (IIRC) ist dies dank des Delta-Transfers möglich, aber es ist unnötig langsam (liest Ein- und Ausgabe nicht gleichzeitig, verarbeitet die Deltas in einem einzigen Thread und ist im Allgemeinen sehr zeituneffizient) und rsyncfunktioniert auch nicht Pfeifen (meines Wissens), also steht es außer Frage.

2
Es gibt Tools zum Erstellen von "binären" Patches und zum Anwenden der Patches, siehe zB [hier] (https://stackoverflow.com/questions/1945075/how-do-i-create-binary-patches). Benötigen Sie das? Pipes sind per Definition seriell, Sie können also nicht in einer Pipe suchen, also keine In-Place-Delta-Schreibvorgänge, aber Sie sollten in der Lage sein, einen binären Patch aus einer Pipe und einer vorhandenen Datei zu erstellen (obwohl ich nicht getestet habe Das). dirkt vor 5 Jahren 0
Ich verstehe nicht ganz, warum Sie suchen müssen, um eine Pipe für In-Place-Delta-Schreibvorgänge zu suchen. Sollte dies nicht vollständig sequentiell sein? In meinem Kopf würde es so funktionieren: n Bits aus Pipe lesen; n Bits aus Datei lesen; Wenn sie nicht gleich sind, überschreiben Sie diese n Bits in der Datei. Wiederholen Sie mit den nächsten n Bits. Atemu vor 5 Jahren 0
Ah, ich habe nicht verstanden, dass dies unter "In-Place-Delta-Schreibvorgängen" gemeint ist - mein Verständnis war "In-Place" = für eine vorhandene Datei, keine Kopie, und "Delta-Schreibvorgänge" = Schreiben nur diese Teile, die sich ändern. Was "n Bits aus Pipe und aus Datei lesen, überschreiben, wenn nicht gleich" lautet: Ein solches Programm ist einfach zu schreiben. Es wäre jedoch effizienter, die Datei einfach zu überschreiben: Sie haben jetzt n Blockschreibvorgänge anstelle von n Blocklesevorgängen und m Blockschreibvorgängen, wobei m die Anzahl der geänderten Blöcke ist. Wenn Sie Schreibzugriffe aus irgendeinem Grund vermeiden möchten, sind sie auf Ihrem Medium teurer als Lesevorgänge. dirkt vor 5 Jahren 0
@dirkt CoW-Verhalten von Btrfs ist der Grund. Durch das Überschreiben eines Teils einer umgeflippten Datei nimmt der Teil seinen eigenen Speicherplatz auf dem Gerät ein, anstatt Blöcke auf Dateisystemebene gemeinsam zu nutzen. Dies geschieht auch, wenn Sie mit den gleichen Daten überschreiben. Dies ist der Punkt. Wenn Sie nicht veränderte Teile intakt lassen, sparen Sie Platz auf dem Gerät. Kamil Maciorowski vor 5 Jahren 2
Sieht so aus, als sollte der eigentliche Fix eine BTRFS-Option sein ... Wie gesagt, das Programm ist einfach zu schreiben. Ein paar Zeilen mit C-Code, mehr, wenn Sie Blocksize usw. einstellen möchten. dirkt vor 5 Jahren 0

0 Antworten auf die Frage