专栏首页Eureka伽罗的技术时光轴优化Linux bootloader速度的究极之路:从GRUB到EFI Stub

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

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. 配置内核

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

make menuconfig

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

4. 编译内核和ramdisk

编译内核:

sudo make && make modules_install

生成ramdisk

sudo mkinitramfs -o /boot/initrd.img

5.拷贝Linux内核和ramdisk

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

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 条评论
登录 后参与评论

相关文章

  • Linux调试工具

    Printf(“valriable x has value = %d\n”, x)

    战神伽罗
  • 如何解决远程桌面连接时提示发生身份验证错误?

    服务器上安装了两台windows server 2016,但是这两天通过远程桌面连接时会提示发送身份验证错误,要求的函数不受支持。经过一番查询,解决了这个问题,...

    战神伽罗
  • VS2017开发Linux平台上的程序

    重装系统后安装VS2015时卡住了,于是试试看VS2017怎样,听说还支持调Linux。发现VS2017跟12/13/15又有了新的飞跃,竟然支持模块化下载,对...

    战神伽罗
  • 微软发布新工具,有助于在Windows 10上运行Linux系统

    微软周一发布了一款工具,有助于 Linux 爱好者将 Linux 发行版移植到一个 Windows 10 组件(Linux 子系统 WSL)中,进而在现行版的 ...

    FB客服
  • 【系统】使用新的开源工具将你自己的Linux带到Windows

    AiTechYun 编辑:nanan ? 如果现成的Linux发行版不会让你满意,那么为什么不自己创建呢? 从Ubuntu(一种Linux操作系统)开始之后,微...

    AiTechYun
  • 雕刻在NT内核中的LINUS故事

    曾经一度,微软把Linux看作危险的异类,想将其扼杀在摇篮之中。而如今,摇身一变,化敌为友,微软是LINUX Foundation的铂金级别会员。

    Linux阅码场
  • Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux

    今天,安装Windows 10测试版本号19603的用户发现,系统里WSL (Windows中的Linux子系统)的文件夹,居然可以用文件管理器直接访问了,而且...

    用户6543014
  • Linux Shell编程与编辑器使用详解

    本书由浅入深,全面、系统地介绍了Linux技术,书中提供了大量实例,供读者实战演练。另外,本书有很多关于Linux下的命令操作内容,所以对于每个命令、每个管理设...

    用户3157710
  • Ubuntu Desktop开发生产环境搭建

    Ubuntu Desktop开发生产环境搭建 1   开发生产环境搭建 在本节内容开始前,先定义一下使用场合,没有哪种系统或者设备是万能的,都有它的优点和缺点,...

    用户1170933
  • Windows操作系统远程Linux服务器传输文件方法(以EasyDSS云平台、EasyNVR上传部署为例)

    之前给客户部署我们一款EasyDSS云平台(配合EasyNVR实现公网按需无插件直播),客户提供的使Linux服务器,本人长期使用Windows系统。发现使用x...

    EasyNVR

扫码关注云+社区

领取腾讯云代金券