我有一个使用 生成的现有分区的图像dd if=/dev/sdXN of=image.bin
。现在我想使用这个映像作为虚拟机的基础。我知道如何将图像转换为 VirtualBox 可以使用的格式。
问题是“磁盘”映像实际上只是一个分区的映像,因此不包含 MBR 或分区表。这使得启动虚拟机变得非常困难。
是否有一种简单的方法,给定分区映像来创建正确的磁盘映像(包括分区表)?
答案1
您可以在主机上执行此操作。大多数工具fdisk
都会对文件进行操作,并且kpartx
使您可以访问文件中的分区。
创建一个新的空 100GiB 稀疏映像(使其比分区映像的大小稍大)
dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
对图像文件进行分区
fdisk
fdisk myvm.img
使映像文件中的分区在各个设备上可用
sudo kpartx -a myvm.img
将分区镜像复制到分区中
sudo cp image.bin /dev/mapper/loop0p1
扩展文件系统以填充整个分区
sudo resize2fs /dev/mapper/loop0p1
关闭分区
sudo kpartx -d myvm.img
拆除环回装置
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
有趣的问题。这就是我要做的:
- 使用适当大小的磁盘创建 VM,然后从恢复 CD 启动它。
- 以某种方式访问现有的磁盘映像(nfs、cifs 等)。
- 在虚拟机的本地磁盘上创建您需要的分区。
- 使用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)
此方法可确保无需猜测、调整大小或手动对齐。