Ich habe eine Loopback-Datei, die ein einzelnes Dateisystem enthält, nennen wir sie fs.image
. Ich habe eine andere, viel größere Loopback-Datei, die mehrere Partitionen und mehrere Dateisysteme enthält, nennen wir sie disk.image
.
fs.image
ist genau so groß wie eine der Partitionen in disk.image
. Ich möchte die Daten daraus in die disk.image
Datei an den richtigen Ort kopieren.
Ich habe ein Skript, das den richtigen Offset berechnet und dies mit versucht dd
. Ich nahm an, dass dies funktionieren würde, da es mit einem Blockgerät funktioniert, aber das ist nicht der Fall. disk.image
wird an der Position abgeschnitten, die unmittelbar auf die gerade hineingeschriebenen Daten folgt.
Gibt es eine Möglichkeit, dd
das Abschneiden der Datei zu verhindern?
fs.image
ist komprimiert als fs.image.bz2
, und der Befehl, den ich ausführe, sieht folgendermaßen aus:
bzcat fs.image.bz2 | dd of=disk.image bs=4M seek=$OFFSET
wo $OFFSET
ist mein berechneter Offset.
Ich habe über andere Möglichkeiten nachgedacht, dies zu erreichen, aber dies scheint die einfachste zu sein (wenn es funktioniert). Eine Möglichkeit wäre, Daten bis zum Einfügepunkt in eine andere Datei zu kopieren, das Dateisystem anzuhängen und schließlich den Rest der Originaldatei anzuhängen. Dies wäre jedoch langsam, da ich viele Daten kopieren würde, die ich nicht wirklich brauche. Ich bin offen für andere Optionen.
Antwort1
GNU dd
(ab Version 8.23) hat folgendesKonvertierungsflag
nichtrunc die Ausgabedatei nicht kürzen
das macht genau das, was Sie wollen; hier ist ein kleines Beispiel:
$ cat foo
foobar
$ echo -n XX | dd of=foo bs=1c seek=1 conv=notrunc
2+0 records in
2+0 records out
2 bytes (2 B) copied, 0.000283698 s, 7.0 kB/s
$ cat foo
fXXbar