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

Lau*_*low 100 command-line partition

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*zel 114

即使在 GPT 分区磁盘中,您也可以使用sfdisk执行此任务*。

节省:

sfdisk -d /dev/sdX > part_table
Run Code Online (Sandbox Code Playgroud)

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

sfdisk /dev/sdX < part_table
Run Code Online (Sandbox Code Playgroud)

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

grep -v ^label-id part_table | sed -e 's/, *uuid=[0-9A-F-]*//' | sfdisk /dev/sdY
Run Code Online (Sandbox Code Playgroud)

笔记

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

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

  • 正确的方法是:sudo parted /dev/sda -lm &gt; sda.parted (6认同)
  • `sfdisk` 不适用于大容量或支持 GPT。 (3认同)

miv*_*ivk 61

这取决于您的源磁盘是使用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
Run Code Online (Sandbox Code Playgroud)

给定的

source=/dev/sda
dest=/dev/sdb
Run Code Online (Sandbox Code Playgroud)

对于 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
Run Code Online (Sandbox Code Playgroud)

对于 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
Run Code Online (Sandbox Code Playgroud)

最后一个命令随机化磁盘和所有分区上的 GUID。仅当磁盘要在同一台机器上使用时才需要,否则没有必要。

  • 我总是害怕我会混合这两个参数,所以一个很好的技巧是使用 `--backup=File` 从源驱动器导出分区表,并使用 `--load-backup=File` 来恢复目标驱动器。 (11认同)