我的主板是以下型号,具有最新的 BIOS:https://www.asus.com/us/Motherboards/CROSSHAIR_V_FORMULAZ/
我按照 Arch Linux 的标准说明配置 EFI,使用内核作为 EFISTUB 进行引导。这对我来说在同样的硬件上运行良好已有一年多,但当我尝试更改内核参数时,似乎出现了问题。所有常用方法都不起作用。
首先我尝试使用以下命令使用 efibootmgr:
efibootmgr -d /dev/sda -p 1 -b 0000 -g -c -l \vmlinuz-linux -L "Linux" -u "root=/dev/mapper/default-root rw initrd=initramfs-linux.img"
这添加了以下条目显示使用efibootmgr -v
Boot0000* Linux HD(1,GPT,76dd039b-764a-4b07-81ed-61921dfdab62,0x800,0x800)/File(\vmlinuz-linux)r.o.o.t.=./.d.e.v./.m.a.p.p.e.r./.d.e.f.a.u.l.t.-.r.o.o.t. .r.w. .i.n.i.t.r.d.=./.i.n.i.t.r.a.m.f.s.-.l.i.n.u.x...i.m.g.
当我尝试启动此项时,出现 BIOS 级别错误,提示找不到可启动设备。
接下来我尝试使用bcfg
live CD 的 UEFI shell v2 中的工具。
为此,我必须创建一个 kernel-opts 文本文件,/boot
因此我执行了以下步骤。
echo "boot=/dev/mapper/default-root rw initrd=initramfs-linux.img > /boot/kernel-opts
然后,我从实时 CD 启动了 UEFI Shell v2,并在 shell 中执行以下操作。
bcfg boot add 0 fs1:\vmlinuz-linux "Arch Linux"
bcfg boot -opt 0 fs1:\kernel-opts
我再次使用efibootmgr -v
检查了新条目。
Boot0000* Arch Linux PciRoot(0x0)/Pci(0x4,0x0)/Pci(0x0,0x0)/Sata(0,65535,0)/HD(2,GPT,5cec78ae-39af-4434-9b57-9c08b8032147,0x1000,0x200000)/File(\vmlinuz-linux)root=/dev/mapper/default-root rw initrd=\initramfs-linux.img
这次启动时检测到启动设备,但是当找不到根文件系统时,就会发生内核恐慌。
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.11.3-1-ARCH #1
我得出的结论是,bcfg
第一部分(内核的位置)是正确的,但参数不正确,具体原因是它们未使用 unicode 编码。我为每个工具尝试了几种参数变体,但无法让其他工具按原样工作。
答案1
最终我找到了解决方案,但感觉像是一种黑客行为。我只是想在这里发布它以供其他人参考,直到出现更好的解决方案。
通过将问题中的 kernel-opts 文件转换为 UTF-16(unicode)并使用它,我能够解决问题。我还必须删除转换后文件的前两个字节;不确定为什么 iconv 会添加这些字节。我使用以下命令转换为 UTF-16。
iconv -f ASCII -t UTF-16 kernel-opts | dd bs=1 skip=2 > kernel-opts-unicode
接下来我删除了旧的启动项,启动回 Live CD 的 UEFI Shell v2 并执行以下命令。
bcfg boot add 0 fs1:\vmlinuz-linux "Arch Linux"
bcfg boot -opt 0 fs1:\kernel-opts-unicode
根据以下结果,产生了以下条目efibootmgr -v
Boot0000* Arch Linux PciRoot(0x0)/Pci(0x4,0x0)/Pci(0x0,0x0)/Sata(1,65535,0)/HD(2,GPT,e5f7abe4-75bf-4c63-a76b-504c17eb5460,0x1000,0x200000)/File(\vmlinuz-linux)r.o.o.t.=./.d.e.v./.m.a.p.p.e.r./.d.e.f.a.u.l.t.-.r.o.o.t. .r.w. .i.n.i.t.r.d.=.\.i.n.i.t.r.a.m.f.s.-.l.i.n.u.x...i.m.g.
然后系统就能启动,没有任何警告或错误。