Когда настройки bs и count для dd неправильны?
(Под неправильным я подразумеваю "сломаю вещи".)
Предположим, мы собираемся использовать dd
, Мы выбрали правильный набор if
, of
и, возможно, seek
а также skip
, Мы тщательно позаботились о том, чтобы команда не записывала за пределы предполагаемой области вывода.
Как мы можем теперь тонко сломать вещи, выбрав плохую комбинацию bs
а также count
? Как бы мы узнали?
Причина, по которой я спрашиваю, заключается в том, что, похоже, появляются магические предпочтительные значения Например, в этом вопросе о генерации случайного файла 1G первые два ответа используют if=/dev/urandom
, of=sample.txt
, bs=64M
, а также count=16
,
Как создать случайный файл размером 1 ГБ в Linux?
Конечно, это не единственные действительные настройки, но оба ответа использовали эти настройки, что говорит о том, что этот выбор особенно хорош и обоснован. Особенно в таком случае, когда нет файловой системы или даже физического диска, мне не ясно, может ли выбор настроек быть неправильным - не просто неэффективным, но неправильным. Я думаю, что dd
необходимо записать целое число блоков одновременно, чтобы bs
увеличивается, увеличивается использование памяти, и эти значения влияют только на производительность.
Этот пример является лишь примером, а не тем, что меня конкретно интересует, поэтому давайте разберемся со случаями, когда то, что копируется, имеет файловую систему.
Использование dd - это всегда пугающий прыжок веры для меня.
2 ответа
Помогите! dd
это страшно!
Ты не одинок. Из советов по Linux:
Команда ' dd ' является одной из оригинальных утилит Unix и должна быть у каждого в наборе инструментов... Некоторые люди считают, что dd означает "Уничтожить диск" или "Удалить данные", потому что, если он используется не по назначению, файл раздела или выходной файл может быть удален очень быстро. Поскольку dd - это инструмент, используемый для записи заголовков дисков, загрузочных записей и аналогичных областей системных данных, неправильное использование dd, вероятно, разрушило многие жесткие диски и файловые системы.
Но не беспокойтесь. Узнав о его тонкостях, вы будете вызывать dd
со спокойной грацией ковбоя родео.
Это сломается? Что это count
ИНГ bs
?
Давайте сначала разберемся с первым вопросом.
Как мы можем теперь тонко сломать вещи, выбрав плохую комбинацию
bs
а такжеcount
? Как бы мы узнали?
Если вы имеете в виду "непреднамеренные последствия" под "разрывом", то просто указав их теоретически. Что я имею в виду под этим? Ну, допустим, вы хотите скопировать image.img
на SD-карту, расположенную в /dev/sdc
, Итак, вы соответствуете параметрам в вашем примере:
# dd if=/home/someone/image.img of=/dev/sdc bs=64M count=16
Должно быть хорошо, чтобы использовать эти настройки правильно? Давай просто подождем dd
закончить... теперь, что это говорит?
16+0 records in
16+0 records out
1073741824 bytes (1.1 GB) copied, 34.1303 s, 31.5 MB/s
Только 1,1 ГБ скопировано! Но image.img
2 ГБ или около того, я хочу, чтобы все это скопировалось! Говоря dd
чтобы скопировать 16 лотов по 64M (где M=1024*1024, кстати), вы указали размер. Вы бы знали по статусу вывода. Если вы хотите скопировать весь файл, либо сопоставьте размер с bs
а также count
; или просто опустить их полностью:
# dd if=/home/someone/image.img of=/dev/sdc
4364864+0 records in
4364864+0 records out
2234810368 bytes (2.2 GB) copied, 45.9502 s, 48.6 MB/s
Что произойдет, если мы станем очень непослушными и скажем dd
скопировать больше данных, чем доступно?
# dd if=/home/someone/image.img of=/dev/sdc bs=1M count=4096
2131+1 records in
2131+1 records out
2234810368 bytes (2.2 GB) copied, 77.9768 s, 28.7 MB/s
Ах, dd
копирует столько байтов, сколько получает. Это удобно
мониторинг dd
Говоря о состоянии вывода, dd
(Вариант GNU) уважает и реагирует на сигнал INFO SIGUSR1
:
# echo "In another terminal or TTY"
# pkill -USR1 -n -x dd
# echo "Printed to stdout on the terminal/tty running dd:"
534+0 records in
534+0 records out
559939584 bytes (560 MB) copied, 1.68414 s, 332 MB/s
Удобно для того, чтобы следить за передачей, которая идет медленно или вы ожидаете зависания по какой-либо причине. Пары красиво с watch
, но обязательно дайте watch
достаточно длительный интервал времени.
Есть ли dd
есть ли другие варианты, о которых я должен знать?
dd
действительно есть другие варианты, но в большинстве случаев, если вам нужно их использовать, вы будете знать, что они делают. Тем не менее, несколько примеров могут дать вам представление:
conv=CONVS
: преобразовать ввод в соответствии с одним или несколькими вариантами преобразованияseek=N
а такжеskip=N
: пропустить блоки размером [obs|ibs] в начале [output | input]status=X
: (подавить вывод) либоnoxfer
или жеnone
Я чувствую себя намного лучше dd
сейчас!
Большой! Вскоре вы будете отправлять через Интернет загрузочный образ для записи прямо на карту microSD, используя комбинацию dd
а также ssh
,
Но что dd
аббревиатура на самом деле означает?
Хороший последний вопрос. На этот вопрос и любые другие, подобные ему, я отсылаю вас к записи файла жаргона дляdd
,
Не стесняйтесь просить разъяснений, если что-то непрозрачнее, чем должно быть!
Ваш вопрос противоречив:
Мы тщательно позаботились о том, чтобы команда не записывала за пределы предполагаемой области вывода.
Как теперь мы можем тонко сломать вещи, выбрав плохую комбинацию bs и count? Как бы мы узнали?
Если вы выбрали плохую комбинацию bs
а также count
единственное, что вы можете нарушить, - это записать за пределы предполагаемой области вывода (или не достичь ее, что я считаю той же проблемой)
Если вы тщательно удостоверились, что команда не будет записывать после вашей предполагаемой области вывода, вы не сможете разбить вещи, потому что вы уже обеспечили свою комбинацию bs
а также count
не плохо Два не может происходить одновременно. Точно так же, если вы не поняли bs
а также count
parameters, you can't possibly have carefully ensured your output region is correct.
Тем не менее, bs
parameter is largely a performance tuning parameter. Если вы укажете bs
smaller than the physical sector size and you are reading/writing in raw mode, or another completely out-of-whack value, dd
will simply, and not in a subtle manner ('Abort: I/O error!'). Otherwise, things will just be slow.