最近换了电脑,以前的老电脑使用的是旧BIOS
架构启动,新电脑都变成了新的BIOS
架构即UEFI
启动(UEFI
是新BIOS
架构,自从UEFI
出来之后,老的BIOS
架构便被称为legacy
),在安装grub
时比之前稍微麻烦了一点。
准备
参考教程:https://wiki.archlinux.org/index.php/GRUB
虽然Arch
的wiki有简体中文的翻译,但是一定要看英文的!!!中文的翻译不能与时俱进,而且很多地方都翻译的不好,甚至翻译错了……本页面就是一个很典型的按照中文装系统会装错的例子……
先简单知道几个必要的名词:
UEFI
: Unified Extensible Firmware Interface,统一可扩展固件界面,提供了启动操作系统的标准环境。ESP
: EFI System Partition,EFI分区。GPT
: GUID Partition Table,GUID分区表,是UEFI标准的一部分,使用GUID/UUID来标识分区等。
在磁盘上安装grub
,就是将此磁盘作为启动盘。想使用EFI
启动,一定要在这一块磁盘上有EFI
的系统分区(EFI System Partition, 即ESP
)。因此,找到这个分区就是其中的关键。
安装步骤
- 安装
grub
和efibootmgr
:
pacman -S grub efibootmgr
- 寻找
ESP
:
非常重要,一定要找到自己想要安装grub
的磁盘的EFI
分区,即ESP
。对于双系统来说,基本上这个分区是已经存在的。对于我来说,Windows10装在了sda
盘上,因此可以使用:
parted /dev/sda print
查看sda盘的分区信息,可以看到输出有Partition Table: gpt
字段,而且/dev/sda1
的flag
字段下有boot
标记,可以确定这就是EFI
分区。另外,根据wiki描述,这个分区一般都是fat32/vfat
格式,vfat
就是Windows下常说的fat64
。
- 安装
grub
:
安装grub
的时候一定要将grub
安装在刚刚找到的EF
I分区上。
先挂载EFI
分区:
mkdir /boot/myefi
mount /dev/sda1 /boot/myefi
安装(64位CPU架构):
grub-install --target=x86_64-efi --efi-directory=/boot/myefi --bootloader-id=pikachu
--bootloader-id
参数可以随便设置,比如pikachu
,装完之后就可以在/boot/myefi/EFI/
下找到pikachu
文件夹,里面有生成的启动文件。
- 生成
grub
配置:
安装好之后,grub
还需要被配置一下才能生效,要不然还是不能使用。对于双系统,还需要让grub
找到机器上存在的Windows,以便在开机时选择想要进入的系统。
为了检测其他系统,需要安装os-prober
:
pacman -S os-prober
自动配置grub
:
grub-mkconfig -o /boot/grub/grub.cfg
- (可选)其他
grub
配置:
如果还想让grub
更漂亮,添加背景图片,或者修改一下启动顺序之类的,可以修改grub
的配置文件,这个属于额外的操作,也比较简单。
遇到的问题
在安装grub
的时候,系统报错:EFI variables are not supported on this system
,重启电脑,果然安装失败,无法进入系统。只能再次通过Arch
安装盘进入系统,进行问题修复。
解决方式
根据Arch论坛的一篇求助帖,发现需要在开机的设置选项里,将legacy
的所有启用都关掉,只使用UEFI
启动,才能成功。
对于我来讲,我发现虽然我已经在开机启动项里将启动方式设置为了UEFI
,但是Boot->Legacy Option Roms
仍然为Enabled
,设置为Disabled
。
试了一下,确实好了。
原因
正如开篇所说,BIOS
分为legacy
和UEFI
两种。现在存在UEFI + legacy
的模式,这是为了让某些不支持UEFI
的电脑也能正常使用传统的BIOS
引导模式启动,而我们此时是在安装EFI
的启动方式,因此一旦设备是通过legacy
模式启动的,就会报错“EFI
变量不被系统支持”。