如何在没有 root 权限的情况下在图像文件上安装 grub?

Posted

技术标签:

【中文标题】如何在没有 root 权限的情况下在图像文件上安装 grub?【英文标题】:How to install grub on image file WITHOUT root privilege? 【发布时间】:2016-10-29 05:27:32 【问题描述】:

我正在做一个项目,需要生成一个 vm 映像文件,然后将其用作 qemu 可启动磁盘映像。之前我们的产品就像一个修改过的linux系统,做成USB安装盘,然后开机安装成裸机。但是现在我们想摆脱硬件并在虚拟机中运行它,这就是我们需要一个映像文件的原因。

不是使用现有的USB驱动器在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 第一个扇区末尾的扇区列表,但这太疯狂了,我最终没能成功。

【问题讨论】:

既然这是一个疯狂且任意的要求,为什么不回避它呢?你知道sudo 不是魔法吗?这只是一种使用 root 权限执行某些操作的便捷方式。安装 grub 不需要sudo,但它确实需要 root 权限。例如。只需从该根 shell 运行 su 并运行 mount 感谢您的回复。对不起,“sudo”这个词引起了误解,我应该使用“root privilege”这个词。所以我的意思是如何在没有任何特权的情况下实现目标,只使用普通用户。这是否意味着没有root权限的普通用户是不可能的? 试过这个吗? normalesup.org/~george/comp/live_iso_usb @skywalker:我没有办法绕过它。我只是把项目交还给上级,说限制阻止你完成它。不要用电脑来解决公司的问题。 这个问题似乎与 help center 中定义的 Stack Overflow 无关。它可能更适合Unix & Linux Stack Exchange 站点。 【参考方案1】:

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

我从未尝试过这样做,也没有几个小时的空闲时间来测试它,但是 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 的 EXT4 文件系统映像和蛴螬。我只测试过嵌入式平台,从未真正从 x86 的源代码构建,但如果遇到困难,应该从这里开始。

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

【讨论】:

供将来参考,相应的代码在这里:dev.openwrt.org/browser/trunk/target/linux/x86/image/… 但我没有让它工作。 Grub 会启动,但不知何故永远不会显示我配置的菜单项... 文件现在位于github.com/openwrt/openwrt/blob/…。它的要点似乎是使用grub-mkimagegrub-bios-setup?

以上是关于如何在没有 root 权限的情况下在图像文件上安装 grub?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?

在没有 WRITE_EXTERNAL_STORAGE 权限的情况下在 Android 8 上使用相机

有没有办法在没有root的情况下在linux中制作键盘记录器?

如何在不刷新闪烁的情况下在浏览器中显示不断变化的图像文件?

如何在未经用户同意的情况下在ICS上安装(x509 / pk12)证书?

如何在没有 root 访问权限的情况下获取已安装应用程序的 APK?