Чому ДД займає занадто багато часу?


18

Мені потрібно скопіювати один диск на інший. Я спробував за допомогою команди нижче, щоб скопіювати 1 TB диска у 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


Використовували першу в HP-UX (лопаті цілісності) і раніше використану машину Solaris.
KKD

Відповіді:


28

ddЄ багато (дивних) варіантів, див. dd (1) .

Ви повинні чітко вказати розмір буфера, тому спробуйте

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

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

З розміром буфера 512 байтів за замовчуванням, я думаю (але я можу помилятися), що апаратне забезпечення вимагає ядра для передачі 4K для кожного блоку 512 байтів.

Що стосується rdsk, в С.О. (4) сторінки людини говорять:

На даний час надаються лише блокові пристрої. Сирі пристрої ще не реалізовані.

Збільшення розміру буфера ДД дасть вам більшу ефективність для операцій читання та запису. Тепер усі диски мають апаратний буфер для читання / запису. Але якщо ви збільшите розмір буфера dd більше, ніж апаратний буфер, його продуктивність знизиться, оскільки dd буде читати з першого диска на буфер, коли другий диск буде записати все з власного апаратного буфера. Вам потрібно встановити bsопцію команди dd щоразу, коли різні значення для різних пристроїв.


Чи доступний rdsk в системах Linux? Я використовував в системах Unix.
KKD

1
Кеш сторінок, ймовірно, буде працювати в блоках 4Kb все, що ви робите, але ви можете контролювати, скільки syscalls dd використовує для читання 4Kb. Я впевнений, що є якийсь розмір читання, вище якого вартість зупинки запису дорожча, ніж збережені систематичні дзвінки, але поняття не маю, де солодке місце.
Марно

Розмір блоку на кілька Мб кращий, ніж 512В за замовчуванням, але коли я порівняв це, я виявив, що catце так само добре (для передачі файлової системи в файлову систему прямий блок-блок може мати різні характеристики продуктивності). Однак різниця не була драматичною у будь-якому випадку.
Жил 'ТАК - перестань бути злим'

1
Цікаво, що в macOS (сертифікований SUS, btw) його швидше використовувати/dev/rdiskX як ціль при виконанні dd.
адиб

1
у випадку, якщо вам цікаво, що відбувається (як я), додайте також, status=progressщо буде надрукувати весь хід операції.
Олександр Лех

17

Роки в Unix-land 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і даватиме вказівку на прогрес та пропускну здатність.)


3
Зокрема, причиною використання ДД стали помилка в GNU cp та помилка в ядрі Linux на початку 90-х. Причини використання DD в історичних системах Unix були дуже різними, і бажати скопіювати цілий блок пристрою було незвичною справою.
Випадково832

1
@ Random832 бажати скопіювати весь диск було б незвично, але я пам’ятаю, що мені потрібно було копіювати розділи навколо (великі - 150 чи навіть 200 МБ)
roaima

3
(Специфікація помилок: ядро ​​повідомляло про розміри використання диска неправильно [що веде cp до висновку, що кожен вихідний файл був розрідженим файлом], а cp не знімав нульових блоків при копіюванні з розрідженого файлу на місце призначення. Отже, будь-який нуль у вашому джерелі є те, що сміття трапилося б уже на диску)
Random832

Мені подобається така відповідь. Дякую за інформацію. Ось ваша оновлення.
catbadger

7

Як правило, цього ddможна уникнути на користь деяких альтернатив. Є кілька вагомих причин використовувати GNU ddrescueзамість цього. В Ubuntu ви можете встановити його за допомогою:

sudo apt-get install gddrescue

і просто простий ddrescueу використанні. Зауважте, що відрізняється від назви пакета, виконуваний файл не має початкового g.

Використовувати його так само просто, як:

ddrescue inputFile outputFile logFile

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

Він використовує розумні за замовчуванням розміри блоку, тому швидкість копіювання завжди така швидка, як і пристрій може працювати, принаймні, на моєму досвіді (я клонував багато сотень накопичувачів, будь-яких розмірів і типів).

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


6

Дуже приємне запитання. Сирий інтерфейс реалізований у деяких системах unix (tru64, hpux, solaris), але не на Linux. Неочищений інтерфейс робить передачу швидшою, тому що unix I / O пропускається. Блок-інтерфейс ( /dev/dskабо /dev/disk) повільніше, оскільки він використовує систему введення / виводу unix. Для прискорення dd(gnu dd може) використовувати bs=30Mабо bs=20Mзалежно від вашої hw. Коротка відповідь: ні, це не реалізовано, принаймні, наскільки я знаю. Я використовую linux ще з старих часів версії ядра 2.2 і ніколи не бачив, щоб він rdskвикористовувався на Unix.


6
Чому ви пропонуєте розмір блоку, який не має сили два?
Базиль Старинкевич

2
@Basile достатньо кратного розміру блоку диска, тому 20MiB було б добре.
roaima
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.