Хоча спочатку запропонований "виклик" може здатися важким, нездійсненним або наївним, як дехто прокоментував, це не так. Основна ідея використання 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 після повторного визначення геометрії диска). Це був набагато складніший випадок, але його варто згадати, оскільки це свідчить про те, що такий вид операцій також цілком здійсненний.
Удачі! ... і найголовніше пам’ятайте, що слід створити резервну копію всіх важливих даних перед такою операцією. Помилка, і ви точно можете пошкодити свої дані безповоротно.
І на всякий випадок, якщо я не наголосив достатньо: резервні копії даних перед міграцією! :)
dd
розрахунок оптимального розміру блоку корисно