Як скопіювати макет розділів цілого диска за допомогою стандартних інструментів


81

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

dd if=/dev/sda of=partitiontable.bin bs=1 skip=446 count=64 # backup
dd if=partitiontable.bin of=/dev/sda bs=1 seek=446 count=64 # restore

Але коли мова заходить про макет логічних розділів, мені цікаво, чи існує серед стандартних інструментів подібний спосіб збереження макета? Я думаю, що головна проблема полягає у знаходженні компенсацій у місцях розташування ЄБР, тому що з цим ddбуде робити все інше. Майте на увазі, що я повинен мати можливість повернути все на (можливо) порожній диск і тим самим відновити ту саму компоновку. Використовуючи інструменти для розділення, як-от fdiskабо partedдобре, я повинен бути в змозі автоматизувати їх використання (сценарії), і вони не повинні залежати від будь-яких пакетів, пов’язаних з X - лише командного рядка.

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

Відповіді:


89

Ви можете використовувати sfdisk для цього завдання.

Зберегти:

sfdisk -d /dev/sda > part_table

Відновлення:

sfdisk /dev/sda < part_table

Для таблиць розділів GPT це вимагає sfdiskвід util-linux 2.26 або новішої версії. Це було переписано з нуля поверх libfdisk .

Це копіює UUID без змін, а не створює нові. Тож новий диск - це клон оригіналу, а не просто інший диск з такою ж компонуванням. Зауважте, що Linux /dev/disk/by-uuid/дивиться на UUID файлової системи, але не UUID в таблиці розділів. sfdiskбуде генерувати нові UUID, якщо ви відредагуєте UUID з дампа (за розділом та UUID для самої таблиці розділів біля початку файлу).


1
Я точно не знаю, але єдиний ліміт, який мені спадає на думку, - це обмеження розміру 2TB для розділу, накладене схемою таблиці розділів msdos. Щоб подолати цю межу, замість цього можна використовувати GPT, але sfdisk AFAIK не може працювати з GPT. Я не знаю, чи є якийсь інший ліміт, ні якщо sfdisk повідомить, якщо він не впорається.
Петро Узель

2
sfdiskне працює з великими обсягами та не підтримує GPT.
dhchdhd

1
@Barry, і коли ти кажеш "великий", ти маєш на увазі обмеження 2TB @Petr говорить?
Лауріц В. Таулов

5
Правильний шлях: sudo parted / dev / sda -lm> sda.parted
dhchdhd

1
Іноді корисно ігнорувати лише проблеми з DOS, додати параметр -L або --linux :sfdisk -L /dev/sda < part_table
Дієго

50

Це залежить, якщо ваш вихідний диск використовує таблицю розділів MBR (він же "dos" або "msdos") або GPT (він же "GUID").

Диски понад 2 ТБ не можуть використовувати MBR, тому вони є GPT.

На дисках розміром до 2 ТБ можна використовувати обидва, тому спочатку доведеться з’ясувати, що це таке.

Припустимо, що ви перебуваєте в Linux, використовуйте будь-яку з цих команд, щоб дізнатися, яку таблицю розділів використовує ваш вихідний диск:

disk=/dev/sda

# Always available, but old versions may not recognize gpt
fdisk -l $disk | grep type

# `apt-get install gdisk` or equivalent on non-Debian systems
gdisk -l $disk | grep -A4 'scan'

# `apt-get install parted`
parted $disk print | grep Table

Дано

source=/dev/sda
dest=/dev/sdb

Для дисків MBR

використовувати, sfdiskяк пропонує відповідь Петра Узела, або такий варіант:

# Save MBR disks
sfdisk -d $source > /partitions-backup-$(basename $source).sfdisk
sfdisk -d $dest   > /partitions-backup-$(basename $dest).sfdisk

# Copy $source layout to $dest
sfdisk -d $source | sfdisk $dest

Для дисків GPT

Правильна відповідь була дана тут і тут по Kris Харпер .

Вам потрібен fdisk GPT . Подивіться на сторінку завантаження або запустіть sudo apt-get install gdisk.

Потім використовуйте команду sgdisk :

# Save MBR disks
sgdisk --backup=/partitions-backup-$(basename $source).sgdisk $source
sgdisk --backup=/partitions-backup-$(basename $dest).sgdisk $dest

# Copy $source layout to $dest and regenerate GUIDs
sgdisk --replicate=$dest $source
sgdisk -G $dest

Остання команда рандомізує GUID на диску та всіх розділах. Це необхідно лише в тому випадку, якщо диски потрібно використовувати в одній машині, інакше це зайве.


10
Мені завжди страшно, що я змішу два параметри, тому хороший трюк - використовувати --backup=Fileдля експорту таблиці розділів з вихідного диска та --load-backup=Fileвідновлення на приводному диску.
zidarsk8

Чи є ризик для існуючих даних на дисках і наступних розділах, коли ви переміщуєте таблицю розділів і потім рандомізуєте GUID дисків і розділів, як описано вище? Дякую!
EngBIRD

@EngBIRD: Поки ви не змішуєте $ source та $ dest, не може бути ризику для даних, оскільки немає даних про місце призначення. Ви копіюєте лише макет розділу, а після цього потрібно відформатувати та скопіювати дані.
mivk

Причина, яку я запитав, насправді я не починаю з чистого диска, я
міняю

5

Старіші, але все ж цікаві підшиті та пітон-lvm в'язки .

Оновлення:

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

sfdisk не розуміє таблицю розділів GUID (GPT) і він не призначений для великих розділів. Зокрема, використовуйте просунутіший GNU-розділений (8).

Ця команда, однак, підтримує> 2 TB розділи та LVM.

# parted -ms /dev/sda print > sda.parted

Вибірка зразка:

BYT;
/dev/sda:12.9GB:scsi:512:512:msdos:VMware Virtual disk;
1:1049kB:12.9GB:12.9GB:::boot, lvm;

14
Як відновити збережений sda.partedфайл на новому диску?
Евері Чан

4
Ця відповідь марна, оскільки питання стосувалося копіювання макета розділу на новий диск. Відповідь якраз про демпінг. Як імпортувати? Будь ласка, покращуйте.
itsafire

Мабуть, в цей час немає хорошої відповіді: serverfault.com/questions/709582/…
Отей,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.