単一のファイルシステムを含むループバック ファイルがあり、これを と呼びますfs.image
。また、複数のパーティションと複数のファイルシステムを含む、さらに大きな別のループバック ファイルがあり、これを と呼びますdisk.image
。
fs.image
は、 のパーティションの 1 つとまったく同じサイズです。そこからデータを正しい場所のファイルdisk.image
にコピーしたいと思います。disk.image
適切なオフセットを計算し、dd
を使用してこれを実行しようとするスクリプトがあります。ブロック デバイスで動作するため、これが機能すると想定していましたが、そうではありません。 は、disk.image
書き込まれたデータの直後の位置で切り捨てられます。
dd
ファイルが切り捨てられないようにする方法はありますか?
fs.image
は として圧縮されておりfs.image.bz2
、実行しているコマンドは次のようになります。
bzcat fs.image.bz2 | dd of=disk.image bs=4M seek=$OFFSET
$OFFSET
計算されたオフセットはどこですか。
これを実現する他の方法も考えましたが、これが最も簡単なようです (うまくいけば)。1 つのオプションは、挿入ポイントまでのデータを別のファイルにコピーし、ファイルシステムを追加し、最後に元のファイルの残りを追加することです。ただし、実際には必要のない大量のデータをコピーするため、この方法は遅くなります。他のオプションも検討します。
答え1
GNU dd
(少なくともバージョン8.23)には次のものがあります変換フラグ
実行しない 出力ファイルを切り捨てない
これはまさにあなたが望んでいることを実行します。ここに小さな例を示します。
$ 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