ddを使用してファイルから別のファイルの特定の場所にデータをコピーすると、出力ファイルが切り捨てられる

ddを使用してファイルから別のファイルの特定の場所にデータをコピーすると、出力ファイルが切り捨てられる

単一のファイルシステムを含むループバック ファイルがあり、これを と呼びます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

関連情報