5

При записи файлов изображений на диск или на USB-накопитель в инструкциях обычно используется dd , например:

dd if=myimage.img of=/dev/sdb

Чем это отличается от, скажем:

cat myimage.img > /dev/sdb

Я понимаю, что у dd гораздо больше опций, например count=... , но если целью упражнения является запись всего файла на устройство, в чем преимущество использования dd?

1 ответ1

2

Этот вопрос звучит так: «У меня есть один инструмент, который может рисовать прямоугольники, а другой - ромбы; какой инструмент является правильным для рисования квадрата?"

Любой квадрат - это особый случай прямоугольника и особый случай ромба, поэтому можно использовать любой из двух инструментов.

То же самое с dd и cat . Первый может конвертировать, пропускать и искать, корректировать размер буфера; но в простом случае он просто читает один файл (или блочное устройство) и записывает необработанные данные в другой. Последний может объединять несколько файлов в один поток с некоторыми необязательными текстовыми изменениями, но в простом случае есть только один входной файл, содержимое которого передается (с поддержкой оболочки) в выходной файл или устройство.

Оба инструмента полезны, и ни один из них не может быть отброшен в пользу другого. Их возможности просто перекрываются в этом простом случае, о котором вы спрашиваете.


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

1. Блокировать права доступа к устройству

Для записи в файл или на устройство cat необходимо перенаправить вывод. Ваша оболочка выполняет перенаправление, т.е. открывает целевой файл. При перенаправлении в /dev/sdb вы, вероятно, нажмете "Отказано в доступе", если вы не вошли в систему как root. Запускать оболочку от имени пользователя root рискованно, и его следует избегать.

Вы можете попробовать

sudo cat myimage.img > /dev/sdb

и потерпеть неудачу, потому что sudo не влияет на перенаправление вывода, выполняемое оболочкой.

С другой стороны, это совершенно не проблема:

sudo dd if=myimage.img of=/dev/sdb

Кстати, небольшой совет: если вы оказались в ситуации, когда вам нужно перенаправить вывод в файл с ограниченным доступом, вы можете использовать этот трюк:

some_command | sudo tee restricted_file > /dev/null

Это приводит нас к еще одному способу выполнения работы. Команда tee передает свой ввод нескольким файлам и стандартному выводу. В простом случае есть один файл и стандартный вывод отбрасывается:

sudo tee /dev/sdb < myimage.img > /dev/null

В этом случае также существует перенаправление ввода, на которое не влияет sudo .

2. Выходя за рамки простого случая

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

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

Теперь опции, предоставляемые dd , часто полезны для меня, когда я читаю или пишу на устройство:

  • conv=noerr - когда источник может быть неисправен;
  • bs=… - большой буфер не исчерпает мой жесткий диск;
  • count=… - прочитать фрагмент, например MBR;
  • conv=sparse - для уменьшения размера изображения при некоторых обстоятельствах.

Есть еще кое-что. Эта команда:

kill -s USR1 $(pidof dd)

заставляет dd выводить статистику ввода / вывода на стандартную ошибку. Я не думаю, что вы можете сделать это с cat .

По этим причинам я считаю dd естественным инструментом для работы с необработанными изображениями. Я не вижу смысла менять инструмент на cat только потому, что в каком-то особом случае нет никакой разницы. Я хотел бы думать, что инструкции обычно используют dd потому что их авторы думают как я. Существует некоторая элегантность в способности сознательно выбирать правильный инструмент, особенно когда есть и другие, которые кажутся одинаково подходящими.


В конце я признаю, что использовал pv myimage.img | sudo tee /dev/sdb > /dev/null . Я отказался от своего правильного инструмента, но pv дал мне индикатор выполнения. Если вам не нужно объединить (или разбить ваши двоичные данные с помощью текстового инструмента), cat ничего не даст.

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