Arch Linux UEFI 无法启动

Arch Linux UEFI 无法启动

我的主板是以下型号,具有最新的 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 级别错误,提示找不到可启动设备。

接下来我尝试使用bcfglive 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.

然后系统就能启动,没有任何警告或错误。

相关内容