Почему `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 МБ с правым смещением, чтобы 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 obswith conv=sparseoption. Обычный размер сектора составляет 512 байт, так что bs=512кажется правильным. Ваша команда должна была быть:

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

Связанный контент