Является ли dd лучше, чем кошка?
Предположим, я хочу клонировать мой жесткий диск (hda
) на другой диск (hdb
) на том же компьютере. Как я вижу, есть два простых, грубых и самостоятельных способа:
cat /dev/hda > /dev/hdb
и
dd if=/dev/hda of=/dev/hdb
Какие технические причины существуют, что последнее часто/всегда считается лучшим, чем первое?
ни в коем случае не пытайтесь выполнять эти команды дома, или ваш UNIX fubar'd
Ответы
Ответ 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 и оболочку для ввода-вывода.