Використання DD для клонування дисків


182

Існує ряд питань щодо інструментів клонування дисків, і ddхоча б раз було запропоновано. Я вже розглядав можливість використання dd, головним чином, тому, що це простота використання, і що це легко доступно майже на всіх завантажувальних дистрибутивах Linux.

Який найкращий спосіб використовувати ddдля клонування диска? Я здійснив швидкий пошук у Google, і першим результатом стала явна невдала спроба . Чи є щось, що мені потрібно зробити після використання dd, тобто є щось, що не можна читати, використовуючи dd?


Я знаю, як працює DD, моє запитання було більше в напрямку будь-яких відомих проблем, пов’язаних з DD при клонуванні дисків (як описано за посиланням), можливо, це було не дуже зрозуміло. Що його відповідь містить, а ваша - ні, «я ніколи не мав жодних проблем із цим». Я також схвалив вашу відповідь, оскільки ви неодмінно подали цікаві моменти (мені подобається той, про якого немає вказівки про прогрес).
falstro

1
Схоже, у вас з'явився чувак Spolsky
Кайл Кронін

я не бачив цього тут, коли я задав (і відповів) подібне запитання про superuser - superuser.com/questions/11453/…
warren

3
Іронічно, що Джоел пов'язував це питання як хороший приклад помилки сервера, хоча жоден із відповідей не був хорошим. Серед 25 (за винятком коментарів) не було жодної відповіді з правильними ddваріантами пропуску поганих блоків - що важливо при клонуванні дисків для відновлення. Я додав кращу відповідь, яка може клонувати диски із поганими блоками:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Сем Уоткінс

Я думаю, що відновлення DD може "провалитися", якщо говорити про файлові системи, залежні від геометрії диска, і відновлення проводиться на неідентичних жорстких дисках? У мене відновились певні збої відновлення dd, і я думаю, що це була проблема в моєму випадку.
Марко

Відповіді:


160

dd, безумовно, найкращий інструмент для клонування, він створить 100% репліку просто за допомогою наступної команди. Я ніколи не мав жодних проблем з цим.

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

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


12
Звичайно, доки / dev / sdb принаймні настільки ж великий, як / dev / sda ...
Едді

22
додайте "bs = 100M conv = notrunc", і це набагато швидше, на мій досвід.
Тім Вілліскрофт

127
просто будьте дуже обережні з літерами «я» та «о» ...
банді

17
Здається, ніхто не знає цієї хитрості ... dd - це асиметрична програма копіювання, тобто спочатку вона буде читати, потім писати, а потім назад. Ви можете труби дд до себе і змусити його виконати копію симетрично, як це: dd if=/dev/sda | dd of=/dev/sdb. У моїх тестах виконання команди без труби дало мені пропускну здатність ~ 112 кб / с. З трубою я отримав ~ 235 кб / с. Я ніколи не відчував жодних проблем із цим методом. Удачі!
Містірі

13
@Mistiry, це не значення слова симетричне.
psusi

113

Щоб заощадити місце, ви можете стиснути дані, створені dd, за допомогою gzip, наприклад:

dd if=/dev/hdb | gzip -c  > /image.img

Ви можете відновити диск за допомогою:

gunzip -c /image.img.gz | dd of=/dev/hdb

Щоб заощадити ще більше місця, дефрагментуйте диск / розділ, який ви хочете заздалегідь клонувати (якщо це доречно), а потім викресліть весь залишковий невикористаний простір, що полегшує стиснення gzip:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

Почекайте трохи, що в кінцевому підсумку DD не вдасться отримати повідомлення "диск повний", тоді:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

Також ви можете отримати процес dd, який працює у фоновому режимі, щоб повідомити про стан, надіславши йому сигнал за допомогою команди kill, наприклад:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

Перевірте свою систему - наведена вище команда для команд Linux, OSX та BSD dd відрізняється за прийнятими ними сигналами (використовує OSX SIGINFO- ви можете натиснути Ctrl+, Tщоб повідомити про стан).


2
Чи це також працює з "сучасними" такими BTRFS, NILFS, [що ви можете мріяти]?
Стів Шнепп,

DD працює на блокових пристроях, рівень абстракції нижчий, ніж файлова система, так що слід, так. Я насправді цього не пробував. Гм, NILFS виглядає цікаво, мені доведеться поглянути на це.
Девід Хікс

4
+1 для команди kill -SIGUSR1 %1, а команда OSX dd з радістю приймає SIGUSR1 ... супер корисно, дякую!
stuartc

1
+1 для цього Kill -SIGUSR1 1234я шукав.
hot2use

2
Повинна чи вона бути: dd if=/dev/hdb | gzip -c > /image.img.gz?
Майк Каузер

37

ПОПЕРЕДЖЕННЯ : введення живої файлової системи може пошкодити файли. Причина проста, вона не має розуміння діяльності файлової системи, яка може тривати, і не робить спроб пом'якшити її. Якщо запис частково триває, ви отримаєте часткове записування. Зазвичай це не добре для речей, і взагалі фатально для баз даних. Крім того, якщо ви загвинчувати опечатку схильної якщо і з параметрів, горе вам. У більшості випадків rsync є не менш ефективним інструментом, написаним після появи багатозадачності , і надаватиме послідовний перегляд окремих файлів.

Однак DD повинен точно фіксувати стан бітів відключеного диска. Завантажувачі, обсяги llvm, UUID розділів та мітки тощо. Просто переконайтеся, що у вас є диск, здатний відображати біт цільового накопичувача.


7
Я підозрюю, що syncце не відповідь на подання корупційних проблем. Що станеться, якщо deamon або щось запише більше файлів після sync, під час ddоперації?
Видалено

5
Добре заздалегідь підготувати накопичувач (або перечитати як лише для читання), але це не завжди можливо
Олексій Болотов

1
У такому випадку ви використовуєте rsync і дозволяєте файлу обробляти магію, щоб отримати послідовний файл і дозволити семантиці Copy On Write обробляти вхідні записи.
jldugger

4
Я хотів би додати, що запуск DD у змонтованій файловій системі НЕ ВИКОРИСТОВУЄ файли в змонтованій файловій системі, але тут мається на увазі те, що копія файлової системи обов'язково буде у відомому хорошому стані.
3моло

1
Використання rsyncзабезпечить відповідність внутрішніх даних у цільовій файловій системі. Це не забезпечить послідовність даних у файлах - для цього вам потрібно буде заблокувати файли, і будь-які програми, що записують у файли, повинні дотримуватися цих блоків.
Мартін Гейслер

26

Використовуючи dd для клонування диска, який може містити погані сектори, використовуйте "conv = noerror, sync", щоб переконатися, що він не зупиняється, коли трапляється помилка, і заповнюйте відсутні місця (сектори) нульовими байтами. Зазвичай це перший крок, який я роблю, якщо намагаюся відновити з невдалого або несправного диска - отримайте копію, перш ніж робити спроби відновлення, а потім виконайте відновлення на хорошому (клонованому) диску. Я залишаю це інструменту відновлення, щоб впоратися з будь-якими порожніми секторами, які не вдалося скопіювати.

Крім того, на швидкість ДД може вплинути налаштування b (розмір блоку). Я зазвичай пробую bs = 32768, але ви, можливо, хочете протестувати його на власних системах, щоб побачити, що працює для вас найшвидше. (Це передбачає, що не потрібно використовувати певний розмір блоку з іншої причини, наприклад, якщо ви пишете на касету.)


13
Якщо у вас диск з поганими секторами, ви дійсно повинні використовувати 'ddrescue' замість dd. Це набагато ефективніше та має набагато більше шансів відновити більше даних. (Не плутайте його з dd_rescue, що не так добре)
davr

3
не слід використовувати великий розмір блоку при спробі пропустити погані блоки, або він буде занадто сильно пропускати. 4096 досить великий.
Сем Уоткінс

17

Щоб клонувати диск, все, що вам потрібно зробити, це вказати вхід і вихід до dd:

dd if=/dev/hdb of=/image.img

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

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

Ви також можете зробити пряму копію з диска на диск:

dd if=/dev/hdb of=/dev/hdc

але ви все ще дієте зазначених вище обмежень щодо вільного місця.

Що стосується питань або проблем, здебільшого, відмінно справляється. Однак деякий час тому у мене був жорсткий диск, який збирався померти, тому я використав дд, щоб спробувати скопіювати ту інформацію, яку я міг би вимкнути, перш ніж вона повністю загинула. Тоді стало відомо, що dd не дуже добре поводиться з помилками читання - на диску було кілька секторів, які DD не міг прочитати, що призвело до того, що dd відмовилася від зупинки копії. У той час я не міг знайти спосіб сказати dd, щоб продовжувати, незважаючи на помилку читання (хоча, здається, у нього є таке налаштування), тому я витратив досить багато часу вручну, вказуючи пропустити і намагаюся перейти через нечитабельні розділи.

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


7
... dd не дає абсолютно ніяких ознак прогресу ... - ну це не відповідає дійсності - є своєрідний хитрий спосіб, як показати прогрес - ви повинні дізнатися pid про процес dd ('ps -a | grep dd'), а потім відправити сигнал USR1 в цей процес - 'kill -USR1 <dd_pid_here>' (без <>), який змушує dd показувати інформацію про хід.
Michal Bernhard

4
"кілька секторів на диску, які DD не зміг прочитати": я думаю, conv=sync,noerrorце допомогло б.
Готьє

2
Ці conv=sync,noerrorпараметри необхідні, вони дозволяють д.д. пропускати погані блоки і обнулити їх в зображення таким чином речі вирівняні правильно. Підтримує дуже мало людей, які щось про це коментували.
Сем Уоткінс

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

2
Менш складний спосіб досягти успіху з dd - це додати варіантstatus=progress
Джеймс

11

Якщо привід джерела пошкоджений на всіх, ви будете мати більше удачі , використовуючи dd_rhelpз dd_rescue(моїм особистим перевагою) або GNU ddrescue.

Причиною цього є те, що після помилок читання ddнамагається намагатися і намагатися - потенційно довго чекаючи настання тайм-аутів. dd_rescueробить розумні речі, такі як читання до помилки, потім вибирає місце далі на диску і читає назад до останньої помилки, і dd_rhelpв основному це dd_rescueменеджер сеансів - вміло запускаючи та поновлюючи dd_rescueзапуски, щоб зробити це знову швидше.

Кінцевим результатом dd_rhelpє максимальне відновлення даних за мінімальний час. Якщо ви залишите dd_rhelpбігти, врешті-решт це зробить точно таку ж роботу, як і ddв той же час. Однак, якщо ddу байт 100 вашого 100Gb диска виникли помилки читання, вам доведеться довго чекати, щоб відновити інші 9 999 900 байт *, тоді як dd_rhelp+ dd_rescueвідновить більшу частину даних набагато швидше.


1
Деякі допомагають вибрати між dd_rescue та ddrescue: askubuntu.com/a/211579/50450
Йоганн

7

На вихідному диску не повинно бути встановлених файлових систем. Як користувач, здатний читати блок пристрою (root працює), запустіть 'dd if = / dev / sda ....'

Тепер, одна з акуратних речей тут, це те, що ви створюєте потік байтів ... і ви можете зробити багато з цим: стиснути його, відправити по мережі, збити на дрібніші краплі тощо.

Наприклад:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

Але більш потужно:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

Вищезазначене копіює стиснене зображення жорсткого диска джерела у віддалену систему, де він зберігає його в пронумерованих фрагментах 2G, використовуючи ім'я хоста джерела, зберігаючи вас в курсі прогресу.

Зауважте, що залежно від розміру диска, швидкості процесорного коду на джерелі, швидкості процесорного коду в пункті призначення, швидкості мережі тощо. Ви можете пропустити компресію або зробити компресію на віддаленій стороні або включити компресію ssh.


+1 Прокладка через gzip може заощадити багато часу та пропускної здатності!
М. Дадлі

Слід також зазначити, що додавання 'bs = 1M' до команди dd зазвичай значно підвищить швидкість.
втягнення

6

Щоб клонувати диск, все, що вам потрібно зробити, це вказати вхід і вихід dd:

dd if=/dev/hdb of=hdb.img

Звичайно, переконайтеся, що у вас є відповідні дозволи на читання безпосередньо з /dev/hdb(я б рекомендував запустити як root), і /dev/hdbце не встановлено (ви не хочете копіювати під час зміни диска). Після завершення hdb.imgбуде байт-байт-клон всього диску.

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

Ви також можете зробити пряму копію з диска на диск:

dd if=/dev/hdb of=/dev/hdc

але ви все ще дієте зазначених вище обмежень щодо вільного місця.

Перший недолік можна усунути, зібравши дані під час створення копії. Наприклад:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

Другий недолік можна вирішити за допомогою інструменту pipeview ( pv). Наприклад:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

Я не знаю жодного способу подолати третій недолік.

Крім того, ви можете пришвидшити час копіювання, ddзапропонувавши працювати з більшими фрагментами даних. Наприклад:

dd if=/dev/hdb of=hdb.img bs=1024

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

gzipping не працюватиме з диском, який уже використовується деякий час, оскільки він буде заповнений або поточними, або видаленими даними. gzip працюватиме лише в тому випадку, якщо порожній простір буде нульовим, що стосується лише нового диска.
Tozz

3
@Tozz: Ви можете поліпшити стисливість зображення файлової системи, заповнивши файлову систему файлом, заповненим 0, синхронізуючи її на диску, а потім видаливши її. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Модуль додаткового інтелекту в шарі файлової системи.)
повтор

5

Ще одна приємна річ, яку ви можете зробити з dd і рятувальними дисками - це копіювання даних по мережі:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

Ви можете вставити gzip в обох цих конвеєрах, якщо мережа не локальна. Для прогресу використовуйте pv. Щоб змусити вивести мережу net_at local_machine після її копіювання, ви можете додати -w 5щось.


9
Це не зовсім правильно. Команда «remote_machine» відсутній що - то, наприклад, > disk_backup.imgабо , |dd of=/dev/sdbабо що - то інше, в залежності від того, що ви хочете зробити. Я здогадуюсь, що ви не хочете скидати зображення диска на stdout.
davr

1
І киньте gzip з обох кінців, щоб додатково мінімізувати надіслані дані.
3моло

4

Майте на увазі, що ДД робить точну копію , включаючи весь порожній простір.

Це означає:

  1. 2-й привід повинен бути як мінімум таким же великим, як перший
  2. Якщо другого накопичувача більше, витрачається додаткове місце (файлова система може бути розширена)
  3. Якщо джерело накопичувача не повне, DD витратить багато часу на копіювання порожнього простору.
  4. Таким чином ви можете скопіювати або весь диск, або один розділ.
  5. Якщо це завантажувальний диск, я впевнений, що вам потрібно встановити завантажувач після використання dd

Сподіваюся, що це корисно


8
Якщо ви клонуєте весь жорсткий диск, ви також клонуєте завантажувач.
Крістіан Цюпіту

welll, просто thhgt, але ти не міг просто використати gparted, щоб перенести копіюваний розділ / диск на все, що використовується - тоді скиньте dd? Якщо припустити, що це одноразовий образ, він повинен пом'якшити це питання.
bbqchickenrobot


3

Ще одна особлива особливість - копіювання MBR, таблиць розділів та завантажувальних записів.

Просто

dd if=/dev/sda of=parttable bs=512 count=1

і інший напрямок навколо, коли ви пишете це. Польська з fdiskпісля.

Ви відчуваєте себе набагато безпечніше, коли у вас є резервна копія таблиці розділів.

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


3

Це свого роду дешевий злом, але це швидкий і брудний спосіб контролювати ваш процес DD.

Запустіть команду dd. Відкрийте нову оболонку та зробіть ps awx, щоб знайти ПІД свого процесу DD. Тепер у новому типі оболонки дивіться -n 10 kill -USR1 {pid вашого DD-процесу}

Це не зробить нічого у вікні виводу годинника, але повернувшись в оригінальну оболонку DD, DD почне виводити звіти про стан кожні 10 секунд. Ви можете змінити -n 10 в команді watch на будь-який інший часовий інтервал, звичайно.

Тахіон


OS X не watchдоступний і -USR1вбиває дд. Наступна команда працює: while [ true ]; do killall -INFO dd; sleep 30; done
Адам Франко

Я не думаю, що для початківців це не дуже практично, вони, можливо, краще служать pvкоманді.
Роббі Маккні

Я виявив, що ви також можете надсилати SIGINFO, використовуючи CTRL-T в dd. Це простіше, ніж цикл while і OSX 10.6 cd у мене не має killall. Дізнався про це з en.wikipedia.org/wiki/Unix_signal#Sending_signals
Citizen Kepler

3
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Це скопіює диск і пропустить блоки з помилками, що дуже важливо.

Це основні та найважливіші параметри використання dd для клонування або збереження диска.

Я не хотів публікувати іншу відповідь, але серед 25 вже опублікованих варіантів не було хороших відповідей із суттєвими параметрами "conv = sync, noerror".


1
Насправді про це йшлося раніше, в одній відповіді та принаймні двох коментарях.
Майкл Хемптон

1
@Michael відповідь, яку ви пов’язали, не містить команди з повним прикладом, і має інші помилки - це не гарна ідея використовувати великий розмір блоку, conv=sync,noerrorоскільки він буде пропускати занадто багато даних для кожного поганого блоку. Ці параметри мають важливе значення для "клонування відновлення", і непотрібно шукати коментарі до них. Найпопулярніша відповідь є адекватною, якщо на дисках немає поганих блоків, наприклад, для клонування незайманого диска, але не для відновлення.
Сем Уоткінс

@Michael Приклад, який я дав, - це команда, яку я кілька разів використовував для професійного відновлення диска. Хоча є й інші інструменти, які можуть зробити трохи кращу роботу, приклад, який я наводив, є кращим для клонування відновлення дисків, ніж будь-який інший ddприклад тут, а також підходить для клонування диска без помилок. Тому я вважаю свою відповідь найкращою тут щодо того, як "використовувати DD для клонування дисків". Я не додав інформацію про моніторинг прогресу, стиснення тощо, тому що хотів зробити це просто і зосередитись на наданні короткої відповіді, яка відповідає правилам.
Сем Уоткінс

3

Ви насправді можете спробувати щось подібне

dd, якщо = / dev / sda2 of = / dev / sdb2 bs = 4096 conv = sync, noerror

щоб пропустити всі помилки і мати точний клон розділу чи жорсткого диска


Це повинно бути conv = sync, noerror Опція синхронізації потрібна, інакше блоки з помилками будуть видалені, а не скопійовані як нулі.
Сем Уоткінс

2

dd надає інформацію про прогрес - ну і більшість версій в Linux. Я бачив деякі, які не згадують аромат Unix.

На головній сторінці написано: Якщо надіслати сигнал USR1 до запущеного процесу 'dd', воно дозволяє надрукувати статистику вводу-виводу на стандартну помилку, а потім відновити копіювання.

Я регулярно використовую цю функцію.


Хоча корисно, я сумніваюся у його практичності для початківця.
Роббі Маккні

2

Хтось повинен був сказати це: спробуйте Clonezilla (http: // clonezilla.org/)

Що ви отримуєте? Для копіювання лише використаних частин файлової системи. Clonezilla використовує dd, grub, sfdisk, parted, partimage, ntfsclone та / або partclone. Залежно від обраних варіантів.

Достойну документацію можна знайти за посиланням: http: // clonezilla.org/clonezilla-live/doc/


Я знайшов документацію трохи грубою, і клонування приводу Linux PATA на накопичувач SATA не залишило мене з тим, що я міг завантажувати (поки що). Але набагато швидше до того ж результату, що і DD, і це чудово спрацювало на оновлення мого ноутбука.
jbdavid

2

Як скопіювати за допомогою dd (у даному випадку на віддалену машину, але той самий принцип застосовується і до локальної копії), який демонструє прогрес.

Він працює, зберігаючи pid через дескриптор файлу 3 в / tmp / pid, який потім використовується для наступних вбитих сигналом USR1. Зморшкою потрібно було фільтрувати вихід прогресу на stderr лише до одного рядка за допомогою фільтрування stderr через нижню частину.

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done

Не дуже важливо для цього питання, але його акуратний трюк з оболонкою, використовуючи
підрозрядник

Я сам посилався на цю сторінку для різних варіантів DD під час клонування дисків, тому здавався підходящим місцем для того, щоб поставити кінцевий результат того, що я використовував для клонування, тим більше, що я вважав, що це досить акуратно :)
Едвард Гроендаал

2

Найбільше інформації було описано в попередніх вставлених відповідях, але описано не все.

Під Linux можна клонувати жорсткий диск або розділ за допомогою команди dd. Увага, коли ви помилитесь, ви втратите всі свої дані.

По-перше, призначення не повинно використовуватися, по-друге, джерело не повинно використовуватися або перетворюватися в режим лише для читання. Інакше копія буде пошкоджена. Якщо повторна переробка неможлива, будь ласка, зробіть завантажувальний диск (hdd / ssd / pendrive) будь-який дистрибутив Linux в реальному часі. Я підтверджу knoppix, але це ваш вибір. Якщо це можливо, ви можете завантажити або змінити системний рівень на 1, для режиму одиночного користувача, або ви можете безпосередньо перезавантажити систему в режимі одного користувача, це залежить від дистрибуції. Якщо ви будете клонувати лише один розділ, цей розділ слід відключити або перезавантажити в RO:

umount /mountpoint_or_device

або

remount -o,ro /mountpoint_or_device

Якщо ви хочете клонувати весь жорсткий диск, ви повинні перерахувати або перезавантажити всі розділи.

Ви повинні визначити джерело та пристрій призначення. будь ласка, подивіться на dmesg, тут зберігається вся необхідна інформація про пристрій, з постачальником та інше, інакше ідентифікація може залежати від розміру пристрою, якщо він інший. Далі пункт призначення повинен бути таким же або більшим, ніж джерело. Ви повинні обчислити джерело, наприклад: fdisk -l / dev / sda, за винятком геометрії розділів (може бути GPT), ви отримаєте: 1. загальний розмір диска GB та байтів 2. історична геометрія та загальний номер сектору, дуже важлива інформація 3. розмір блоку в байтах, зазвичай це 512.

наприклад:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

наступний спробуй більший за 512 дільник, ми маємо 41943040 фізичні сектори:

41943040/256 = 163840, дуже добре, ми можемо зробити копію 256 секторів. ми можемо більше? спробуємо: 41943040/1024 = 40960, я думаю, що цього достатньо, ми виберемо цей. Порахуймо розмір групи секторів: 512 (розмір сектору) * 1024 = 524288 байт eq 512K. Тоді ми можемо використовувати параметр bs = 512K або менше, але розділимо це на 2 ^ x. Для сучасних жорстких дисків з великим внутрішнім кешем це досить практично. для старих накопичувачів зі значно меншим кешем достатньо значення 32K або менше.

Тоді після підготовки ми можемо зробити копію: dd, якщо = / dev / source_devide of = / dev / target_device bs = 32K, і копія буде зроблена. Зверніть увагу, будь-яка помилка замінить ваші важливіі дані. У пункті призначення всі будуть перезаписані.

Якщо ви спробуєте зберегти дані на пошкодженому вихідному диску, краще скористайтеся нативним розміром сектора, зазвичай це 512 байт, і додайте параметр conv = notrunc. інакше дірки в джерелі, скинуті поганими секторами, приєднаються до переміщення сектору за призначенням. Це призведе до пошкодження копії з невеликим шансом на ремонт. тоді команда буде:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

, і довго чекати, коли привід і система відмовлять і будуть ходити по секторах до кінця.

dd - корисний інструмент для переміщення розділу на нове місце. Просто створіть розділ, зробіть dd до нового розділу (це може бути більше, набагато більше), і, якщо можливо, розгорніть скопійовану файлову систему для заповнення всіх нових розділів, ext3 / ext4 / xfs / zfs / btrfs мають цю функцію. Нарешті, ви повинні змінити / etc / fstab, а потім umount / mount, якщо можливо, або перезавантажити систему.

Звичайно, ви можете клонувати будь-який тип розділу. Команда dd не розглядає тип файлової системи, вона нічого не робить зі своєю структурою. тоді ця команда може бути використана для клонування NTFS або інших типів розділів.

Є якась хитрість. Якщо ви не встановили параметр, то DD поставить вихід у свою версію. тоді ви можете зробити стиснуту необроблену копію диска або розділу, наприклад:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

Звичайно, це слід робити в автономному режимі. Ви можете відновити це:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

, тоді всі жорсткі диски sda будуть замінені цією резервною копією, і всі поточні дані будуть втрачені. Ви можете зробити це також за допомогою розділу NTFS Windows і жорсткого диска, який використовується для цього. Звичайно, ви можете використовувати іншу команду стиснення, залежно від вашого вибору.


1

Ви можете створити стислий файл зображення розділу (або диска) на льоту за допомогою bzip2або gzipзамість dd. Це добре для зберігання подалених зображень у знімних носіях:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

Якщо диск раніше активно використовувався, ви можете посилити стиснення, заповнивши весь невикористаний простір нулями перед зображенням:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

Щоб відновити зображення на інший диск, все, що вам потрібно зробити, це:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY

Запропонований трюк для заповнення залишкового місця нулями. Розумний!
Плутанина

Це, мені це було потрібно! SD-карта раніше використовувалася для зйомки відео і була повна лайно, стиснення зовсім не допомогло.
Коді Сміт

0

З певних причин DD не виходить із зображення компакт-дисків із звуковими записами. Щоб отримати зображення + файл TOC, потрібно використовувати cdrdao або щось подібне.


0

Примітка про швидкість: за моїм досвідом, дд вдвічі швидше, якщо ви вказали bs = 1024 замість bs = 512 за замовчуванням. Використання ще більшого розміру блоку не дає помітного прискорення швидкості на bs = 1024.


4
дискові кластери зазвичай зараз близько 4 к, тому використання 4096 - це, мабуть, хороший варіант, і навіть 8192, якщо ви хочете читати 2 кластери одночасно. Хоча не надто великий, оскільки у вас виникають роздроблені проблеми з пам'яттю
user4767

0

Одне, що ви повинні пам’ятати, коли вводити повний диск, це те, що це замінить основний запис завантажувального диска. Це містить таблицю розділів та іншу життєво важливу інформацію. Якщо новий диск не такий, як старий диск, це може створити всілякі таблиці. Копіювання через розділи, як правило, безпечніше (а підкачування розділів не потрібно копіювати)


0

Я вже багато років був поза ролі адміністратора, але знаю, що "дд" вирішено. Я регулярно використовував цю техніку в кінці 80-х на комп’ютерах Sun Sparc і 386i. У мене було одне замовлення клієнта на 30 систем 386i, що працюють з програмним забезпеченням CAD, яке розповсюджувалось на декілька стрічок QIC.

Ми встановили на першому комп’ютері, налаштували додаток, запустили sys-unconfig SunOS, помістили диск в коробку для взуття з іншою адресою SCSI, а потім перейшли до «dd» до інших 30 дисків.


0

Як вже згадували інші, одним із проблем із клонуванням змонтованої файлової системи є потенційна корупція даних. Це, очевидно, не стосується повних клонів накопичувачів, але якщо ви використовуєте LVM, ви можете зробити знімок LogicalVolume і dd зі знімка, щоб отримати стійке зображення.



0

Просто попередження для початківців, що потрібно сказати: Принаймні, з деякими версіями, bs = X означає, що пам'ять розміром X буде буквально виділена. bs = 2 ГБ в системі з 1 ГБ оперативної пам’яті та недостатньою кількістю свопів, БУДЕ статися поганих речей.

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