优化Linux bootloader速度的究极之路:从GRUB到EFI Stub

2020-08-11 16:24:41 浏览数 (1)

Linux著名的GRUB已立n代,2.0以后已经是最受欢迎的bootloader,很多Linux发行版都用它作为缺省的bootloader。GRUB2功能强大,全面支持UEFI启动,甚至是安全启动,实在是行走江湖、杀人越货的必备武器。但于此同时,强大的功能让它越发臃肿,为Linux快速启动带来了负面影响。

实际上GRUB在UEFI启动时,它被编译成了UEFI的App,它和其他的bootloader都被放在UEFI启动分区ESP中。ESP中的内容大概是这样的:

启动过程大概是:

UEFI==>GRUB==>Linux kernel

GRUB在其中主要扮演了:

1. 它带有的驱动可以找到在ESP之外的kernel和ramdisk。

2. 选择boot option界面和扩展功能

3. 传递启动参数(Boot Parameters)给Linux内核。

其实Linux本身很早就加入了UEFI的支持(Kernel 3.3),叫做EFI Stub。通过它,Linux内核可以被直接被编译成UEFI的app,可以直接被UEFI固件识别和启动,完全不需要借助第三方bootloader了。下面我们一起来实践一下。

实战EFI Stub

现在的虚拟机VMWare和VBOX都全面支持了UEFI,通过它们可以很方便的实验EFI Stub。需要注意的是它们缺省UEFI启动都是关闭的,我们要单独打开。下面我们以VMWare为例,VBOX的操作也十分类似。

1. 创建新的虚拟机

除了注意在虚拟机里面开启UEFI外:

其他要注意的是因为我们需要重新编译内核,所以磁盘大小最好大于4G,内存大于2G。

2. 安装ubuntu和下载Linux内核源代码

正常安装ubuntu,需要选择12.04以后的版本,我安装的是16.04 LTS 桌面版。安装完后GCC等编译工具链也一并安装完毕。

安装完毕后下载Linux内核源码,我下载的是4.9.44。你也可以选择不同的版本。

3. 配置内核

按照一般方法解压内核,准备开始编译内核:

代码语言:javascript复制
make menuconfig

这时你如果是新装的ubuntu,可能会出错,大家可以google一下,很好解决。下面是重点:开启EFI Stub。EFI stub的位置在

4. 编译内核和ramdisk

编译内核:

代码语言:javascript复制
sudo make && make modules_install

生成ramdisk

代码语言:javascript复制
sudo mkinitramfs -o /boot/initrd.img

5.拷贝Linux内核和ramdisk

将生成的Linux kernel改名*.efi。

代码语言:javascript复制
sudo cp /usr/src/linux/arch/x86_64/boot/bzImage linux.efi

为实验起见,将U盘mount到虚拟机,将linux.efi 和initrd.img拷贝到U盘根目录。

6.开始实验

重启虚拟机,在VMWare的logo出现后狂按F2,进入UEFI设置界面,选择进入Shell,如下:

随后进入Shell

手动启动Linux

我们这里直接运行被编译为linux.efi的Linux内核,同时传人ramdisk和rootfs的位置。一切正常的话结果如下:

Linux启动正常,但没有发现rootfs

7. 一些改进

没有发现rootfs是因为没有在设置内核的时候加入LSI的驱动。在加入后并调整到正确的sda后一切正常了。然后就可以将这两个文件copy到ESP中,U盘就不需要了。

8. Tips

A. 如果每次boot都要输入这么一大串字符,那真是太麻烦了。实际上我们可以在配置内核的时候打开build-in kernel command line将这些boot parameters都加进去。

B. 可以用efibootmgr添加一条我们专门的启动项,这样就可以直接boot了。

EFI stub的缺点

没有了GRUB的等待直接启动Linux当然可以速度飞快,这也是目前很多嵌入式Linux的做法,他们还通过精简编译选项将kernel调整的很小,ramdisk也很小甚至没有。这样Linux甚至可以被包含在UEFI固件中,用来提供一些高级功能。但用EFI stub也有自己的缺点,主要是:

1. Linux内核和ramdisk要放在ESP中。大家可以看到我的例子里面Linux内核和ramdisk加起来有将近50MB,这对通常很小的ESP造成了很大挑战。GRUB因为自带EXT4等等驱动就灵活很多。有些OEM厂商通过加载UEFI的NTFS或者EXT4驱动来解决这个问题。

2. 每次内核和ramdisk升级都要手工copy过去,这和GRUB等的make install使用体验差距很大。

0 人点赞