膜生物反应器

膜生物反应器

我有一个使用 生成的现有分区的图像dd if=/dev/sdXN of=image.bin。现在我想使用这个映像作为虚拟机的基础。我知道如何将图像转换为 VirtualBox 可以使用的格式。

问题是“磁盘”映像实际上只是一个分区的映像,因此不包含 MBR 或分区表。这使得启动虚拟机变得非常困难。

是否有一种简单的方法,给定分区映像来创建正确的磁盘映像(包括分区表)?

答案1

您可以在主机上执行此操作。大多数工具fdisk都会对文件进行操作,并且kpartx使您可以访问文件中的分区。

  1. 创建一个新的空 100GiB 稀疏映像(使其比分区映像的大小稍大)

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. 对图像文件进行分区fdisk

    fdisk myvm.img
    
  3. 使映像文件中的分区在各个设备上可用

    sudo kpartx -a myvm.img
    
  4. 将分区镜像复制到分区中

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. 扩展文件系统以填充整个分区

    sudo resize2fs /dev/mapper/loop0p1
    
  6. 关闭分区

    sudo kpartx -d myvm.img
    
  7. 拆除环回装置

    sudo losetup -D
    

答案2

我确信最初的问题很久以前就已经解决了,但对于任何有类似问题的人来说:

避免复制整个映像的一种方法是创建一个 .vmdk 格式映像,该映像引用分区表和分区内容的单独扩展文件。

我不久前进行的测试中,在 .vmdk 文件中包含以下代码片段:

RW 63 FLAT "parttable.bin" 0
RW 585937489 FLAT "partition-image.bin" 63

这意味着从偏移量 0 开始的 63 个扇区是从原始文件“parttable.bin”中读取的,但扇区 63 及以上来自原始分区转储“partition-image.bin”。 (当然,将 63 替换为第一个分区的实际偏移量,现在通常为 2048)。

最终结果是,从 VBox 内部看,您似乎已将分区表添加到分区映像的前面,而无需执行冗长的复制操作。

从虚拟机内对驱动器进行分区,如果偏移量正确,您应该会在新创建的分区中看到分区映像内容。

答案3

有趣的问题。这就是我要做的:

  1. 使用适当大小的磁盘创建 VM,然后从恢复 CD 启动它。
  2. 以某种方式访问​​现有的磁盘映像(nfs、cifs 等)。
  3. 在虚拟机的本地磁盘上创建您需要的分区。
  4. 使用dd将分区镜像写入vm磁盘上的分区。

完成此操作后,您需要更新引导加载程序。假设您使用 GRUB,挂载新写入的分区,然后 chroot 进入其中并运行update-grub(但要小心,您可能需要调整其配置文件才能正常工作)。

祝你好运!

答案4

我个人更喜欢使用dd.

我假设这里有 512 字节的扇区。可能存在 2048 字节扇区的情况,因此只需交换数字并进行数学计算即可。

在每种情况下,我都使用 512MB 的测试文件,例如:

dd if=/dev/zero of=testfs.img bs=512 count=1M mkfs.ext4 testfs.img

膜生物反应器

构图

我个人更喜欢将第一个 MB(2048 个扇区)附加到其开头:

dd if=testfs.img skip=2048 bs=512 of=full.img

最后运行 fdisk 创建分区表(或复制到您自己的分区表中),我使用默认值创建了 1 个分区。

正在验证

要验证,请创建循环分区并自动检测:

sudo losetup -fP full.img

file并在生成的分区环回设备上运行:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)

GPT

构图

我个人更喜欢将第一个 MB(2048 个扇区,因为 gdisk 将默认为该数字,因为它是 1 MB 对齐)附加到其开头作为开始 MBR,并将 34 个扇区附加到其末尾(或 2048 个完整 MB)作为结束GPT(结束扇区可能不同)。省略结尾的 GPT 可能会丢失数据:

dd if=testfs.img skip=2048 bs=512 of=full.img dd if=/dev/zero seek=1050624 bs=512 of=full.img count=34

最后运行 gdisk 创建分区表(或复制到您自己的分区表中),我使用默认值创建了 1 个分区。

正在验证

要验证,请创建循环分区并自动检测:

sudo losetup -fP full.img

file并在生成的分区环回设备上运行:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files) 此方法可确保无需猜测、调整大小或手动对齐。

相关内容