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/任何问题仍然存在。
由于您正在启动 netinst,因此您可以完全跳过 ISO 并直接从 USB 文件系统启动内核+initrd 。这是一个网络引导 di,它只会从 debian 存储库加载其余组件。
关于 iso 搜索,过程如下:
iso-scan/filename提供的(另请参阅安装文档中的第 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=manual和shared/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 或其他发行版的提示