我想备份整个分区布局硬盘驱动器,包括逻辑驱动器,以便我可以将该布局恢复到另一个磁盘。我愿意不是想要复制分区的内容,只复制布局。对于主分区和扩展分区,很简单:
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 分区表,这需要sfdisk
util-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
更新:
发布前一个内容是因为根据 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 是目标磁盘。