我正在做一个需要生成 vm 映像文件的项目,然后将其用作 qemu 可启动磁盘映像。之前我们的产品就像一个修改过的linux系统,做成USB安装盘,然后开机安装成裸机。但是现在我们想要摆脱硬件并在虚拟机中运行它,这就是我们需要一个映像文件的原因。
与其使用现有的 U 盘在 qemu 中安装系统,然后关闭 vm 并获取映像,我们被要求直接制作一个开箱即用的映像文件,并跳过所有在真机或虚拟机上的启动和安装但仍然得到一个已安装的镜像,这样我们就可以交付这个镜像,人们可以将这个镜像加载为一个随时可用的虚拟机镜像。
但是在整个过程中,我不能使用任何需要root权限的命令!不要问为什么,我们的项目有一大堆限制,我就是不能使用root权限,没有sudo,没有su,只是普通用户可以做的任何事情......
我已经实现的部分是使用最新版本的 mke2fs -d 命令将文件夹和文件树填充到此图像文件的不同分区中,如下所示
假设镜像启动后,我们有这些文件夹结构
$ ls /
$ bin dev boot home lib32 mnt proc run srv tmp var boot data etc lib lib64 opt root sbin sys usr
一些文件夹由不同的分区挂载
从图像中提取单个分区
dd if=image of=partitionN skip=offset_of_partition_N count=size_of_partition_N bs=512 conv=sparse
将文件夹填充到分区中
mke2fs -d root_dir/etc partitionN
将分区放回映像
dd if=partitionN of=image seek=offset_of_partition_N count=size_of_partition_N bs=512 conv=sparse,notrunc
我们将映像中的第一个分区作为启动分区,其中包含“boot”文件夹,一旦启动,它将被挂载在 /boot 下。
而且这个引导分区是一个EFI兼容的分区(实际上看起来是FAT32格式),因为我们的项目需要它是这样的。
但是在将所有分区成功填充到映像中后,我找不到为此可启动映像安装 grub 的方法。这是使该映像可启动所需的最该死的重要步骤。
我在网上找到的所有解决方案都建议循环挂载映像的引导分区,我不能这样做,因为没有 root 权限我无法循环挂载映像。
那么有人知道如何做到这一点吗?
我试图了解 grub 如何将原始值写入 mbr,以及如何从 mbr 中的值中找到 stage1 和 stage2,以及如何在 stage2 的第一个扇区末尾找出扇区列表,但这太疯狂了,我最终未能得到这个技巧工作。