古い 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
ゼロで埋められたブロックがあったことが確実にある場合、スペースを節約できなかった理由は使用したバッファが大きいことにあります。
sparse
NUL入力ブロックの出力を書き込むのではなく、シークしようとする
を使用したので、オプションが一度だけでも機能するbs=32M
には、右オフセットに 32 MiB のゼロ ブロック全体が必要でした。conv=sparse
オプションは(入力ブロックサイズ)と(出力ブロックサイズ)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
結論としては、large obs
withconv=sparse
オプションは使用すべきではありません。一般的なセクター サイズは 512 バイトなので、bs=512
ちょうど良いようです。コマンドは次のようになるはずです。
dd if=/dev/sdb of=myusb.img conv=sparse bs=512