前几天为了将archlinux gnome从X11调整为Wayland,修改grub(sudo nano /etc/default/grub),在内核参数中添加 “ibt=off“,再执行sudo grub-mkconfig -o /boot/grub/grub.cfg后重启,无法启动archlinux,直接引导到BIOS,头一次碰到这种情况。很显然,引导出了问题,好在通过F12选择Windows10可以正常启动。

  系统环境:联想老台式机,1块固态硬盘+1块机械硬盘,固态硬盘上装有win10+arch双系统,UEFI+grub引导。

  分析问题:进win10,打开diskgenius,导出arch所在ext4分区下用户名所在文件夹下的.bash_history文件,用记事本打开看最近的操作命令,作撤销准备,最后的2条命令确实是文头提到的。为了防止是此前修改的/usr/lib/udev/rules.d/61-gdm.rules和/etc/gdm/custom.conf两个文件造成的问题,我在win10下分别导出修改并重新导入再试问题依旧,确认是grub出了问题。

  解决问题:下载archlinux ISO,复制到Ventoy启动优盘启动系统,执行以下代码重新安装grub。

#用优盘上的archlinux挂载固态硬盘中archlinux,默认是root。用fdisk -l查看arch安装在哪个分区上,我的是/dev/sda5
mount /dev/sda5 /mnt
arch-chroot /mnt
#重新安装并更新grub,注意是UEFI引导不是MBR引导。期间删除此前在内核参数中加入的“ibt=off“,我不确认造成启动故障是因为加了这个参数,怀疑是更新grub时造成的其他偶发故障,当时没注意看命令执行结果就重启了。以下第一条命令非常关键,sda1是我的ESP分区,以实际情况而定。
mount /dev/sda1 /boot
grub-install --target=x86_64-efi --efi-directory=/boot  --bootloader-id=grub --recheck
#上句代码可不要“--bootloader-id=grub --recheck”
nano /etc/default/grub
grub-mkconfig -o /boot/grub/grub.cfg
#期间也许会执行下句代码,重新生成内核内存盘镜像,如果怀疑是因为升级内核造成的问题,即使执行也不会造成新问题。
mkinitcpio -P /etc/mkinitcpio.conf

   所得经验:经数十次试错,最大的收获是/boot的位置,必须先挂载再重新安装grub。无论是当时在win10中查看还是用ISO启动后查看arch所在分区的/boot文件夹,都是空的,而arch正常启动后有文件,后来才想起来安装arch的时候/boot是自动挂载的ESP分区(见下图),物理文件其实是在ESP分区上的。这是UEFI引导多系统需要注意的一个细节。其中最关键的一步是mount /dev/sda1 /boot,因为不挂载的话grub将安装在arch所在分区的/boot文件夹下,无法写入ESP分区,因ESP分区为空导致UEFI无法引导到arch所在的分区,UEFI最初引导时并不识别ext4分区,只有读取arch引导文件后才知道下一步往哪里走。此外,查看安装arch时的命令,可查看/home/root/.bash_history文件。

rhel6进入bios grub进入bios_efi

rhel6进入bios grub进入bios_grub_02