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

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

我想备份整个分区布局硬盘驱动器,包括逻辑驱动器,以便我可以将该布局恢复到另一个磁盘。我愿意不是想要复制分区的内容,只复制布局。对于主分区和扩展分区,很简单:

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 脚本中手动执行此操作,但我宁愿希望有一种更简单的方法。

答案1

您可以使用软盘即使在 GPT 分区磁盘* 中也可以完成此任务。

节省:

sfdisk -d /dev/sdX > part_table

恢复时保持相同的磁盘和分区 ID**:

sfdisk /dev/sdX < part_table

恢复生成新的磁盘和分区 ID**:

grep -v ^label-id part_table | sed -e 's/, *uuid=[0-9A-F-]*//' | sfdisk /dev/sdY

笔记

*: 为了GPT 分区表,这需要sfdiskutil-linux 2.26 或更高版本。它在 libfdisk 之上从头开始重写

**:默认情况下sfdisk将原样复制磁盘和分区 ID,而不是生成新的。因此,新磁盘将是原始磁盘的克隆,而不仅仅是具有相同布局的另一个磁盘。请注意,Linux 会/dev/disk/by-uuid/查看文件系统 UUID,而不是分区表中的 UUID。 如果从转储中sfdisk删除对分区 id() 的引用, uuid=...和对磁盘 id() 的引用,将生成新的 UUID。label-id: ...

答案2

这取决于如果您的源磁盘使用膜生物反应器(又名“dos”或“msdos”)或GPT(又名“GUID”)分区表。

超过2TB的磁盘不能使用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 磁盘

已给出正确答案这里这里经过克里斯·哈珀

你需要GPT 磁盘。看着那(这下载页面或运行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。仅当磁盘要在同一台机器中使用时才需要这样做,否则没有必要。

答案3

较旧但仍然有趣pyparted蟒蛇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;

答案4

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

我首选的方法是:

sfdisk -d /dev/nvme0n1 | sfdisk /dev/nvme1n1

其中 /dev/nvme0n1 是源磁盘,/dev/nvme1n1 是目标磁盘。

相关内容