前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >优化Linux bootloader速度的究极之路:从GRUB到EFI Stub

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

作者头像
战神伽罗
发布2020-08-11 16:24:41
3.1K0
发布2020-08-11 16:24:41
举报

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使用体验差距很大。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实战EFI Stub
  • EFI stub的缺点
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档