Почему дд слишком долго?

17

Мне нужно скопировать один диск на другой. Я попытался с помощью команды ниже, и это занимает почти день, чтобы скопировать 1 ТБ диска в federo.

dd if=/dev/sda of=/dev/sdb 

Я попробовал то же самое в системе Unix (HP-UX) с помощью приведенной ниже команды, и она завершается в течение нескольких часов.

dd if=/dev/sda of=/dev/rdsk

Какую альтернативу я мог бы использовать для более быстрого копирования с диска на диск?

ККД
источник
2
cp /dev/sda /dev/sdbили ( pv /dev/sda > /dev/sdb чтобы получить индикатор выполнения) будет намного быстрее. Почему вы используете ddздесь? ddбыло бы полезно только с вещами , как conv=sync,noerrorдля рукояток дисков с ошибками, но даже тогда было бы больше смысла использовать такие вещи , как ddrescueвместо (смотри также pv«s -Eвариант).
Стефан Шазелас
1
@ StéphaneChazelas catможет быть даже быстрее, но разница не столь существенна (возможно, больше для устройства к устройству, чем для файла в файл, как в моем эксперименте).
Жиль "ТАК - перестань быть злым"
8
«Я попробовал то же самое в системе Unix» - так на каком типе системы вы пробовали первую, если не на Unix? Кроме того, что оборудование, и т. Д., Yaddayadda.
marcelm
Добро пожаловать в ddловушку № 1
Дмитрий Григорьев
Использовал первый в HP-UX (блейд Integrity), а также ранее использовавшийся аппарат Solaris.
KKD

Ответы:

28

ddимеет много (странных) опций, см. dd (1) .

Вы должны явно указать размер буфера, поэтому попробуйте

dd if=/dev/sda of=/dev/sdb bs=16M

IIRC, размер буфера по умолчанию составляет всего 512 байт. Команда выше устанавливает его до 16 мегабайт. Вы можете попробовать что-то меньшее (например bs=1M), но вы должны использовать больше, чем по умолчанию (особенно на недавнем оборудовании диска с секторами по 4 Кбайт, то есть Advanced Format ). Я наивно рекомендую некоторую степень двух, по крайней мере, мегабайт.

С размером буфера по умолчанию в 512 байт, я предполагаю (но я мог бы ошибаться), что оборудование требует, чтобы ядро ​​передавало 4K для каждого блока 512 байт.

Что касается rdsk, в с.о. (4) страницы человека говорят:

В настоящее время предоставляются только блочные устройства. Необработанные устройства еще не были реализованы.

Увеличение размера буфера dd увеличит производительность операций чтения и записи. Теперь все диски имеют аппаратный буфер чтения / записи. Но если вы увеличите размер буфера dd больше, чем аппаратный буфер, его производительность снизится, потому что dd будет читать с первого диска в буфер, когда второй диск будет записывать все из своего собственного аппаратного буфера. Вам необходимо установить bsопцию команды dd каждый раз, когда разные значения для разных устройств.

Василий Старынкевич
источник
Доступен ли rdsk в системах Linux? Я использовал в системах Unix.
KKD
1
Кэш страницы, вероятно, будет обрабатывать блоки по 4 КБ независимо от того, что вы делаете, но вы можете контролировать, сколько системных вызовов dd использует для чтения этих 4 КБ. Я уверен, что есть некоторый размер чтения, выше которого стоимость остановки записи дороже, чем сохраненные системные вызовы, но я не знаю, где находится сладкое место.
бесполезно
Размер блока в несколько МБ лучше, чем 512B по умолчанию, но когда я проверил это, я обнаружил, что catэто также хорошо (для передачи файловой системы в файловую систему прямой блок в блок может иметь различные характеристики производительности). Однако разница не была существенной в любом случае.
Жиль "ТАК - перестань быть злым"
1
Интересно, что в macOS (кстати, SUS-сертифицированный) его быстрее использовать/dev/rdiskX в качестве цели при выполнении dd.
Адиб
1
в случае, если вам интересно, что происходит (как я), добавьте также, status=progressчто будет печатать весь ход операции.
Александр Лех
17

Несколько лет назад в Unix-стране ddбыл обязательный способ копирования блочных устройств. Это стало носителем культового знания, хотя (по крайней мере, в системах на основе Linux) catпочти всегда быстрее, чем dd.

Однако даже в прошлом приличный размер блока помог уменьшить количество (медленных) системных вызовов, учитывая, что каждый системный вызов запускал операцию ввода-вывода. Размер блока по умолчанию составляет 512 байт (один сектор диска). Сбор нескольких блоков диска в одно чтение был - и тоже - приемлемым. В этом примере используется размер блока 32 МБ:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

В современных системах на основе Linux диски могут наиболее эффективно копироваться с помощью простого cat

cat /dev/source >/dev/target

(Как отмечено в комментариях к вашему вопросу, он pvможет быть заменен catи даст вам представление о прогрессе и пропускной способности.)

roaima
источник
3
В частности, причиной, по которой пришлось использовать dd, была ошибка в GNU cp и ошибка в ядре linux в начале 90-х годов. Причины использования dd в исторических системах unix были очень разными, и желание скопировать целое блочное устройство было необычным занятием.
Random832
1
@ Random832 желание скопировать весь диск было бы необычным, но я помню, что мне нужно было копировать разделы (большие - 150 или даже 200
МБ
3
(Особенности ошибок: ядро ​​неверно сообщило размеры использования диска [ведущий cp пришел к выводу, что каждый исходный файл был разреженным файлом), а cp не обнулял блоки при копировании из разреженного файла в место назначения устройства. Таким образом, любой ноль блок в вашем источнике будет иметь тот мусор, который уже находится на диске)
Random832
Мне нравится такой ответ. Спасибо за информацию. Вот твоя прическа.
catbadger
7

Как правило, ddможно избежать в пользу некоторых альтернатив. Есть несколько веских причин использовать GNU ddrescueвместо этого. В Ubuntu вы можете установить его с помощью:

sudo apt-get install gddrescue

и просто ddrescueиспользовать. Обратите внимание, что в отличие от имени пакета, исполняемый файл не имеет начального значения g.

Использовать его так же просто, как:

ddrescue inputFile outputFile logFile

Файл журнала (названный по вашему выбору) позволяет вам приостанавливать / останавливать и перезапускать без повторения предыдущей работы, что полезно при выполнении больших клонов или восстановлении дисков. По умолчанию отображается ход выполнения, текущая скорость копирования, средняя скорость копирования и количество найденных поврежденных блоков.

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

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

technicalbloke
источник
6

Очень хороший вопрос. Необработанный интерфейс реализован в некоторых системах Unix (tru64, hpux, solaris), но не в Linux. Необработанный интерфейс ускоряет передачу, поскольку ввод / вывод unix пропускается. Интерфейс блока ( /dev/dskили /dev/disk) медленнее, потому что он использует систему ввода-вывода Unix. Для ускорения dd(gnu dd can) используйте bs=30Mили в bs=20Mзависимости от вашего hw. Короткий ответ: НЕТ, это не реализовано, по крайней мере, насколько я знаю. Я использую Linux с давних времен версии ядра 2.2 и никогда не видел, rdskиспользуется на Unix.

elbarna
источник
5
Почему вы предлагаете размер блока, который не является степенью двойки?
Василий Старынкевич
2
@Basile достаточно кратного размеру дискового блока, так что 20MiB вполне подойдет.
Ройма