Почему `dd conv = sparse` не сэкономил место, как я ожидал?

5064
Kamil Maciorowski

Я собирался сделать образ моего старого 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сэкономили место?


Обратите внимание, я уже знаю ответ (я думаю). Я публикую это ниже. Вопрос для дальнейшего использования.

4

1 ответ на вопрос

9
Kamil Maciorowski

Если вы абсолютно уверены, что были заполненные нулями блоки, то причиной, по которой вы не сохранили места, был большой используемый буфер. От 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 

Вывод: вы не должны использовать большое obsс conv=sparseопцией. Общий размер сектора составляет 512 байт, так что bs=512кажется правильным. Ваша команда должна была быть:

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

Похожие вопросы