内核efi stub loader

来源:互联网 发布:淘宝开店需要什么工具 编辑:程序博客网 时间:2024/06/07 06:30

1 原文地址

http://www.rodsbooks.com/efi-bootloaders/efistub.html

2 何时使用kernel的EFI stub loader

Linux kernel的EFI stub loader拥有一系列独特的特性,有些是好的,有些是不好的,有些则介于二者之间。

在某些情况下,由于EFI boot loader是内建在kernel中的,kernel就必须放在一个EFI可以第七的分区 – ESP. 当使用ELILO的时候,这可能会增加对ESP size的需求。你也可以通过使用第二个FAT分区或者EFI文件系统驱动来绕开这个问题。

如果在一个使用自己的stub loader启动的kernel时使用initial RAN disk(initrd), EFI也必须像kernel一样能够读到他,这同样会增加ESP的size。

你会需要一些kernel参数,例如initrd的名字或者跟文件系统的位置等。你可以在编译时将他们内嵌到kernel中,也可以在EFI shell的命令行中输入,或者通过boot manager传递。但是并不是所有的boot manager都支持任意参数传递的。例如rEFIt.

从EFI直接启动kernel理论上可以提升kernel初始化硬件的能力。

EFI stub loader已经添加到了3.3.0kernel中。更早版本的kernel如果需要次功能则需要添加patch。在2013年初。Fedora17,opensuse12.2,Ubuntu12.10都发布了支持EFI stub loader的kernel。

但是这种方法的可靠性未知。

有些用户会出现kernel终止的情况。这时kernel会hung。这种问题出现的情况不定,需要开发者注意。

使用kernel EFI stub的情况会在大多数较新的发行版上良好运行,但是3.7.x和3.8.x的kernel曾经回报过一些问题。EFI stub loader和rEFInd或者gummiboot两个启动管理器的配合较好,这两个可以在启动时指定一些kernel需要的额外的Linux参数。排除了每次启动都要手动输入参数的麻烦。

3 安装EFI stub loader

3.1 编译

安装EFI stub loader需要配置和编译3.3.0以上版本的kernel。编译时需要注意下面的选项:

CONFIG_EFI_STUB位置:Processor Type and Features -->     EFI Runtime Service Support -->         EFI Stub Support

要是用EFI stub bootloader必须enabnle此选项。

CONFIG_CMDLINE_BOOL 以及 CONFIG_CMDLINE用来预置kernel命令行参数。

3.2 安装

编译完成后,先安装kernel模块(make modules_install)和创建initrd(mkinitrd命令)。然后将kernel和initrd copy到ESP。

4 配置和应用EFI stub loader

The kernel’s stub loader requires no configuration perse, although building options into it may be desirable in some cases.当编译时没有包含参数时,你必须知道如果通过boot loader的命令行将之传递,同时,如果有ramdisk的话,也必须一并传递。下面的命令是在EFI shell中的命令行传递

fs0:>bzImage.efi root=/dev/sda4 ro initrd=\EFI\linux\initrd.img

这是一个小例子。假定你调用的kernel文件是bzImage.efi, 而你的跟文件系统是/dev/sda4, initial ram disk是位于ESP的EFI/linux/initrd.img文件。这里ro选项告诉Linux以只读方式挂载(这是标准,init脚本会在稍后以读写方式remount)。这里需要注意的是,root= 参数采用的是Linux风格的路径分割符(/),而initrd= 选项采用的是EFI风格的路径分割符(\)。这一点非常重要,一个错误的initrd= 参数可能导致kernel hang掉,而在较早的EFI stub loader中(3.3.0到3.4.0),这个错误甚至没有错误提示信息。而较新的版本(3.6.0之后,或者一部分的3.5.x版本的kernel)会在无法读取initrd文件的时候显示一个错误信息。

EFI的实现包含了自己的启动管理,但是通常都比较原始。如果你的启动管理能够让你选择一个boot loader,或者如果仅仅使用一个kernel去启动就能够满足你的需求的话,也可以使用Linux的efibootmgr来设置,例如

# efibootmgr -c -d /dev/sda -p 1 -L "XXX Linux" -l '\EFI\linux\vmlinuz.efi' -u root=/dev/sda3 ro initrd=EFI/linux/initrd.img

这个命令告诉EFI去启动\EFI\linux\vmlinuz.efi文件通过 -u 选项来指示后面的参数。如果你的ESP是/dev/sda1的话,理论上,-d 和 -p选项可以不需要, 他们可以用来只是任意一个分区作为ESP。如果你的EFI实现支持多菜单启动的话,你也可以通过多次调用这个命令来创建启动项启动不同的kernel、发行版或者不同的选项。

如果你使用一个独立的EFI启动管理器,例如rEFInd或者gummiboot, 你可以研究其配置来传递kernel需要的参数。而这在rEFIt中是不可能的。

理论上,你可以通过GRUB legacy或者GRUB2的chainloader选项而不是kernel或者linux选项来启动一个编译时包含了EFI stub支持的kernel。如果你在硬件初始化部分出现一个问题的话,使用chainloader可能会有一些优势,不过这有待确认。

EFI驱动对于ext2fs/ext3fs, ext4fs, ReiserFS都是可以支持的,因此从一个Linux文件系统中加载一个支持EFI stub支持的kernel也是可行的。这可以通过一个简单的环境变量配置实现,因此不必将kernel copy到ESP,当然你可能需要将之重命名并创建一个.efi后缀的kernel链接。

5 维护kernel的EFI stub loader

当前的大多是发行版都没有支持EFI stub loader,你需要自己编译和维护。未来,这些发行版可能会通过eibootmgr或者其他工具来维护使用这种方式的安装,或者通过维护GRUB,rEFLnd,gummiboot等的配置文件来维护。

0 0
原创粉丝点击