如何快速将一个硬盘的GPT分区方案复制到另一个硬盘?

在非GPT分区表上,我可以执行以下操作: 。
但是sfdisk不支持GPT分区表。有什么替代方案吗?
我正在寻找一个一两个命令的解决方案,而不仅仅是使用GNU parted来输出分区大小,然后手动重新创建它们。

3util-linux分区工具(包括sfdisk)在util-linux 2.26中进行了重写,以支持GPT。然而,与gdisk不同的是,sfdisk不支持将小型引导分区放置在1MiB之前,因此无法处理我的配置。(已向上游报告了该错误。) - Peter Cordes
当我将MBR磁盘克隆到较小的磁盘时,除了使用sfdisk -d命令外,我还需要编辑转储文件并修改起始/结束扇区。对于GPT磁盘,我该如何使用sgdisk来完成这个操作呢?-R选项可以直接克隆而不创建中间备份文件,而-b选项则创建一个二进制备份文件,无法像sfdisk那样以人类可读/可编辑的方式进行操作! - Costin Gușă
3这方面的更新:在这种方式下,sfdisk现在接受您提供的任何内容,包括在GPT之后以1MB结束的小型引导分区。http://unix.stackexchange.com/a/12988/79808 - Peter Cordes
dd if=/dev/sda of=/dev/sdb 这个命令怎么样? - Joseph
5个回答

安装gdisk,它可以在Ubuntu Universe软件源中找到。
然后使用sgdisk命令(这里是man页面)来复制分区表。
sgdisk /dev/sdX -R /dev/sdY 
sgdisk -G /dev/sdY

第一条命令将sdX的分区表复制到sdY(小心不要搞混了)。第二条命令会随机生成磁盘和所有分区的GUID。只有在这些磁盘将在同一台机器上使用时才需要执行此操作,否则是不必要的。

14这些信息对于任何想要更换失败的RAID-1磁盘的人来说都是宝贵的。谢谢! - Christian
@Christian 是的,那就是我用它的目的。 - Kris Harper
根据手册,这个还支持仅MBR磁盘(sgdisk在加载时自动转换),这非常棒。 - Tobu
11在进行任何破坏性的更改之前,请确保使用以下命令进行备份:sgdisk --backup=/some/safe/location/sdX.gpt /dev/sdXsgdisk --backup=/some/safe/location/sdY.gpt /dev/sdY - Michael Kropat
如果你搞砸了你的GPT分区表(就像我一样),可以看一下testdisk(1) - Michael Kropat
11这个命令是有效的,但需要注意的是示例中的驱动器顺序是相反的。更明显的写法是 sgdisk /dev/sdX -R /dev/sdY - Geoffrey
@Geoffrey 我明白你的意思,但这与man页面中列出的用法sgdisk [ options ] device相矛盾。 - Kris Harper
4@KrisHarper:确实如此,但由于程序使用getopt来解析命令行参数,顺序并不重要。应该更新man手册。 - Geoffrey
这对我重新启动软件RAID非常有帮助。谢谢! - Mike Turley
3如果示例可以编辑为sgdisk /dev/src -R /dev/dest,会更好一点。 - Kurt
2即使目标驱动器比源驱动器小,这个方法也适用。只需确保所有分区被压缩到源磁盘的开头,并且不要超过目标磁盘的大小。sgdisk会对此发出警告,但仍然可以工作,之后运行sgdisk -G将修复剩余的问题。这对于将笔记本从HDD迁移到较小的SSD非常有用。 - Martin Pecka
@KrisHarper也许你希望将备份部分放入你的答案中。这很重要。我曾经因为参数颠倒而删除了一个磁盘分区。唯一救了我一命的是我在终端上仍然打印着源分区表格。 - Holger Böhnke

我尝试过了,对我来说没有起作用。我找到的解决方案是:
sgdisk --backup=table /dev/sda
sgdisk --load-backup=table /dev/sdb
sgdisk -G /dev/sdb

1我发现这个解决方案更好,因为它可以与非GPT兼容。我还将最后一个命令改为:sgdisk -g /dev/sdb - Locke
1以上是有效的,你需要注意到这个例子有点反过来(虽然正确)。sgdisk /dev/sdX -R /dev/sdY 更加明显。 - Geoffrey
10先备份,然后恢复。我觉得这样更直观,也减少了混淆驱动器的机会。 - Csq

dd if=/dev/sda of=GPT_TABLE bs=1 count=A
dd if=GPT_TABLE of=/dev/sdb bs=1 count=A
partprobe /dev/sdb

A的定义如下:
A=(128*B)+1024
B=parted -ms /dev/sda print |tail -1|cut -b1

2这也会克隆所有磁盘和分区的GUID,这可能不是你想要的。此外,它也不会在磁盘末尾安装备份表。 - goertzenator
我喜欢这种方式!但更喜欢写成: sed '$s/:.*//p;d' 而不是 tail -n1 | cut -b1,因为如果您有超过9个分区,后者将失败! - F. Hauri - Give Up GitHub
1@goertzenator 你是对的,为此你可以运行常规 parted 工具,做一些操作(比如将任何未设置的标志设置为“否”),这将重新编写分区表两端! - F. Hauri - Give Up GitHub
你在顶部的部分从来没有使用过 B 吗? - Aaron Franke
B是用来计算A的一个值。 - dodexahedron

我刚刚尝试了使用sgdisk进行复制,效果非常好 - 你只需要遵循readline的语法规则即可。
   sgdisk --replicate=/dev/target /dev/source

或者

   sgdisk -R/dev/target /dev/source

一切都正常运作。


4这正是我的答案所说的。 - Kris Harper

自从版本2.26起,sfdisk支持MBR(DOS),GPT,SUN和SGI磁盘标签。

所以

sudo sfdisk -d /dev/sda | sudo  sfdisk /dev/sdb

将与sfdisk 2.26及更高版本兼容。

你错过了问题中解释为什么这不是一个选项的部分。 - DavidW
2你的回答对于GPT不起作用,只适用于非GPT。 - user636290
3在当前版本的sfdisk上,这确实可以工作。 - Gert van den Berg
1这个方法可以用,但是很遗憾它并没有创建一个新的磁盘ID。 - forresthopkinsa