如何为 Debian Netinst(撰写时为 8.2)编写 grub.cfg 菜单项以通过 USB 引导?

如何为 Debian Netinst(撰写时为 8.2)编写 grub.cfg 菜单项以通过 USB 引导?

我将多个 Linux 发行版保存在 USB 记忆棒上,并通过简单地为每个发行版编写 grub.cfg 条目来管理它们。其他发行版我保留在棒启动上并运行得很好,但我(似乎还有其他人)Debian Jessie (8.x) 开始出现问题。 Debian Netinst 将启动到 debian-installercurses 界面,但随后尝试搜索正确的 debian iso 文件,即使 grub.cfg 的内核行中给出了 iso 路径。

我尝试从 USB 记忆棒启动“debian-8.2.0-amd64-i386-netinst.iso”已部分成功。我首先使用以下命令设置我的 USB 记忆棒在 ArchWiki 上找到的 USB 多重启动指令

下面是 USB 记忆棒的简化文件和文件夹结构,后面是相关的 grub.cfg 条目。

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

        ----iso/
            ----debian/
                ----debian-8.2.0-amd64-i386-netinst.iso
                ----initrd.gz (special initrd)

虽然 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
}

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

initrd ${initrdfile}

使 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

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

iso-scan/filename=${isofile}
findiso=${imgdevpath}/${isofile}
findiso=${isofile}

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

答案1

由于您正在启动 netinst,因此您可以完全跳过 ISO 并启动内核+initrd直接来自您的 USB 文件系统。这是一个网络引导 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
}

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

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

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

答案2

尝试这个解决方案。

编辑您的grub.cfg文件以匹配您的mini.iso.每个mini.iso建筑都是独一无二的。

menuentry "Debian Stable | Testing | Experimental  AMD64 Netinst" {
    set isoname="mini.iso"
    set isopath="/boot/iso/debian/amd64"
    set isofile="${isopath}/${isoname}"
    echo "Using ${isoname}..."
    loopback loop $isofile
    linux (loop)/linux priority=low vga=788 ---
    initrd (loop)/initrd.gz
}

menuentry "Debian Stable | Testing | Experimental i386 Netinst" {
    set isoname="mini.iso"
    set isopath="/boot/iso/debian/i386"
    set isofile="${isopath}/${isoname}"
    echo "Using ${isoname}..."
    loopback loop $isofile
    linux (loop)/linux priority=low vga=788 ---
    initrd (loop)/initrd.gz
}

在此处下载mini.iso与您的架构相匹配的版本。

祝你好运。

相关内容