为什么“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

结论是:您不应该使用 largeobs选项conv=sparse。常用的扇区大小为 512 字节,因此bs=512似乎正好合适。您的命令应该是:

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

相关内容