為什麼 `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

sparse嘗試尋找而不是寫入 NUL 輸入塊的輸出

您使用了bs=32M,因此您需要在正確的偏移處有一整個 32 MiB 的零塊,以便該conv=sparse選項能夠完成其工作(即使只有一次)。

選項bs設定ibs(輸入區塊大小)和obs(輸出區塊大小)。雖然手冊提到輸入區塊,實際上重要的是obs

以下是一些測試的結果。 (因為我是操作員,所以我使用同一台設備進行了測試。)每個文件都根據<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

相關內容