web-dev-qa-db-ja.com

なぜ、 `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スペースを節約しますか?


私はすでに答えを知っていることに注意してください(私はそう思います)。以下に投稿します。質問は将来の参考のためです。

11

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

sparse NUL入力ブロックの出力を書き込むのではなく、シークを試みます

_bs=32M_を使用したため、_conv=sparse_オプションが1回だけの場合にそのジョブを実行するには、右オフセットにゼロの32 MiBブロック全体が必要でした。

オプションbsは、ibs(入力ブロックサイズ)およびobs(出力ブロックサイズ)を設定します。マニュアルでは入力ブロックについて言及していますが、実際に重要なのは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
_

結論は次のとおりです。_conv=sparse_オプションで大きなobsを使用しないでください。一般的なセクターサイズは512バイトなので、_bs=512_がちょうどいいようです。コマンドは次のようになっているはずです。

_dd if=/dev/sdb of=myusb.img conv=sparse bs=512
_
18