您如何为 Debian Netinst(编写时为 8.2)编写 grub.cfg 菜单项以通过 USB 启动?

Yan*_*kee 5 linux grub boot debian debian-installer

我在 U 盘上保存了几个 Linux 发行版,并通过简单地为每个发行版编写 grub.cfg 条目来管理它们。其他发行版我继续使用棒启动并运行得很好,但我(和其他人,似乎)开始在使用 Debian Jessie (8.x) 时遇到问题。Debian Netinst 将引导至 debian-installer curses 界面,但随后会尝试搜索正确的 debian iso 文件,即使在 grub.cfg 的内核行中给出了 iso 路径。

我尝试从 U 盘启动“debian-8.2.0-amd64-i386-netinst.iso”取得了部分成功。我首先使用ArchWiki 上的 USB 多重引导指令设置我的 USB 记忆棒。

这是 U 盘的简化文件和文件夹结构,后面是相关的 grub.cfg 条目。

USBROOT/
    ----boot/
        ----grub/
            ----grub.cfg
            ----(other grub paraphernalia)

        ----iso/
            ----debian/
                ----debian-8.2.0-amd64-i386-netinst.iso
                ----initrd.gz (special initrd)
Run Code Online (Sandbox Code Playgroud)

虽然iso中有一个initramfs,但由于我不太明白的原因,它不允许debian正常启动;到目前为止,我在两个链接中对其进行了简要说明。

现在我的 grub.cfg 条目。我知道这是一个 i386/amd64 多架构 iso,但为了简单起见,我将只关注 64 位部分。如果我们能弄清楚 64 位部分,我应该能够轻松地为 i386 创建另一个条目:

probe -u $root --set=rootuuid
set imgdevpath="/dev/disk/by-uuid/$rootuuid"

menuentry 'Debian 8.2 Multiarch' {
    set isoname='debian-8.2.0-amd64-i386-netinst.iso'
    set isopath='/boot/iso/debian'
    set isofile=${isopath}/${isoname}
    set initrdfile=${isopath}/initrd.gz
    loopback loop $isofile
    linux (loop)/install.amd/vmlinuz iso-scan/ask_second_pass=true iso-scan/filename=${imgdevpath}/${isofile} config quiet
    initrd ${initrdfile}/initrd.gz
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句:将 initrd 行更改为

initrd ${initrdfile}
Run Code Online (Sandbox Code Playgroud)

使 grub(我认为)抛出错误。Grub 暂停了一会儿,然后 Debian 尝试启动并立即出现内核恐慌——正如预期的那样,因为它找不到 initramfs。但是,当我完全写出块代码示例中所示的路径时,这不会发生。为什么当我用设置变量指定路径时会抛出错误,而不是手动写出完整路径时? 但我的主要问题是:

我必须提供哪些内核引导参数,以便不执行搜索并且 iso 位于我指定的路径中。安装程序最终确实通过搜索找到了正确的iso,但为什么要搜索呢?

我几乎可以肯定它与 linux 系列有关:

linux (loop)/install.amd/vmlinuz iso-scan/ask_second_pass=true iso-scan/filename=${imgdevpath}/${isofile} config quiet
Run Code Online (Sandbox Code Playgroud)

我已经尝试了至少 20 种主题变体,例如更改:

iso-scan/filename=${isofile}
findiso=${imgdevpath}/${isofile}
findiso=${isofile}
Run Code Online (Sandbox Code Playgroud)

编辑:我修复了 initrd 问题:我在定义 $initrdfile 时有单引号。findiso/iso-scan/任何问题仍然存在。

GnP*_*GnP 3

由于您正在启动 netinst,因此您可以完全跳过 ISO 并直接从 USB 文件系统启动内核+initrd 。这是一个网络引导 di,它只会从 debian 存储库加载其余组件。

关于 iso 搜索,过程如下:

  • grub 加载 ISO 并将内核和 initrd 读取到内存中(在您的情况下,initrd 已提取到 USB 驱动器)
  • grub 将控制权交给内核
  • 内核将控制权交给 initrd 的 init 脚本
  • init 脚本将控制权交给 debian-installer
  • iso -scan di 模块安装所有可用驱动器,寻找iso-scan/filename提供的
  • 一旦找到 ISO 并环回安装,debian 安装程序就会继续该过程

(另请参阅安装文档中的第 6.3.1.4 节以了解更多详细信息)

当您给出这样的路径时,/dev/disk/by-uuid/UUID/debian/debian8.iso它没有多大意义,因为/dev/disk/by-uuid/UUID它是块设备,而不是文件可以驻留的已安装文件系统。

如果您希望 iso-scan 缩小搜索范围,除了使用 iso-scan/filename 之外,您还可以预置值*shared/ask_device=manualshared/enter_device=/dev/disk/UUID(只需将它们添加到内核行中)

这应该是你的 grub.cfg:

set imgdevpath="/dev/disk/by-uuid/UUID"

menuentry 'Debian 8.2 Multiarch' {
    set isofile='/boot/iso/debian/debian-8.2.0-amd64-i386-netinst.iso'
    loopback loop $isofile
    linux (loop)/install.amd/vmlinuz iso-scan/filename=$isofile shared/ask_device=manual shared/enter_device=$imgdevpath no-prompt no-eject
    initrd (loop)/install.amd/initrd.gz
}
Run Code Online (Sandbox Code Playgroud)

请注意,我还没有真正测试过这一点,我是从旧版 debian 版本的类似设置中复制粘贴的。

我建议您从这个开始,只有当它不起作用时才尝试其他 initrd。在读取 UUID 探针之前,还要确保它“手动”工作。

* 这些是我之前所说的“提示”。我想我记得 ubuntu 或其他发行版的提示