我正在做一个需要生成vm映像文件的项目,然后将其用作qemu可启动磁盘映像。以前,我们的产品就像一个改进的Linux系统,制作成USB安装驱动器,然后启动并安装到裸机上。但现在我们想要摆脱硬件并在虚拟机中运行它,这就是我们需要图像文件的原因。
不是使用现有的USB驱动器在qemu中安装系统然后关闭虚拟机并获取图像,我们被要求直接制作一个开箱即用的图像文件,并跳过所有启动和安装在真机或虚拟机上,但仍然可以获得已安装的映像,这样我们就可以提供此映像,人们可以将此映像作为即用型虚拟机映像加载。
但在所有程序中,我不能使用任何需要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格式),因为我们的项目需要这样。
BUT 在将所有分区成功填充到映像中之后,我找不到为此可引导映像安装grub的方法。 这是使该图像可启动所需的最重要的步骤。
我在网上找到的所有解决方案都建议循环安装映像的启动分区,这是我无法做到的,因为没有root权限我无法循环挂载映像。
我试着理解grub如何将原始值写入mbr,以及如何从mbr中的值中找到stage1和stage2,以及如何在stage2的第一个扇区结束时找出扇区列表,但是& #39;太疯狂了,我最终没能得到这个技巧。