В чем разница между 'bs', 'count' и 'seek' в команде dd?

24

Я прочитал много руководств и сообщений на форуме , описывающие , как использовать dd, но одна вещь , которую я заметил, что люди всегда используют различные значения для bs=, count=и seek=переключатели.

Кто-нибудь может объяснить, что именно делают эти переключатели (справочная страница не очень подробная), и объяснить, какие настройки для них лучше всего подходят для различных задач, таких как создание файлов из / dev / random или / dev / zero и перезапись перегородки и внешние накопители.

Эрик
источник
Попробуйте документацию GNU для dd или версию POSIX .
jw013

Ответы:

27

Я действительно не знаю, как объяснить это лучше, чем справочная страница.

bs=устанавливает размер блока, например bs=1M, будет размер блока 1 МБ.

count=копирует только это количество блоков (по умолчанию dd продолжает работать вечно или пока не закончится ввод). В идеале блоки имеют bs=размер, но могут иметь место неполные операции чтения, поэтому, если вы используете count=для копирования определенный объем данных ( count*bs), вы также должны предоставить iflag=fullblock.

seek= ищет это количество блоков в выводе вместо записи в самое начало устройства вывода.

Так, например, это копирует 1MiB y\nна 8MiB выходного файла. Таким образом, общий размер файла составит 9 МБ.

$ yes | dd bs=1M count=1 seek=8 iflag=fullblock of=outputfile
$ ls -alh outputfile
9.0M Jun  3 21:02 outputfile
$ hexdump -C outputfile
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00800000  79 0a 79 0a 79 0a 79 0a  79 0a 79 0a 79 0a 79 0a  |y.y.y.y.y.y.y.y.|
*
00900000

Поскольку вы упоминаете /dev/randomи перезаписываете разделы ... это займет вечность, так /dev/randomкак (а также /dev/urandom) слишком медленный. Вы можете просто использовать shred -v -n 1вместо этого, это быстро и обычно доступно где угодно.

frostschutz
источник
21

Хорошо, вы сказали, что справочные страницы не детализированы, поэтому я объясню, что они имеют в виду, с помощью простых для понимания метафор о движущемся парне (так называется имя dd):

   bs=BYTES
          read and write up to BYTES bytes at a time

ddподнимает что-то (коробки, вазы, кровати, рис и т. д.), перемещается туда, где это необходимо, и бросает. Пока он не уронит груз, он больше ничего не выберет. Теперь, когда вам нужно точно сказать ему, сколько объектов он должен выбрать за путешествие, это то, что bsнужно сделать. Вы устанавливаете количество данных, которые он будет читать и записывать. Это почти обязательно во всех полезных и общих командах.

   count=N
          copy only N input blocks

Это определит общее количество ящиков, которые он будет перемещать. Коробки в этом контексте - это блоки на диске . Вы говорите ему переместить 5 коробок, он перемещает только 5 коробок, даже если имеется более 5 коробок (если меньше 5 коробок, он возьмет вазу, которую он обнаружит, кроме коробок, чтобы сложить ее). Если вы скажете , ddчтобы countтолько 5, и записать его куда - нибудь, он будет копировать первые 5 блоков , которые он видит и записать их , где вы хотите.

   seek=N skip N obs-sized blocks at start of output

Парень обычно находит первое доступное место для сброса нагрузки, это обычно в начале (на диске) и продолжает заполняться до конца. Ну, с этим вы говорите, ddчтобы начать дальше, скажем, вместо зала, начните в одной из комнат дальше внутри. Это просто «пропустить» стартовые блоки.

Теперь, в зависимости от того, что вы делаете, вам потребуются разные комбинации в зависимости от источника и места назначения, а также формата, в котором они будут читаться и записываться. Я рекомендую вам искать их отдельно.

Braiam
источник
«Он возьмет вазу, которую он нашел, кроме коробок, чтобы сложить ее». Что означает эта метафора?
Ини
1
@Ini что если есть соседний блок, который не принадлежит if read, dd прочитает его и тоже переместит. Ваза - это не коробка, но ДД перемещает ее.
Брайам