Подтвердить что ты не робот

Является ли dd лучше, чем кошка?

Предположим, я хочу клонировать мой жесткий диск (hda) на другой диск (hdb) на том же компьютере. Как я вижу, есть два простых, грубых и самостоятельных способа:

cat /dev/hda > /dev/hdb

и

dd if=/dev/hda of=/dev/hdb

Какие технические причины существуют, что последнее часто/всегда считается лучшим, чем первое?

ни в коем случае не пытайтесь выполнять эти команды дома, или ваш UNIX fubar'd

4b9b3361

Ответ 1

Большая разница между простым "cat" и "dd" заключается в том, что dd гарантирует, что все чтения и записи выполняются с указанным вами размером. Это может быть значительным, в зависимости от того, какое устройство (и версия * nix) вы используете.

Ответ 2

Несколько точек.

ltrace cat </dev/zero >/dev/null предполагает, что кошка более эффективна по умолчанию, поскольку он не memcpy и, что более важно, использует буферы 4KiB по умолчанию.

ltrace dd if=/dev/zero of=/dev/null показывает, что dd по умолчанию использует 512B, которые очень неэффективны для чтения современных дисков (хотя ядро ​​должно немного смягчить это с помощью различного планирования диска). Однако dd гораздо более настраивается, чем кошка, и вы можете использовать что-то вроде bs = 2M, чтобы уменьшить количество системных вызовов

dd проблематично при наличии ошибок на диске и может висеть или, что более важно, игнорировать нечитаемые данные, что приводит к повреждению целевого диска. Вместо этого рассмотрите dd_rescue или ddrescue.

Ответ 3

Это действительно исторический, и не очень важный, если все, что вы собираетесь сделать, - клонировать один диск на другой.

В традиционном Unix диски были доступны как с блочными устройствами, так и с символьными устройствами, и каждый из них имел разные требования. "dd" был необходим для взаимодействия с блочными устройствами, потому что "кот" знал только о символьных вводах/выводах. (Блочный ввод-вывод был особенно важен для эффективного использования таких вещей, как ленточные накопители.)

dd может быть удобно, если вам нужно заново запустить долговременную копию из-за ее параметров пропуска и поиска.

Если вы не находитесь в системе, которая по-прежнему имеет различие между блоком и символом для доступа к диску (какой Linux нет), и если вам не нужно делать что-то вроде байтов swap, "cat" будет в порядке (и, вероятно, быстрее, потому что по умолчанию размер блоков будет меньше, чем dd).

Обратите внимание, что, если кто-то не выполнил какое-то крупное мастерство в дизайне оболочки с тех пор, как я смотрел, "cat foo > bar" не делает запись в "bar" через оболочку; все оболочки имеют открытый "бар" для записи с усечением, а затем передают дескриптор открытого файла в "cat" через fork/exec в качестве дескриптора файла 1 (stdout). В этот момент оболочка выходит из цикла и не участвует снова, за исключением того, что она уведомляется о статусе выхода "cat" .

Ответ 4

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

Ответ 5

Я был на Ubuntu 12.04, и мой опыт состоял в том, что я мог бы "котировать" раздел (/dev/sda1), но не все устройство (/dev/sda). Я мог только успешно клонировать устройство с помощью `dd '. Каким-то образом информация раздела и загрузочный сектор были потеряны, если cat/dev/sda.

Ответ 6

Если я правильно помню, dd гораздо более "низкий уровень" в подходе, пропуская такие мелочи, как файловые системы и все колокола и свистки:)

Однажды, dd буквально спас мою драгоценную, ehm, жизнь:

застрял с линекс-коробкой, полной "АБСОЛЮТНО НЕПРЕРЫВНЫХ ДАННЫХ" от одного подрядчика, с waaaay для многих плохих секторов, что единственное, что можно было использовать, это аварийная оболочка Linux. Я упоминал о невозможности открыть коробку, чтобы получить диск? Ах, да, нет USB и такого...

А потом, свет!!! dd и ftp работают!!! Ahhh, освежающий! Сохраняя ваш день (и карьеру) с аккуратным заклинанием командной строки, чтобы сделать резервный дамп на удаленном диске с ftp...

Что-то вроде put |dd if=/dev/hda bs=4096 count= ???? или подобное...

cat не работал у меня тогда...

Ответ 7

Там мало практических различий.
Внутри они оба оптомизируют, чтобы использовать почти те же самые cals.

dd имеет ряд полезных дополнительных функций для более сложных копий данных и может быть признан более "нормальным" для такого рода задач другими пользователями. Но простой "кот" является сущностью unix,

Ответ 8

Интересно... Я видел рекомендации в прошлом, чтобы делать такую ​​операцию копирования с различными перестановками dd, cpio или tar, но никогда не cat.

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

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

Ответ 9

Вы хотите использовать dd, чтобы вы могли указывать такие вещи, как bsize, что как можно читать/писать сразу; настройка этого на несколько кратных 4k будет намного быстрее, чем кошка, которая, я думаю, будет ограничена задействованными трубами.

Ответ 10

dd должен быть быстрее, потому что он выполняет ввод-вывод внутри, в отличие от cat, который использует stdio и оболочку для ввода-вывода.