我想备份硬盘驱动器(包括逻辑驱动器)的整个分区布局,以便可以将该布局还原到另一个磁盘。我不想复制分区的内容,仅复制布局。对于主分区和扩展分区,这很容易:

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将完成其余的工作。请记住,我需要能够将所有内容放回(可能是)空白磁盘,从而恢复相同的布局。使用诸如fdiskparted之类的分区工具很好,但是我必须能够自动使用它们(脚本),并且它们不应该依赖于任何与X相关的软件包-仅命令行。使用struct模块在一个小的python脚本中手动完成此操作,但我希望有一种更简单的方法。

#1 楼

即使在GPT分区磁盘中,您也可以使用sfdisk来完成此任务*。
保存:生成新的磁盘和分区ID **:
sfdisk -d /dev/sdX > part_table


注意事项
*:对于GPT分区表,这需要util-linux 2.26或更高版本的sfdisk。它是从头开始在libfdisk上重新编写的。因此,新磁盘将是原始磁盘的克隆,而不仅仅是具有相同布局的另一个磁盘。请注意,Linux的sfdisk会查看文件系统UUID,而不是分区表中的UUID。如果从转储中删除对分区ID的引用(/dev/disk/by-uuid/)和对磁盘ID的引用(sfdisk),则, uuid=...将生成新的UUID。

评论


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

–Petr Uzel
2011年5月11日9:05

sfdisk不能用于大容量或支持GPT。

– dhchdhd
2011年5月11日在9:11

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

–Lauritz V. Thaulow
2011年5月11日在9:18

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

– dhchdhd
2011年8月12日上午8:17

有时,仅忽略DOS问题,添加-L或--linux选项很有用:sfdisk -L / dev / sda
–迭戈
2014年7月15日10:17



#2 楼

这取决于源磁盘是使用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磁盘

使用Petr Uzel的答案所建议的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 Harper在这里和这里给出的。

您需要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随机化,然后所有分区。仅当要在同一台计算机上使用磁盘时才需要这样做,否则是不必要的。

评论


我总是害怕我会混合使用两个参数,因此一个好技巧是使用--backup = File从源驱动器导出分区表,并使用--load-backup = File还原到目标驱动器。

– Zidarsk8
2014年7月24日在9:56

当您移动分区表,然后如上所述随机化磁盘和分区的GUID时,磁盘和后续分区上的现有数据是否存在任何风险?谢谢!

–EngBIRD
16年8月22日在0:36

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

– mivk
16年8月22日在10:00

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

–EngBIRD
16年8月22日在13:53

#3 楼

较旧但仍然有趣的pyparted和python-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;


评论


如何从保存的sda.parted文件还原到新磁盘?

–陈慧琳
2012年6月20日在1:46

这个答案没有用,因为问题在于将分区布局复制到新驱动器上。答案只是关于倾销。如何导入?请改善。

–itsafire
2015年10月8日,12:31

显然,目前尚无好的答案:serverfault.com/questions/709582/…

–奥修斯
19年5月30日在9:57

#4 楼

现代的sfdisk似乎适用于mbr和gpt分区表。

我的首选方法是:源磁盘,/ dev / nvme1n1是目标磁盘。

评论


也许因为我们已经有了(几个)sfdisk答案,所以我们可以建议对其中之一进行编辑以指出此管道功能?

– Jeff Schaller♦
20年5月21日在17:03

#5 楼

GPT磁盘分区表的缩写(> 2TB磁盘大小需要):
检查源磁盘分区表(打印)
sgdisk -p /dev/sda
Disk /dev/sda: 31251759104 sectors, 14.6 TiB
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 9EE86B93-3BA5-3C48-A6C5-111122223333
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 2048, last usable sector is 31251759070
Partitions will be aligned on 2048-sector boundaries
Total free space is 33 sectors (16.5 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048     15626993630   7.3 TiB     8E00  
   2     15626993664     31251759070   7.3 TiB     8E00  

将GPT磁盘SDA分区表克隆到新磁盘SDB(复制品)
sgdisk /dev/sda -R /dev/sdb
The operation has completed successfully.

检查副本磁盘分区表(打印)
sgdisk -p /dev/sdb
Disk /dev/sda: 31251759104 sectors, 14.6 TiB
Sector size (logical/physical): 512/4096 bytes
**Disk identifier (GUID)**: 9EE86B93-3BA5-3C48-A6C5-111122223333
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 2048, last usable sector is 31251759070
Partitions will be aligned on 2048-sector boundaries
Total free space is 33 sectors (16.5 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048     15626993630   7.3 TiB     8E00  
   2     15626993664     31251759070   7.3 TiB     8E00  

请注意,磁盘标识符(GUID)相同,因此在大多数情况下需要重新生成新的随机磁盘:
sgdisk -G /dev/sdb
The operation has completed successfully.

再次检查副本磁盘分区表(打印)
sgdisk -p /dev/sdb
Disk /dev/sda: 31251759104 sectors, 14.6 TiB
Sector size (logical/physical): 512/4096 bytes
**Disk identifier (GUID)**: 9EE86B93-3BA5-3C48-A6C5-925AB6C8E86B
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 2048, last usable sector is 31251759070
Partitions will be aligned on 2048-sector boundaries
Total free space is 33 sectors (16.5 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048     15626993630   7.3 TiB     8E00  
   2     15626993664     31251759070   7.3 TiB     8E00  

请注意,磁盘标识符(GUID)现在是唯一的。