`dd conv=sparse` が期待どおりにスペースを節約しなかったのはなぜですか?

`dd conv=sparse` が期待どおりにスペースを節約しなかったのはなぜですか?

古い USB ドライブのイメージを作成するつもりでした。デバイスにゼロで埋められたブロックがいくつかあると予想する十分な理由があったので、スペースを節約するために次のconv=sparseオプションを使用しました。

dd if=/dev/sdb of=myusb.img conv=sparse bs=32M

しかし、それは何も救いませんでした:

$ ls -hls myusb.img
250M -rw-r--r-- 1 root root 250M Oct 18 21:31 myusb.img

デバイス上にはゼロで埋められたブロックがあるはずです。なぜdd conv=sparseスペースを節約しなかったのですか?


注: 私はすでに答えを知っています (そう思います)。以下に投稿します。この質問は将来の参考用です。

答え1

man ddゼロで埋められたブロックがあったことが確実にある場合、スペースを節約できなかった理由は使用したバッファが大きいことにあります。

sparseNUL入力ブロックの出力を書き込むのではなく、シークしようとする

を使用したので、オプションが一度だけでも機能するbs=32Mには、右オフセットに 32 MiB のゼロ ブロック全体が必要でした。conv=sparse

オプションは(入力ブロックサイズ)と(出力ブロックサイズ)bsを設定します。マニュアルにはibsobs入力ブロック、実際に重要なのは ですobs

以下はいくつかのテストの結果です。(私は OP なので、まったく同じデバイスでテストを行いました。) 各ファイルはパターンに従って名前が付けられています<obs_used>.img。最初の列に注目してください。

$ ls -hlst *.img
250M -rw-r--r-- 1 root root 250M Oct 18 22:02 4M.img
250M -rw-r--r-- 1 root root 250M Oct 18 22:02 2M.img
249M -rw-r--r-- 1 root root 250M Oct 18 22:02 1M.img
248M -rw-r--r-- 1 root root 250M Oct 18 22:01 512K.img
248M -rw-r--r-- 1 root root 250M Oct 18 22:01 256K.img
247M -rw-r--r-- 1 root root 250M Oct 18 22:00 128K.img
247M -rw-r--r-- 1 root root 250M Oct 18 21:57 64K.img
247M -rw-r--r-- 1 root root 250M Oct 18 21:56 32K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:55 16K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:54 8K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:53 4K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:52 2K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:51 1K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:44 512.img

結論としては、large obswithconv=sparseオプションは使用すべきではありません。一般的なセクター サイズは 512 バイトなので、bs=512ちょうど良いようです。コマンドは次のようになるはずです。

dd if=/dev/sdb of=myusb.img conv=sparse bs=512

関連情報