чи може "дд" використовуватись для клонування на менший жорсткий диск, знаючи, що розділи потребуватимуть редагування?


14

Я раніше ddклонував диски таким чином:

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

І це завжди добре працювало. Будь-які документи на "dd" набувають нагадування, що цільовий диск повинен бути того ж розміру або більше, ніж джерело. Це абсолютно має бути правдою?

Тепер я цілком розумію, що якщо я клоную на менший диск, я не можу очікувати, що будь-які розділи, які навіть частково «виходять за межі» цілі, будуть цілими.

Однак, знаючи повністю, що мені потрібно буде відредагувати свої розділи на цілі пізніше, видаливши «поза межами», чи можу я все-таки використовувати «dd», щоб зробити грубу копію джерела до меж фізичний розмір цілі? Або "дд" зменшить ціль до куріння уламків, коли вона досягне межі свого розміру ;-)

Доречі, досліджуючи це, я бачив рекомендовані значення для bs=всього, від bs=1024до bs=32M, що насправді найкраще?


Зауважте, якщо використовувати dd розрахунок оптимального розміру блоку корисно
Вільф

Відповіді:


7

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

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

Для bsзначення, як правило, найкраща ідея - пройти пару тестів, перш ніж запустити реальну копію. Є деякі інструменти, які допомагають вам автоматизувати цю перевірку, але я не пам’ятаю імені. На мій досвід, найкращий діапазон, як правило, між 4М і 16М. Вищий від цього ви вже не багато заробляєте. Але це залежить від багатьох речей, в тому числі і від самих дисків. Наприклад, я рідко працював з реальними дисками високого класу, які можуть бути придатні для більш високих значень через велику швидкість і розмір кешу.

EDIT Якщо розділ повністю скопійований, ви можете ним користуватися без проблем. Однак, як підкреслили інші, ви також повинні бути впевнені, що таблиця розділів є недоторканою (принаймні, відповідними записами). З чотирма первинними розділами MBR немає проблем, оскільки вони описані в перших 512 байтах диска. Логічні розділи описані у всьому розширеному розділі, тому записи можуть бути втрачені (але вони описували б розділи, які все-таки були б втрачені). З GPT є копія таблиці розділів як на початку, так і в кінці диска. Ви втрачаєте другий, але можете відновити його з першого. Звичайно, доцільно це зробити якомога швидше; інші відповіді були більш точними щодо цього.


Перегляньте відредаговане питання :)
Рей Ендрюс

1
@rayandrews Не впевнений, якого оновлення ви очікуєте, але в основному ddкопіює байти. Він розпочнеться з байту 0 і продовжує копіювати, поки щось (у вашому випадку, кінець медіа у пункті призначення) не зупинить його. Це дозволить вам залишити таблицю розділів, яка визначає накопичувач, більший за реальність, і розділи за межами диска ... але якщо ви виправите це, це має бути добре. Хоча, мабуть, було б простіше використовувати dd-розділ для копіювання даних. [Це також залишить вас з усіма нормальними проблемами DD, як-от дублікати UUID]
derobert

Що мені подобається, це те, що він створює і мітить розділи та файлові системи в міру розвитку - дуже економить час. Прямо про UUIDs thho.
Рей Ендрюс

1
як відновити другу таблицю gpt?
user230910

2

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

Ідея полягає в тому, щоб продумати кожен розділ окремо, а не весь диск одразу, як було запропоновано. Ще більше можна досягти: Розрізаний (-ий) розділ (-и) також можна безпечно перенести за допомогою інструментів повторного розміру файлової системи. Дійсно, такий тип міграції є цікавим, щоб зберегти матадані файлової системи та розширені атрибути файлів, які неможливо легко скопіювати з такими інструментами, як cp, rsync, pax, ..., які працюють на рівні файлової системи та не блокують рівень пристрою. Використання dd ліквідує необхідність перевстановлення ОС або необхідність відновлення повторної установки FS, щоб уникнути проблем із SELinux.

Нижче наведено те, що я зазвичай роблю для виконання подібних завдань:

1) Спершу ви маєте зменшити файлові системи (файли) в уражених розділах, які були б усічені. Для цього використовуйте інструмент resize2fs (якщо припустити, що ми говоримо про ext2 / ext3 / ext4 fs - інші сучасні FS також мають інструменти зміни розміру з тією ж метою). Зауважте, що хоча - з очевидних причин - файлова система не може бути більшою за розділ, в якому вона знаходиться, вона може бути безпечно меншою. Трюк безпеки тут - зменшити "більше, ніж потрібно". Наприклад: уявіть, що у вас є файлова система розміром 1 ТБ, яку ви хочете перенести на привід 500 Gig. У цьому випадку я пропоную зменшити fs до, скажімо, 450 Gig (для цього, звичайно, у вас має бути достатньо вільного простору, тобто, зараз зайнятий простір у цій файловій системі не може перевищувати 450 Gig). Очевидно, що витрачено 50 ГГ простору буде виправлено після міграції даних.

2) Розділити диск призначення з відповідною геометрією, враховуючи його обмеження у просторі;

3) введіть дані за допомогою пристрою (-ів) розділів, а не дискового пристрою (тобто використовувати dd if=/dev/sda# of=/dev/sdb#для кожного розділу замість використання if=/dev/sda of=/dev/sdb). ПРИМІТКА: тут sda та sdb - лише приклади; ВАЖЛИВА ПРИМІТКА. Коли dd'ing з більшого на менший пристрій розділів, dd поскаржиться на спробу написання повідомлення до кінця пристрою блоку, це нормально, оскільки дані файлової системи були повністю скопійовані до досягнення цієї точки. Щоб уникнути такого повідомлення про помилку, ви можете вказати розмір використовуваної копії bs=та count=параметри відповідно до розміру скороченої файлової системи, але для цього знадобиться певний (простий) розрахунок, але якщо це зроблено неправильно, ви можете ризикувати вашими даними.

4) Після введення даних, змініть розмір відповідної файлової системи (-ів) у розділі (-и) призначення, використовуючи resize2fs. На цей раз не вказати новий розмір файлової системи. Якщо працювати без специфікації розміру, resize2fs збільшує файлову систему таким чином, що вона займає максимально дозволений розмір, тож у цьому випадку файлова система 450 Gig знову зросте та займе весь розділ 500 Gig і жоден байт не буде витрачений даремно. (Підхід "зменшити більше, ніж потрібно" дозволяє уникнути випадкового неправильного визначення розмірів та ризику ваших даних. Зверніть увагу, що одиниці ГБ проти GiB можуть бути складними).

Примітка для більш складних операцій: Якщо у вас є менеджер завантаження, який ви збираєтесь скопіювати разом, що, швидше за все, так, ви можете ввести перші кілька КБ диска за допомогою дискового пристрою замість пристроїв розділення (наприклад, dd if=/dev/sda of=/dev/sdb bs=4096 count=5), а потім переконфігуруйте геометрію в / dev / sdb (що тимчасово буде містити недійсну геометрію для нового диска, але неушкоджений та дійсний менеджер завантаження). Нарешті, продовжуйте використовувати пристрої розділення, як описано вище, для одночасного введення розділів. Я робив такі операції багато разів. Зовсім недавно я успішно здійснив складну міграцію при модернізації з жорсткого диска, що містить суміш установок MacOSX та Linux, на менший SDD в моєму MacMini6,2. У цьому випадку мені довелося завантажувати Linux із зовнішнього диска, dd'ed bootmanager, запускав gdisk, щоб виправити GPT на новому диску і, нарешті, dd'ed кожен розділ, що містить щойно стиснуті файлові системи. (Зверніть увагу, що схема розділів GPT зберігає дві копії таблиці розділів, одну на початку, а іншу в кінці диска. gdisk скаржиться дуже багато, оскільки він не може знайти другу копію ПТ та через те, що розділи перевищують розмір диска, але він правильно виправляє проблему копіювання PT після повторного визначення геометрії диска). Це був набагато складніший випадок, але його варто згадати, оскільки це свідчить про те, що такий вид операцій також цілком здійсненний.

Удачі! ... і найголовніше пам’ятайте, що слід створити резервну копію всіх важливих даних перед такою операцією. Помилка, і ви точно можете пошкодити свої дані безповоротно.

І на всякий випадок, якщо я не наголосив достатньо: резервні копії даних перед міграцією! :)


Дуже гарне пояснення, дякую!
нірвана-

1

Якщо ви хочете встановити машину на проїжджій частині дороги, яка на 20 см вужча від машини, і ви вирізали ліву на 20 см від машини, чи буде машина все-таки працювати? Напевно, ні.

Якщо ви скопіюєте початок диска на інший диск і скоротите копію, оскільки цільовий диск менший, результат не працює. Навіть якщо на цільовому диску буде достатньо місця для розміщення всіх файлів, вирізання після N байтів з початку диска не надасть вам діючої файлової системи.

Якщо диск розділений на розділи в стилі ПК (GPT або MBR), то всі розділи, які повністю вміщуються в ціль, працюватимуть. Є один виняток: з розділами MBR, якщо логічні розділи не пронумеровані в порядку диска, то, як тільки ланцюг покине цільову область, розділи більше не будуть в списку. (Якщо ви цього не розумієте, це ще одна причина, щоб не робити часткову копію диска.) Було б набагато більше сенсу копіювати розділи, які ви хочете зберегти, замість того, щоб копіювати від початку і закінчувати будь-якими підходящими. . Частково скопійований розділ наприкінці не буде корисним.

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

Якщо ви хочете скопіювати лише деякі дані з великого диска на менший диск, створіть розділи на меншому диску. Якщо ви хочете скопіювати розділ на розділ одного розміру, ви можете зробити це за допомогою cat. Якщо ви хочете скопіювати розділ на менший розділ, створіть файлову систему на цільовому розділі та зробіть копію на рівні файлу з чимось на зразок cp -aабо pax -rw -pe -t.

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


Так, я добре втрачаю останні розділи. На всіх моїх дисках усі важливі речі завжди відповідають розміру навіть найменшого з моїх дисків. Перегородки, що перевищують це, завжди є несуттєвими. Річ із "cat" полягає в тому, що він не створюватиме розділи чи MBR (якщо я не помиляюся)
Ray Andrews

@rayandrews Якщо ви працюєте catна цілому диску, він створить ті самі розділи (із застереженням для розділів MBR, див. мою редакцію). Те саме стосується і ddвикористання ddлише складного способу ведення cat. Якщо ви працюєте catна розділі, то, звичайно, це не створить розділи; використовуйте для цього fdisk / gdisk / parted /…
Жил "ТАК - перестань бути злим"

Дуже цікаво. Добре, покажіть мені приклад команди, тоді я спробую її, і якщо це добре, це найкраще рішення.
Рей Ендрюс

@rayandrews Приклад команди робити що?
Жил "ТАК - перестань бути злим"

Просто зразок команди, що використовує 'cat' для клонування диска. Зробіть це новою відповіддю, щоб я міг її прийняти.
Рей Ендрюс

0

Я хотів би поділитися своїм досвідом роботи з цією темою, якщо це виявиться корисним для іншого читача. Нещодавно я використав DDRESCUE для відновлення першої 1/3 розділу NTFS з несправного жорсткого диска і успішно відновив відновлений сегмент розділу на меншому жорсткому диску - тим самим врятувавши захоплені файли (і втративши решту). Нижче наведено кроки, які я вчинив, роблячи це (безумовно, підхід HACKSAW !!) ...

Жорсткий диск джерела складався з 750 ГБ форматування в NTFS з файлом MBR. Я використовував його лише кілька разів для створення резервної копії файлів, тому більшість файлів були на початку диска, приблизно 160 Гб. Член сім'ї збив жорсткий диск (встановлений зовні) на підлогу - після цього він ніколи не працював належним чином! Використовуючи ddrescue (кропітко), я зміг відновити значну частину початку диска. Через фізичні пошкодження він вимикається дуже часто протягом всього процесу ...

У мене був невеликий жорсткий диск для ноутбука розміром 150 Гб (встановлений зовні), на який я витягував дані ddrescue. Крім того, я міг би витягнути дані у файл зображення та пізніше встановити файл, проте я подумав, що записувати дані безпосередньо на жорсткий диск, щоб бути більш прямим.

Ключовим трюком для порятунку було вручну редагувати дані MBR та NTFS Boot Sector на рятувальному жорсткому диску. Без цього жорсткий диск не розпізнається жодною операційною системою. Я не зміг знайти підходящу програму в Linux для цього, тому я звернувся до Windows. Є зручний пакет під назвою Інструменти підтримки Windows, який більше не підтримується, але все ще корисний (див. Посилання нижче)! Інструмент, який я використовував для редагування розділу, - це Disk Probe. Не забудьте знати значення кінцевого сектора вашого жорсткого диска (я використовував fdisk -l в Ubuntu)

https://en.wikipedia.org/wiki/Windows_Support_Tools

Використовуючи хороший калькулятор та трохи креативності, я завантажив і встановив жорсткий диск у Disk Probe в Windows та відредагував кінцеві значення сектора. У MBR потрібно було змінити два набори значень, а саме: a) кінцевий сектор жорсткого диска та b) кінцевий сектор розділу NTFS. У завантажувальному секторі NTFS значення «Загальні сектори» розділу потрібно було змінити. У кожному випадку числове значення зменшувалося, щоб відповідати зменшеній "розмірності" меншого жорсткого диска (кінцеві сектори змінилися з 750 ГБ на 150 ГБ). Клацніть на вкладці Вид, щоб змінити ці значення.

Ось зображення Disk Probe в дії, що редагує дані завантажувального сектора NTFS Інструменти підтримки Windows - дисковий зонд

Редагуючи вищезгадані поля, Windows визнав розділ як дійсний розділ, хоча і пошкоджений. Я ввів командний рядок і запустив програму Windows Chkdsk на пошкодженому жорсткому диску (chdsk D :). Було захоплююче бачити, як розділ оживає, файл за файлом! Програма відновила таблицю розділів і успішно перезавантажила всі файли, скопійовані з пошкодженого жорсткого диска. Файли, які вийшли за межі діапазону (не скопійовані), не були знайдені і тому були видалені.

У наступній частині я не розумію причини, оскільки Windows успішно відновив жорсткий диск розміром 150 ГБ із файлами, що входять у комплект. Тим не менш, Windows нативно не зміг відкрити розділ жорсткого диска для перегляду файлів (виникла помилка). Однак Ubuntu на допомогу! Я перезавантажився в Ubuntu, встановив зовнішній жорсткий диск, і без проблем, всі відновлені файли з'явилися!

Сподіваємось, цей метод ножовим пилом відновлення файлів з великого жорсткого диска на меншому жорсткому диску виявиться корисним для інших, окрім мене. Ура!


1
Ви чітко вкладаєте багато думок у цю відповідь. На жаль, це питання не дуже відповідає. " ddrescueне є похідною dd, і не пов'язана ddжодним чином, за винятком того, що обидва можуть використовуватися для копіювання даних з одного пристрою на інший. Різниця полягає в тому, що ddrescue використовує складний алгоритм для копіювання даних з несправних дисків, викликаючи їх як мало можлива шкода ». - Вікіпедія. Крім того, ваша відповідь, як видається, зосереджена насамперед на операційному середовищі Windows, що тут не є типовою конфігурацією
Fox

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

0

Потрібно спочатку зменшити розділи в джерелі (або видалити ці поза межами).
Тоді ddі після того, що вам, ймовірно, потрібно буде відновити таблицю розділів за допомогою gdisk /dev/sd<target>
та послідовності ключів для ремонту таблиці, v r d w
я пропоную вам роздрібнити розділи трохи менше, ніж потрібно, і після того, як розгорнути їх до повного розміру цільового диска.
(Ця відповідь заснована на моєму особистому досвіді клонування мого жорсткого диска на менший SSD)


+1. Цей метод працює і для мене: клонування працює, коли всі розділи вміщуються в цільовий диск :-) Лише один коментар: Вам потрібно відремонтувати таблицю розділів резервного копіювання таблиці GUID-учасників (GPT), але якщо є MSDOS старого стилю таблиця розділів, немає резервної таблиці розділів для відновлення.
sudodus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.