2

我正在做一个需要生成 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 的第一个扇区末尾找出扇区列表,但这太疯狂了,我最终未能得到这个技巧工作。

4

1 回答 1

0

警告:这不是一个完整的解决方案,但是我会发布,因为没有其他人回答。

我从来没有尝试过这样做,也没有几个小时的空闲时间来测试它,但是 OpenWrt 项目有标准的 x64 磁盘映像文件,包括 Grub 和内核,你可以在这里找到:

https://downloads.openwrt.org/chaos_calmer/15.05.1/x86/64/openwrt-15.05.1-x86-64-combined-ext4.img.gz

说明告诉您如何为 VMWare 转换图像,对于 Qemu 它必须类似:

https://wiki.openwrt.org/doc/howto/vmware

问题是,OpenWrt 的理念一直是不应该以 root 身份进行构建,而且它通常拒绝以 root 身份构建,所以我想你会发现他们有办法创建带有 MBR 和 Grub 的 EXT4 文件系统映像。我只测试过嵌入式平台,从未真正从 x86 的源代码构建,但如果你遇到困难,这就是你应该开始的地方。

当然,OpenWrt 磁盘只有一个分区,我不确定如何创建具有更复杂分区表的虚拟磁盘,但也许 OpenWrt 使用的工具中有一些选项。

于 2016-12-05T15:39:20.280 回答