我正在尝试将 Arch linux 安装到新的(非常糟糕的)HP Pavillion 15 笔记本电脑上。
这是一台基于 UEFI 的机器。经过几次摆动后,我已经走得很远了。传统模式在系统设置中被禁用,我已经通过 EFI 引导到我刻录的 Arch DVD,并通过 Arch初学者指南和更高级的安装指南进行到我安装 grub 的地步。
在chroot
ed 时,我执行:
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
Run Code Online (Sandbox Code Playgroud)
这会发出大量输出,包括:
此系统不支持 EFI 变量
我第一次到这一步时,我继续安装,不知道这是否是一个实际问题。原来是这样,因为当我重新启动机器时,找不到可启动的媒体,机器拒绝启动。那时我可以进入 UEFI 设置菜单并选择要启动的 EFI 文件,然后 Arch Linux 就会启动。
但我现在要回去重新安装,试图解决上述问题。
如何让 GRUB 正确安装?
Joh*_*ing 32
问题只是efivarfs
没有加载内核模块。
这可以通过以下方式确认:
sh-4.2# efivar-tester
UEFI variables are not supported on this machine.
Run Code Online (Sandbox Code Playgroud)
如果您chroot
进入新安装,exit
退出,然后启用efivarfs
:
exit
modprobe efivarfs
Run Code Online (Sandbox Code Playgroud)
(efivarfs
曾经是efivars
,所以如果返回错误,请尝试modprobe efivars
)
...然后chroot
返回。就我而言,这意味着:
chroot /mnt
但你应该chroot
像以前一样。
重新进入后,再次测试:
efivar-tester
这样就不会再报错了,可以像之前一样安装grub了。
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
Run Code Online (Sandbox Code Playgroud)
小智 20
如果您使用旧版而不是 UEFI 方法启动,您将收到此错误。您需要确保在 BIOS 菜单中选择 UEFI 引导项,或选择 UEFI 作为默认引导方法。
小智 17
我知道,这是非常古老的线程,但也许会对某人有所帮助。大多数指南都建议在 chroot 之前安装虚拟文件系统的相同解决方案:
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
Run Code Online (Sandbox Code Playgroud)
但是现在(可能与 efivars/efivarfs 更改有关)此循环跳过了一个非常特殊的子挂载点 - /sys/firmware/efi/efivars
并且 efibootmgr/grub 失败。
所以改用这一行:
for i in /dev /dev/pts /proc /sys /sys/firmware/efi/efivars /run; do sudo mount -B $i /mnt$i; done
Run Code Online (Sandbox Code Playgroud)
实际成功案例:带有 4.9.0-5(efivars)的 Debian 由 Arch Linux live cd(选择只是因为可以启动 uefi 开箱即用)和 4.14.9-1-ARCH(efivarfs)仅通过绑定安装 /sys /固件/efi/efivars
运行 Fedora 27,我需要安装efivarfs
. 我在 chrootfs 中执行了此操作,但这仍然不起作用,因为启动条目显示为efibootmgr
- 但重新启动后,它既没有启动,也没有在回到实时操作系统中显示。
最终起作用的是,从实时介质中使用 grub,进入 shell,然后输入
linuxefi /vmlinuz-<version> root=/dev/mapper/luks-<uuid> ro
initrdefi /initramfs-<version>.img
boot
从正常启动的操作系统,我可以grub2-install
在没有 的情况下运行chroot
,并且有效。
我不确定这是否只是我的 BIOS 的问题,或者还有更普遍的错误,但这就是运行时grub2-install
没有报告任何错误的原因。
# Open encrypted root partion
cryptsetup luksOpen /dev/sda4 a4
mount /dev/mapper/a4 /mnt
mount /dev/sda2 /mnt/boot
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev
mount -t devpts pts /mnt/dev/pts/
mount -o bind /etc/resolv.conf /mnt/etc/resolv.conf
chroot /mnt
# run inside the chroot:
mount /dev/sda1 /boot/efi
mount -t efivarfs efivarfs /sys/firmware/efi/efivars
grub2-install
小智 6
经过一番折腾,终于找到了解决办法。就我而言,我在 EFI 系统上自定义编译并安装了 preempt-rt 内核(5.6.19-rt11(已修补))。
发现的问题是 preempt-rt 内核没有激活 efi 运行时,因此出现错误。
解决方案很简单:
添加efi=runtime
到 /etc/default/grub 配置中的内核参数。
GRUB_CMDLINE_LINUX_DEFAULT="efi=runtime quiet"
Run Code Online (Sandbox Code Playgroud)
别忘了sudo update-grub2
!
归档时间: |
|
查看次数: |
143450 次 |
最近记录: |