内核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等的配置文件来维护。
- 内核efi stub loader
- EFI OS LOADER
- stub
- EFI
- efi
- OpenCL ICD Loader运行测试暨解决报错:ERROR: App log and stub log differ.
- 内核雏形——从Loader到内核
- stub函数
- stub 例子
- Documentation_i2c_i2c-stub
- 什么是stub?
- junit--stub
- 什么是stub?
- stub函数
- 了解EFI
- EFI LIST
- efi入门
- EFI LIST
- iOS8 定位服务
- 100万拍卖公司转让----新拍卖公司注册—邢雪寒I50-I045-8872
- 网络检测分析工具Colasoft Capsa Free V7.7.2 官方版
- msdn帮助,离线下载
- 中介者模式 python
- 内核efi stub loader
- union_set
- 第十二周项目3-日期时间类
- js表单印证
- HDU 4069 Squiggly Sudoku DLX 精确覆盖
- spring各种邮件发送
- 用 Servlet 进行上载的原理和实现
- 【30秒】android模拟器获取ROOT权限!!!安卓
- AppDelegate.m 介绍