如何从源代码构建 grub2 引导加载程序并使用 qemu 模拟器对其进行测试

Posted

技术标签:

【中文标题】如何从源代码构建 grub2 引导加载程序并使用 qemu 模拟器对其进行测试【英文标题】:how to build grub2 bootloader from it's source and test it with qemu emulator 【发布时间】:2015-10-26 06:30:21 【问题描述】:

我想知道如何从 ubuntu 中的源代码构建 grub 2 引导加载程序并使用 qemu 模拟器对其进行测试。

我还想在新版本中更改 grub2 bootloader 的默认背景图片?

这可能吗?如果是,如何?

【问题讨论】:

更改背景图像不是编程任务,因此您可以在 superuser.com 上询问这部分问题。 您可以在/etc/default/grub 中使用类似的命令:GRUB_BACKGROUND="/usr/share/grub/themes/Tuxkiller2/1600x900-TuxRestingOnWindowsTB.png" 将提供背景图像。 GRUB_THEME="/usr/share/grub/themes/Tuxkiller2/theme.txt" 将为您提供带有背景图像、图标、自定义字体、菜单边框、项目边框等的图形菜单。 【参考方案1】:

当然可以。

如GRUB website 所示,grub 源代码可通过 git 从 git.savannah.gnu.org 获得。

那么理论上只是一个问题

$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

但是,根据您的平台,grub 的默认目标平台可能是也可能不是您想要的。因此,您需要决定要在 QEMU 中使用哪个固件平台,具体取决于您的架构,可能类似于

(电脑)Bios 核心引导 (U)EFI ieee1275(开放固件) u-boot

您提到的 Ubuntu 至少与上述 3 个可能的选项相匹配,但我会很无聊并假设您的意思是 x86_64/amd64。由于您将在 QEMU 下运行 GRUB,因此您的物理计算机正在运行两个可能的平台(“pc”或“efi”)中的哪一个并不重要。所以,让我们活下去,选择 (U)EFI 变体。

在配置和构建之前,您需要安装一些先决条件,所以

$ sudo apt-get install build-essential autoconf automake
$ sudo apt-get build-dep grub-efi-amd64

所以一个实际的构建可能看起来有点像这样:

$ # Next command is optionnal (languages):
$ ./linguas.sh
$ ./autogen.sh
$ # Next parameters are optionnal:
$ ./configure --prefix=$HOME/local --platform=efi
$ make
$ # Next command is optionnal:
$ make check
$ make install

获取正常运行的 GRUB 映像的最简单方法可能是使用 grub-mkstandalone 命令:

$ $HOME/local/bin/grub-mkstandalone -O x86_64-efi -o mygrub.efi

注意:要在/dev/sda 磁盘(而不是 QEMU)上安装 grub,请使用:

$ sudo grub-install /dev/sda

注意:如果您在引导时没有看到 GRUB 菜单,请检查 this question。它涉及在启动或编辑/etc/default/grub 时按Shift 来评论GRUB_HIDDEN_TIMEOUT

然后您需要某种 UEFI 映像才能在 QEMU 下运行。 x86 的默认选择称为 OVMF,是 Tianocore EDK2 的一部分 - UEFI 的事实上的开源实现。由于重新分发 FAT 文件系统驱动程序的法律技术问题,许多 Linux 发行版(包括 Ubuntu)不包含预构建的发行版。不过不用担心,自己构建一个非常简单。

但是,我不会让这个答案比我已经知道的更离题,所以我要说的是阅读the OVMF README 并查看one 或two 只是稍微过时了关于它的博客文章。

【讨论】:

感谢您的回答。但我也想知道,是否可以自定义 grub 代码,例如删除多引导功能。如果是,请给我一个相对来源。 忘记设置--prefix 会导致错误./grub-install : error : /usr/local/lib/grub/i386-pc/modinfo.sh 或类似错误。 @KrisWebDev:现在才注意到你的编辑。那些不是更适合作为单独的答案吗? @WinEunuuchs2Unix:嗯,总有 grub 开发邮件列表存档 - lists.gnu.org/archive/html/grub-devel。 一个小细节,应该是:./configure --prefix=$PWD/_install --**with-**platform=efi

以上是关于如何从源代码构建 grub2 引导加载程序并使用 qemu 模拟器对其进行测试的主要内容,如果未能解决你的问题,请参考以下文章

grub2和systemd

Hello world!让 grub2 引导自己的操作系统 Xos 内核

从 GRUB2 多重引导信息结构中获取总可用 RAM

如何加快opensuse studio的启动并显示启动信息

CentOS7启动流程

使用 webpack 为 vue 加载引导程序