2014-08-11
Copying GPT partition tables from disk to disk
There's a number of situations where you want to replicate partition
tables from one disk to another disk; for example, if you are setting
up mirroring or (more likely) replacing a dead disk in a mirrored
setup with a new one. If you're using old fashioned MBR partitioning,
the best tool for this is sfdisk
and it's done as follows:
sfdisk -d /dev/OLD | sfdisk /dev/NEW
Under some situations you may need 'sfdisk -f
'.
If you're using new, modern GPT partitioning,
the equivalent of sfdisk
is sgdisk
. However it gets used somewhat
differently and you need two operations:
sgdisk -R=/dev/NEW /dev/OLD sgdisk -G /dev/NEW
For obvious reasons you really, really don't want to accidentally flip
the arguments. You need sgdisk -G
to update the new disk's partitions
to have different GUIDs from the original disk, because GUIDs should be
globally unique even if the partitioning is the same.
The easiest way to see if your disks are using GPT or MBR partitioning
is probably to run 'fdisk -l /dev/DISK
' and look at what the
'Disklabel type
' says. If it claims GPT partitioning, you can
then run 'sgdisk -p /dev/DISK
' to see if sgdisk
likes the full
GPT setup or if it reports problems. Alternately you can use 'gdisk
-l /dev/DISK
' and pay careful attention to the 'Partition table
scan
' results, but this option is actually kind of dangerous; under
some situations gdisk
will stop to prompt you about what to do
about 'corrupted' GPTs.
Unfortunately sgdisk
lacks any fully supported way of dumping and
saving a relatively generic dump of partition information; 'sgdisk
-b
' explicitly creates something which the documentation says
should not be restored on anything except the original disk. This
is a hassle if you want to create a generic GPT based partitioning
setup which you will exactly replicate on a whole fleet of disks (not that we use GPT partitioning
on our new iSCSI backends, partly for this reason).
(I suspect that in practice you can use 'sgdisk -b
' dumps for
this even if it's not officially supported, but enhh. Don't forget
to run 'sgdisk -G
' on everything afterwards.)
(This is the kind of entry that I write so I have this information in a place where I can easily find it again.)