優化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使用體驗差距很大。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章