1

(Под неправильным я подразумеваю "сломаю вещи".)

Предположим, мы собираемся использовать dd . Мы выбрали правильный набор if , of и, возможно, seek и skip . Мы тщательно позаботились о том, чтобы команда не записывала за пределы предполагаемой области вывода.

Как теперь мы можем тонко сломать вещи, выбрав плохую комбинацию bs и count? Как бы мы узнали?

Причина, по которой я спрашиваю, заключается в том, что, похоже, появляются магические предпочтительные значения. Например, в этом вопросе о генерации случайного файла 1G первые два ответа используют if=/dev/urandom , of=sample.txt , bs=64M и count=16 .

Как создать случайный файл размером 1 ГБ в Linux?

Конечно, это не единственные действительные настройки, но оба ответа использовали эти настройки, что говорит о том, что этот выбор особенно хорош и обоснован. Особенно в таком случае, когда нет файловой системы или даже физического диска, мне не ясно, может ли выбор настроек быть неправильным - не просто неэффективным, но неправильным. Я предполагаю, что dd должен записывать целое число блоков одновременно, так как bs увеличивается, увеличивается использование памяти, и эти значения влияют только на производительность.

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

Использование dd - это всегда пугающий прыжок веры для меня.

2 ответа2

3

Помогите! 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: пропускать блоки размером N [obs | ibs] в начале [output | input]
  • status=X: (подавить вывод) либо noxfer либо его none

Я чувствую себя намного лучше о dd сейчас

Большой! Вскоре вы будете отправлять загрузочный образ через Интернет для прямой записи на карту microSD с использованием комбинации dd и ssh .

Но что на самом деле означает аббревиатура dd ?

Хороший последний вопрос. На этот вопрос и любые другие, подобные ему, я отошлю вас к записи файла жаргона для dd.


Не стесняйтесь просить разъяснений, если что-то непрозрачнее, чем должно быть!

-3

Ваш вопрос противоречив:

Мы тщательно позаботились о том, чтобы команда не записывала за пределы предполагаемой области вывода.

Как теперь мы можем тонко сломать вещи, выбрав плохую комбинацию bs и count? Как бы мы узнали?

Если вы выбрали неправильную комбинацию bs и count , единственное, что вы можете нарушить, - это записать за пределы предполагаемой области вывода (или не достичь ее, что я считаю той же проблемой)

Если вы тщательно позаботились о том, чтобы команда не записывала за пределы предполагаемой области вывода, вы не можете разбить вещи, потому что вы уже убедились, что ваша комбинация bs и count не плохая. Два не может происходить одновременно. Точно так же, если вы не поняли параметры bs и count , вы не сможете тщательно убедиться, что ваш выходной регион правильный.

Тем не менее, параметр bs в значительной степени является параметром настройки производительности. Если вы укажете значение bs меньше размера физического сектора и будете читать / записывать в необработанном режиме или другое значение, превышающее допустимое значение, dd будет просто, а не скрытно ('Abort: I / O error!«). В противном случае все будет медленно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .