从 ext4 分区映像创建可启动磁盘

从 ext4 分区映像创建可启动磁盘

我的目标是在不重新启动的情况下创建系统的可启动备份,我将使用 qemu-img 将原始 dd 映像转换为 vhdx 并在 Hyper-V 中运行它。

如果我启动到 liveCD 并运行:

dd if=/dev/sda of=/nfs/sda.raw conv=noerror,sync,notrunc

我可以将其转换为 vhdx 并直接在 Hyper-V 中运行,无需花费太多精力。

fdisk -l 输出:

Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7555D04B-D6DC-4ABB-8863-529E874BADAD

Device       Start       End   Sectors   Size Type
/dev/sda1     2048   2000895   1998848   976M EFI System
/dev/sda2  2000896 500117503 498116608 237.5G Linux filesystem

但是,当系统在线时,您无法使用该命令,因此我使用 dattobd 驱动程序来复制整个 ext4 文件系统,如下所示:

dd if=/dev/datto0 of=/nfs/sda2.raw bs=1M

这有效地正确复制了所有数据/dev/sda2,我已经验证了这一点,因为如果我在哪里使用 liveCD 并添加分区,哈希值是相同的/dev/sda2。现在我可以启动到 liveCD 并复制/dev/sda1,这是 EFI 分区,因此它不会经常更改,除非我更新 grub 或 Linux 内核相关的东西,我可以重新启动只是偶尔备份该分区,但如果有人知道在线执行此操作的方法,请告诉我。

现在我有/dev/sda1/dev/sda2两个单独的文件,我的问题是如何将这两个文件组装成一个文件,该文件基本上提供与dd if=/dev/sda of=/nfs/sda.raw conv=noerror,sync,notrunc在 liveCD 上运行相同的输出?您只需要完美对齐字节吗?我到处寻找这个但没有运气。很感谢任何形式的帮助!

答案1

您可以循环安装具有分区支持的整个磁盘映像,然后将dd更新的sda2映像放入其中:

losetup -P /dev/loop0 /nfs/sda.raw  #this will create /dev/loop0p1 and loop0p2
dd if=/nfs/sda2.raw of=/dev/loop0p2
losetup -d /dev/loop0

或者,您的分区表表明您的第一个分区从扇区 #2048 开始,因此您的磁盘在第一个分区(“头”)之前有 2048 * 512 字节 = 1 MiB 的空间,以及 500118192 - 500117503 - 1 = 688 个扇区(344 kiB) 的空间位于任何分区外部的末尾(“尾部”)。 (-1,因为第一个扇区是#0,而不是#1)

第一个分区以扇区 #2000895 结束,第二个分区以扇区 #2000896 开始,因此它们之间没有未使用的空间。

您使用的是 GPT 分区表,其中包括磁盘末尾分区表的备份副本,因此“尾部”部分也需要捕获。它从扇区#500117504 开始,一直到磁盘末尾。

因此,您可以分别捕获“头部”和“尾部”部分的内容,然后将它们放在一起:

dd if=/dev/sda of=/nfs/head.raw bs=512 count=2048
dd if=/dev/sda of=/nfs/tail.raw bs=512 skip=500117504
cat /nfs/head.raw /nfs/sda1.raw /nfs/sda2.raw /nfs/tail.raw > /nfs/sda.raw

除非您修改分区表,否则您只需要捕获“头”和“尾”部分一次:它们在系统的正常使用期间不应更改。

相关内容