如何使用标准工具复制整个磁盘的分区布局


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

但是,当涉及到逻辑分区的布局时,我想知道标准工具中是否存在类似的保存布局的方法?我想主要的问题是找到EBR位置的偏移量,因为dd这样做将完成其余的工作。请记住,我需要能够将所有内容放回(可能是)空白磁盘,从而恢复相同的布局。使用类似fdisk或的分区工具parted很好,但是我必须能够自动使用它们(脚本),并且它们不应该依赖于任何与X相关的软件包-仅命令行。

我的备份计划是使用struct模块在一个小的python脚本中手动完成,但我希望有一种更简单的方法。

Answers:


89

您可以将sfdisk用于此任务。

救:

sfdisk -d /dev/sda > part_table

恢复:

sfdisk /dev/sda < part_table

对于GPT分区表,这需要sfdiskutil-linux 2.26或更高版本。它是从头开始在libfdisk上重写的

这将原样复制UUID,而不是生成新的UUID。因此,新磁盘是原始磁盘的克隆,而不仅仅是具有相同布局的另一个磁盘。请注意,Linux /dev/disk/by-uuid/查看的是文件系统UUID,而不是分区表中的UUID。 sfdisk如果您从转储中删除UUID(每个文件的分区和文件表开头附近的分区表的UUID),则会生成新的UUID。


1
我不确定,但是我想到的唯一限制是msdos分区表方案对分区施加的2TB大小限制。为了克服此限制,可以改用GPT,但AFAIK sfdisk无法与GPT一起使用。我不知道是否还有其他限制,或者sfdisk是否会报告无法解决的问题。
彼得·乌泽尔

2
sfdisk不适用于大批量或支持GPT。
dhchdhd 2011年

1
@Barry,当您说“大”时,您指的是@Petr在说的2TB限制?
Lauritz V. Thaulow

5
正确的方法是:sudo parted / dev / sda -lm> sda.parted
dhchdhd

1
有时,仅忽略DOS问题,添加-L或--linux选项很有用sfdisk -L /dev/sda < part_table
Diego

50

这取决于您的源磁盘是使用MBR(又名“ dos”或“ msdos”)还是GPT(又名“ GUID”)分区表。

超过2 TB的磁盘不能使用MBR,因此它们是GPT。

小于2 TB的磁盘可以同时使用,因此您必须首先确定它是哪一个。

假设您使用的是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按照Petr Uzel的答案建议使用,或使用以下变体:

# 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 Harper)在这里这里都给出正确的答案。

您需要GPT fdisk。查看下载页面或运行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 '16

@EngBIRD:只要您不混淆$ source和$ dest,就不会有数据风险,因为目标上没有数据。您仅复制分区布局,之后仍需要格式化和复制数据。
mivk

我问的原因实际上是我不是从空白磁盘开始的,而是要交换两个磁盘...
EngBIRD

5

较旧但仍很有趣的pypartedpython-lvm绑定。

更新:

之所以发布前一篇,是因为在sfdisk手册页上,上述内容在许多现代情况下均不起作用。

sfdisk无法理解GUID分区表(GPT),因此它不适用于大型分区。在特定情况下,请使用更高级的GNU parted(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 2015年

显然,在这个时候,没有很好的答案:serverfault.com/questions/709582/...
Otheus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.