Как скопировать структуру разделов целого диска, используя стандартные инструменты

82

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

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

Но когда дело доходит до компоновки логических разделов, мне интересно, существует ли среди стандартных инструментов подобный способ сохранения макета? Я предполагаю, что основная проблема заключается в поиске смещений в местоположениях EBR, потому что с этим ddвсе остальное сделает. Имейте в виду, что я должен иметь возможность поместить все обратно на (возможно) чистый диск и, таким образом, восстановить тот же макет. Использование инструментов разделения вроде fdiskили partedхорошо, но я должен быть в состоянии автоматизировать их использование (создание сценариев), и они не должны зависеть ни от каких пакетов, связанных с X - только командная строка.

В моем плане резервного копирования это делается вручную в небольшом скрипте Python с использованием модуля struct, но я скорее надеялся, что есть более простой способ.

Лауриц В. Таулов
источник

Ответы:

90

Вы можете использовать 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
Я не знаю наверняка, но единственное ограничение, которое приходит мне в голову, это ограничение размера в 2 ТБ для раздела, наложенное схемой таблицы разделов msdos. Чтобы преодолеть этот предел, вместо этого можно использовать GPT, но AFAIK sfdisk не может работать с GPT. Я не знаю, есть ли какой-либо другой лимит или sfdisk сообщит, если он не справится.
Петр Узел
2
sfdiskне работает с большими объемами и не поддерживает GPT.
Дххдхд
1
@ Барри, а когда вы говорите «большой», вы имеете в виду ограничение в 2 ТБ, о котором говорит Петр?
Лауриц В. Таулов
5
Правильный путь: sudo parted / dev / sda -lm> sda.parted
dhchdhd
1
Иногда полезно, чтобы игнорировать только проблемы DOS, добавить опцию -L или --linux :sfdisk -L /dev/sda < part_table
Диего
51

Это зависит от того, использует ли ваш исходный диск таблицу разделов 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 Харпер .

Вам нужен GPT fdisk . Посмотрите на странице загрузки или запустите sudo apt-get install gdisk.

Затем используйте команду sgdisk :

# Save GPT 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 на диске и всех разделах. Это необходимо только в том случае, если диски должны использоваться на одном компьютере, в противном случае это не нужно.

mivk
источник
10
Я всегда боюсь смешать два параметра, поэтому хороший прием - использовать --backup=Fileдля экспорта таблицы разделов с исходного диска и --load-backup=Fileдля восстановления на целевом диске.
zidarsk8
Есть ли какой-либо риск для существующих данных на дисках и последующих разделах, когда вы перемещаете таблицу разделов, а затем случайным образом определяете GUID дисков и разделов, как описано выше? Спасибо!
EngBIRD
@EngBIRD: Пока вы не смешиваете $ source и $ dest, не может быть риска для данных, так как нет данных о месте назначения. Вы только копируете макет раздела, и вам все равно нужно отформатировать и скопировать данные впоследствии.
mivk
Причина, по которой я спросил, на самом деле я не начинаю с чистого диска, я обмениваю два диска вокруг ...
EngBIRD
5

Старые, но все еще интересные привязки pyparted и python-lvm .

Обновить:

Предыдущий был опубликован, потому что выше не работает во многих современных ситуациях для man-страницы sfdisk.

sfdisk не понимает таблицу разделов GUID (GPT) и не предназначен для больших разделов. В частном случае используйте более продвинутый GNU parted (8).

Эта команда, однако, поддерживает> 2 ТБ разделов и 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;
dhchdhd
источник
14
Как восстановить из сохраненного sda.partedфайла на новый диск?
Эйвери Чан
4
Этот ответ бесполезен, потому что вопрос был о копировании структуры разделов на новый диск. Ответ только о демпинге. Как импортировать? Пожалуйста, улучшите.
его
Видимо, в настоящее время нет хорошего ответа: serverfault.com/questions/709582/…
Отей