古い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
スペースを節約しますか?
私はすでに答えを知っていることに注意してください(私はそう思います)。以下に投稿します。質問は将来の参考のためです。
ゼロで埋められたブロックが確実にある場合、スペースを節約できなかった理由は、使用した大きなバッファーにあります。 _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
_