我将多个 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=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
}
请注意,我还没有真正测试过这一点,我是从旧版 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
与您的架构相匹配的版本。
祝你好运。