标签归档:Linux

Managing EFI Boot Loaders for Linux

2011年底,Linux内核开发人员开始研究一种新方法,用于启动基于EFI系统的Linux。该方法将Linux内核变成一个EFI应用程序。一旦被加载了,该内核将接管计算机,在严格意义上有效果地绕开/忽略启动加载器(boot loader)的需求。该方法有其独特的优缺点,这些优缺点将在本文中详细阐述。(如果你对技术的细节感兴趣,请阅读 Linux Kernel Mailing
List thread on this topic.

什么时候使用Kernel's EFI Stub
Loader

Linux 内核的EFI stub loader有很多特性,有些是正面的,有些是负面的:

   在某种意义上讲,EFI boot loader是内置于内核中的,因此内核必须是在一个EFI可以读取的分区中,通常是EFI系统分区(ESP)。就像你使用ELILO一样,这会增加ESP的尺寸要求。也可以通过使用第二个FAT分区或EFI filesystem drivers来变通的解决该问题。

   如果想使用初始化的RAM盘(initrd,并且这个盘的内核启动有自己的stub loader, 那么EFi就必须能够读取stub loader 和内核。这与正在使用ELILO一样,会增加对ESP的大小要求。

   你必须有办法将内核参数传递给内核,比如initrd的名字和root filesystem的位置。这可以通过以下方法实现:在建立内核的时候嵌入参数;或者在EFI 外壳(shell)的命令行中输入该选项;也可以通过启动管理器(boot manager)传递。但是,并不是所有的启动管理器都可以传递任意选项,比如 rEFIt就不可以。

   从理论上讲,让内核直接从EFI启动可以改善内核初始化计算机硬盘的能力。至于实际中是否有提高就是另外一回事了。

   EFI stub loader 被添加到内核3.3.0,成为3.3.0特性。如果使用较旧版本的内核, 就需要将内核做下修补。2013年初,Fedora 17OpenSUSE
12.2
Ubuntu 12.10都使用包含EFI stub loader 的内核。所以我相信其他的发行版(distribution)也会这样,但是,依然会有一些版本(对升级内核持保守态度的)会继续使用3.3.0之前的内核。当然了,该情况会随着时间的变化有所改善的。

提示:如果将日志(journaling)禁用了,就可以将Linux/boot 分区放到HFS+上。也可以在Mac的ESP上使用HFS+,这时,将日志(journaling)禁用了,从LINUX读取filesystem会更简单。这个两种不太寻常的方式都可以更简单的升级和引导EFI
stub支持的内核。但是,绝大多数版本(distribution)的安装程序不支持这个配置,所以必须在使用传统的安装方法后再建立。

   该方法的可靠性还尚不确定,但是我的最始测试结果是很乐观的-----进行了7次测试,都可以成功启动,其中只有一次出现奇怪的(也可能是很重要的)警告,发生在32位的Mac Mini上。可以从Mac OS X HFS+分区上启动LINUX kernel EFI stub loader,但是在F ESP's FAT32
filesystem
上不能启动。使用ext2fsReiserFS(采用的是rEFIt rEFInd),可以成功启动这两种文件系统。尽管如此,从FAT ESP是不能启动的,这使设置变得复杂化。局限依然存在,但用内核stub loader的成功率远高于任何其他的EFI boot loader, 与之成功率接近的是ELILOGRUB Legacy。另一个关于可靠性的问题是,对初始Ram盘的规格要求很高。

   关于上一点提到的警告(希望是暂时的),有用户报告了some3.7x3.8x内核EFIstub loader 的问题。该问题出现时,内核就停止引导。Mac 和联想的用户似乎更容易出现这个问题,Arch Linux用户受此问题影响最大。因为他们都倾向于使用最前沿的内核并且比其他版本(distribution)的用户更愿意使用EFI stub loader. 可以点击这里 this thread查看更多关于此问题的讨论。令人奇怪的是,一个版本出现这个问题后,下个版本就不会出现;一些用户(并不是所有的用户)可以通过转换引导管理器或者引导管理器的编译方式来跳过此问题。这是个非常令人困惑的问题,EFI stub loader 的主要开发人员都知道这个情况。

尽管一些3.7x 和3.8x内核依然受此问题困扰,但是该方法在最近发布的版本上都运行正常。EFI stub loader 在与 rEFInd 或 gummiboot在一起使用时效果最好,因为在用这种方式引导,可以指定Linus内核需要的额外选项,免去了每次引导时都需要输入选项的不足。实际上呢,正如rEFInd page, 中所描述的,rEFInd 与 EFI stub loader的结合允许通过拖放方式升级内核,而不必编辑任何配置文件!

安装EFI Stub Loader

注意:这部分是关于编译内核的。如果你正在使用的是3.3.0 或者是更新的支持EFI stub loader的内核,那么你需要做的就是将内核以及它的初始RAM disk 复制到 ESP或是在ESP上的安装驱动(driver)(以便内核可以从EFI被读取)。但是,你必须知道如何运行(launch)内核,"Configuring and Using the EFI Stub
Loader."
这里有简单介绍。

安装EFI stub loader 需要配置你的3.3.0内核 (或者更新的内核)并对其进行编译(也可以用适合的预配置好的内核),然后将内核安装到ESP(或某些EFI可以读取的分区)。如果在编译内核时不能独立完成,可以浏览下相关的网页,比如How to: Compile Linux Kernel
2.6
 和 Compiling the Linux Kernel。如果你之前没有做该项工作,那就得从数千个选项中选出你所需要的选项。通用型的内核比较方便,因为它的选项可以适应几乎所有的计算机,这与版本提供者(distribution provideer)使用的相似。但是,你需要留意一两个内核配置选项:

  CONFIG_EFI_STUB--- 该选项的位置在这里:accessible as Processor Type and Features
-> EFI Runtime Service Support -> EFI Stub Support。这个选项是将EFI stub loader添加到内核的重要选项,如果想使用该功能就必须勾选它。

  CONFIG_CMDLINE_BOOL  CONFIG_CMDLINE-----虽然第一个选项使第二个生效,但是我将他们看做一个选项。通过对命令行设置CONFIG_CMDLINE,需要在EFI外壳提示符键入或通过引导管理器传递,如果没有这个需要可以跳过此选项。如果想通过EFI引导管理器来运行内核,并且该引导管理器不允许将任意参数传递给你的boot loader, 比如EFI和rEFIt中功能不全的引导管理器,这时候这个选择就发挥作用了。如果你打算使用rEFInd或者其他的支持传递任意选项到boot loader 的引导管理器,就不再需要设置该选项了。

如下图:

 

内核编译完成后,需要用正常方式安装模块(键入make
modules_install
)并且准备一个初始的RAM盘(使用 mkinitrd 或 mkinitramfs,
不同的distribution的操作细节会有差别)。将内核文件和初始的RAM盘复制到Linux /boot目录和ESP。例如,你可能会使用ESP上的EFI/linux子目录来存放这些文件。

配置和使用EFI Stub Loader

内核的stub loader 本身不需要配置,但是有时候,在从它里面建立选项的时候会需要。如果编译的内核stub loader没有这些选项的时候,你需要知道如何将选项传递给它,这可以在boot loader中的选项行中传递。此外,如果使用初始RAM盘了,就需要将初始RAM盘的名字也传递给它。在EFI shell输入后,会有如下生成的命令:

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

这是个小例子,其中将内核命名为bzImage.efi,root Linux
filesystem在/dev/sda4,初始RAM盘是安装在了ESP EFI的/linux/initrd.img这个文件。 ro这个选项使Linux以只读方式挂载root filesystem。(这个是标准的;初始化脚本后来重新挂载filesystem read/write)。需要注意的是root=这个选项识别Linux root
filesystem, 使用Linux样式的向前倾的斜线(/)来分隔目录元素,与Linux root(/)filesystem相对; 但是,initrd= 使用的是EFI风格的反斜杠(\)用来识别初始的RAM盘,这与ESP's root相对。这很重要,因为不正确的 initrd=规范会使内核停止。较旧版本的EFIstub loader(3.3.0,至少是3.4.0)不会报错。再新一点的版本(比如3.6.0,或者3.5x内核)在不能读取它的initrd文件时 会报错。

EFI有自己的引导管理器,但是通常比较简单原始。然而,如果你的引导管理器可以让你选择boot loader, 或者是你愿意只从一个内核中引导,你可以在Linux通过 efibootmgr程序进行设置。可以通过下面的命令行实现:

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

该命令是使用指定的 –u后面的函数来让EFI引导 \EFI\arch\vmlinuz-arch.efi这个文件。理论上,如果使用/dev/sda1作为ESP,-d和-p这两个选项就没有必要了;这里将这两个选项加上,是以防你不是使用这样的ESP;此处根据实际情况作改动。 如果你的EFI执行/实施有个不错的启动菜单,你可以用多个命令(multiple commands)建立替代启动选项(alternative boot
options),比如引导不同的内核、多重版本(multiple
distributions)以及使用备用选项(using alternate options)。

如果你使用的是分开的(单独的;分开的;不同的;各自的)EFI引导管理程序,比如rEFInd 或 gummiboot,就可以通过浏览配置将必需的选项传递给内核。刚才提到过,rEFIt不可以。rEFIt和 rEFInd 可通过下面两种方式将选项传递给EFI stub loader: 在主要的refind.conffile中写boot loader节定义;或者是依靠 refind_linux.conf这个文件的半自动查找方式,可以在目录中的 refind_linux.conf文件为所有的内核读取选项。任何一种方式都可将内核支持与rEFInd结合,这个结合在多引导环境中比较灵活并且相对来说容易维持。但是版本(distribution)脚本不支持rEFInd,所以不得不做一些手工维护。gummiboot 的每个主菜单选项都需要一个独立的配置文件,并且所有的版本(distribution)的维护脚本都不支持,需要手工维护。

理论上讲,在使用chainloader(而不是使用内核或linux选项)的GRUB Legacy或GRUB 2上运行编译好的支持EFI stub的Linux内核是完全有可能的。(但我还没试过)。如果你用常规的方式运行遇到硬件初始化的文件,那么使用chainloader就可能会方便一些,但是这一点我还不是非常确定。

ext2fs/ext3fs, ext4fs 以及ReiserFS的EFI驱动程序(drivers)是可用的,这另从Linux filesystem 加载支持EFI stub的Linux内核成为可能。尽管有时候你可能需要给内核重命名或使用.efi这个扩展名建立连接,但是该方法可以简化配置,因为你不必将内核复制到ESP。http://www.rodsbooks.com/refind/drivers.html  这里介绍EFI drivers的使用,并重点介绍配置rEFInd和加载EFI drivers。

维护Kernel's EFI Stub
Loader

因为目前大多数版本(distribution)都不支持内核的EFI stub loader,所以只能自己进行维护。将来,各个版本将有可能使用 efibootmgr或其他工具来帮助维护那些使用该方法的设备,再或者通过维护GRUB, rEFInd, 或 gummiboot的配置文件时支持Kernel's EFI Stub Loader

 

如何提取Linux Kernel的配置文件

如果你是一个喜欢编译内核的狂人,同时也是经常忘记将默认的.config文件备份的懒家伙,那么下面的方法将会使你的内核配置工作变得更轻松,从linux 2.6开始内核提供了一种将.config附加到映像文件的方法,通过这种方法,内核配置者可以不必备份当前的.config文件,而是在需要的时候直接从内核映像中提取.config文件。步骤如下:

1. 配置内核
1.1 make menuconfig;
1.2 选择如下:
General setup --->
< *> Kernel .config support
[*] Enable access to .config through /proc/config.gz
1.3 make uImage
2. 提取配置文件
2.1 方法一,从uImage文件中提取:
2.1.1 打开控制台,cd进入到linux源码树根目录,我的为:/root/Desktop/easy2440/linux-2.6.30.9-easy2440
2.1.2 输入如下命令:scripts/extract-ikconfig arch/arm/boot/uImage > config
2.1.3 命令执行完后,将会在linux源码树根目录下面生成config文件;
2.1.4 config文件即为我们需要的内核配置文件,可以将其替代.config文件。
2.2 方法二,从开发板的/proc/config.gz中提取:
2.2.1 将新生成的uImage文件下载到开发板;
2.2.2 准备串口控制台,启动开发板;
2.2.3 开发板正常启动后,在控制台输入命令:cat /proc/config.gz | gzip -d > /home/config
2.2.4 命令执行完后,将会在/home目录下生成config文件
2.2.5 config文件即为我们需要的内核配置文件,可以将其替代.config文件。

Linux内核配置图解

1.内核配置主界面
 
 
2.General setup  —>
 
Prompt for development and/or incomplete code/drivers:

代码成熟度,如帮助测试、开发这些特性和驱动,或者需要使用到这些,可以启用;
 
(1024-lvs2) Local version – append to kernel release:
在内核版本后面加上自定义的版本字符串(小于64字符),使用”uname -a”命令查看
 
Automatically append version information to the version string:
自动生成版本信息。这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先的重复。这需要Perl的支持。由于在编译的命令make-kpkg 中我们会加入–append-to-version 选项来生成自定义版本。
 
Kernel compression mode (Gzip)  —>:
内核压缩模式选bzip2。 gzip用于UNIX系统的文件压缩。后缀为.gz的文件。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。  bzip2是一个基于Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的LZ77/LZ78压缩算法来得好。它是一款免费软件。bzip2能够进行高质量的数据压缩。它利用先进的压缩技术,能够把普通的数据文件压缩10%至15%,压缩的速度和解压的效率都非常高!支持现在大多数压缩格式,包括tar、gzip 等等。  lzma是一个Deflate和LZ77算法改良和优化后的压缩算法,开发者是Igor Pavlov,2001年被首次应用于7-Zip压缩工具中,是 2001年以来得到发展的一个数据压缩算法。
 
 
Support for paging of anonymous memory (swap):
将使你的内核支持虚拟内存,这个虚拟内存在LINUX中就是SWAP分区。
 
System V IPC:
System V进程间通信(IPC)支持,于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来,特别在LINUX下运行 DOS仿真程序,你必须要选Y。
 
BSD Process Accounting:
这是允许用户进程访问内核,将账户信息写入文件中。将进程的统计信息写入文件的用户级系统调用,主要包括进程的创建时间/创建者/内存占用等信息。
 
BSD Process Accounting version 3 file format:
统计信息将会以新的格式(V3)写入,这格式包含进程ID和父进程。注意这个格式和以前的 v0/v1/v2 格式不兼容,所以你需要 升级相关工具来使用它。
 
Export task/process statistics through netlink (EXPERIMENTAL):
处于实验阶段的功能。通过通用的网络输出工作、进程的相应数据,和BSD不同的是,这些数据在进程运行的时候就可以通过相关命令访问。和BSD类似,数据将在进程结束时送入用户空间。如果不清楚,选N。
 
Auditing support:
审计支持,用于和内核的某些子模块同时工作,(例如SELinux)需要它,只有同时选择其子项才能对系统调用进行审计。 允许审计的下层能够被其他内核子系统使用,比如SE-Linux,它需要这个来进行登录时的声音和视频输出。没有CONFIG_AUDITSYSCALL 时(即下一个选项)无法进行系统调用。
 
RCU Subsystem  —>
RCU Implementation (Tree-based hierarchical RCU)  —>
RCU 实现机制,保留默认
 
(18) Kernel log buffer size (16 => 64KB, 17 => 128KB):
内核日志缓存的大小,12 => 4 KB,13 => 8 KB,14 => 16 KB单处理器,15 => 32 KB多处理器,16 => 64 KB for x86 NUMAQ or IA-64,17 => 128 KB for S/390
 
Control Group support  —>
cgroup支持,如cpusets那样来使用cgroup子系统进程,不确定不选择
 
enable deprecated sysfs features which may confuse old userspace tools:
加入对旧版sysfs路径的支持,建议选择
 
Kernel->user space relay support (formerly relayfs) :
内核系统区和用户区进行传递通讯的支持。这个选项在特定的文件系统中提供数据传递接口支持,它可以提供从内核空间到用户空间的大批量的数据传递工具和设施。
 
Namespaces support:
命名空间支持,允许服务器为不同的用户信息提供不同的用户名空间服务。
 
UTS namespace:
通用终端系统的命名空间。它允许容器,比如Vservers利用UTS命名空间来为不同的服务器提供不同 的UTS。如果不清楚,选N。
 
IPC namespace:
IPC命名空间,不确定可以不选
 
Initial RAM filesystem and RAM disk (initramfs/initrd) support:
初始RAM的文件和RAM磁盘( initramfs /initrd)支持(如果要采用initrd启动则要选择,否则可以不选)
 
Optimize for size:
这个选项将在GCC命令后用 “-Os” 代替 “-O2″参数,这样可以得到更小的内核。
 
Configure standard kernel features (for small systems)  —>:
配置标准的内核特性(为小型系统)。这个选项可以让内核的基本选项和设置无效或者扭曲。这是用于特定环境中的,它允许“非标准”内核。你要是选它,你一定要明白自己在干什么。这是为了编译某些特殊用途的内核使用的,例如引导盘系统
 
Kernel Performance Events And Counters  —>
[*] Kernel performance events and counters (NEW)
[*]   Tracepoint profiling sources (NEW)
[ ] Kernel performance counters (old config option) (NEW)
[ ] Debug: use vmalloc to back perf mmap() buffers (NEW)
内核性能事件和计数,保存默认
 
Choose SLAB allocator (SLUB (Unqueued Allocator))  —>
选择内存分配管理,选择SLUB (Unqueued Allocator)
 
Profiling support (EXPERIMENTAL) :
用一个工具来扫描和提供计算机的系统评测
 
Kprobes:
调试内核
 
3.Enable loadable module support
 
 
打开可加载模块支持,如果打开它则必须通过”make modules_install”把内核模块安装在/lib/modules/中,这个选项可以让你的内核支持模块,模块是一小段代码,编译后可在系统内核运行时动态的加入内核,从而为内核增加一些特性或是对某种硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以减少内核的体积。在运行时可以使用modprobe命令来加载它到内核中去(在不需要时还可以移除它)。一些特性是否编译为模块的原则是,不常使用的,特别是在系统启动时不需要的驱动可以将其编译为模块,如果是一些在系统启动时就要用到的驱动比如说文件系统,系统总线的支持就不要编为模块,否则无法启动系统。在启动时不用到的功能,编成模块是最有效的方式。
 
Forced module loading:
允许强制加载模块
 
Module unloading:
允许卸载已经加载的模块
 
Module versioning support:
有时候,你需要编译模块。选这项会添加一些版本信息,来给编译的模块提供独立的特性,以使不同的内核在使用同一模块时区别于它原有的模块。这有时可能会有点用。如果不清楚,选N。允许使用其他内核版本的模块(可能会出问题)
 
Source checksum for all modules :
为所有的模块校验源码,如果你不是自己编写内核模块就不需要它这个功能,是为了防止你在编译模块时不小心更改了内核模块的源代码但忘记更改版本号而造成版本冲突。如果不清楚,选N
 
4.Enable the block layer
 
 
块设备支持,使用硬盘/USB/SCSI设备者必选这选项使得块设备可以从内核移除。如果不选,那么 blockdev 文件将不可用,一些文件系统比如 ext3 将不可用。这个选项会禁止 SCSI 字符设备和 USB 储存设备,如果它们使用不同的块设备。选Y,除非你知道你不需要挂载硬盘和其他类似的设备。
 
Block layer SG support v4 :
通用scsi块设备第4版支持
 
Block layer data integrity support:
块设备数据完整性支持
 
IO Schedulers:
IO调度器,I/O是输入输出带宽控制,主要针对硬盘,这里提供了三个IO调度器。
 
 
Anticipatory I/O scheduler:
使用于大多数环境假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器)抢先式 I/O 调度方式是默认的磁盘调度方式。它对于大多数环境通常是比较好的选择。但是它和Deadline I/O 调度器相比有点大和复杂,它有时在数据调入时会比较慢。
 
Deadline I/O scheduler:
使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)Deadline I/O调度器简单而又紧密,在性能上和抢先式调度器不相上下,在一些数据调入时工作得更好。至于在单进程I/O磁盘调度上,它的工作方式几乎和抢先式调度器相同,因此也是一个好的选择。 
 
CFQ I/O scheduler:
使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统CFQ调度器尝试为所有进程提供相同的带宽。它将提供平等的工作环境,对于桌面系统很合适。
 
Default I/O scheduler (CFQ)  —>
 
5.Processor type and features
 
 
Tickless System (Dynamic Ticks):
非固定频率系统,这项技术能让新内核运行的更有效率,并且更省电。
 
High Resolution Timer Support:
支持高频率时间发生器,如果硬件不兼容,则这个选项只会增大内核(大多数个人PC并没有这个)
 
Symmetric multi-processing support:
对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上,此时”Enhanced RealTime Clock Support”选项必须开启,”Advanced Power Management”选项必须关闭。如果你选N,内核将会在单个或者多个CPU的机器上运行,但是只会使用一个CPU。如果你选Y,内核可以在很多(但不是所有)单CPU的机器上运行,在这样的机器,你选N会使内核运行得更快。注意如果你选Y,然后在Processor family选项中选择“586″ or “Pentium” ,内核将不能运行在486构架的机器上。同样的,多CPU的运行于PPro构架上的内核也无法在 Pentium 系列的板上运行。
 
Support sparse irq numbering:
支持稀有的中断编号
 
Enable MPS table:
mps多处理器规范
 
Support for extended (non-PC) x86 platforms:
支持非pc平台
 
Processor family (Generic-x86-64)  —>
处理器系列,请按照你实际使用的CPU选择这里是处理器的类型。这里的信息主要目的是用来优化。为了让内核能够在所有X86构架的CPU上运行(虽然不是最佳速度),在这你可以选386。内核不会运行在比你选的构架还要老的机器上。比如,你选了Pentium构架来优化内核,它将不能在486构架上运行。这里适情况而定,最好是能找到跟你cpu一致的。
 
 
Maximum number of CPUs :
支持的最大CPU数,每增加一个内核将增加8K体积
 
SMT (Hyperthreading) scheduler support:
支持Intel的超线程(HT)技术超线程调度器在某些情况下将会对 Intel Pentium 4 HT系列有较好的支持。如果你不清楚,选N
 
Multi-core scheduler support:
针对多核CPU进行调度策略优化多核调度机制支持,双核的CPU要选。多核心调度在某些情况下将会对多核的CPU系列有较好的支持。如果你不清楚,选N
 
Preemption Model (No Forced Preemption (Server))  —>
内核抢占模式,一些优先级很高的程序可以先让一些低优先级的程序执行,即使这些程序是在核心态下执行。从而减少内核潜伏期,提高系统的响应。当然在一些特殊 的点的内核是不可抢先的,比如内核中的调度程序自身在执行时就是不可被抢先的。这个特性可以提高桌面系统、实时系统的性能
 
No Forced Preemption (Server):
适合服务器环境的禁止内核抢占这是传统的LINUX抢先式模型,针对于高吞吐量设计。它同样在很多时候会提供很好的响应,但是也可能会有较长的延迟。如果你是建立服务器或者用于科学运算,选这项,或者你想要最大化内核的原始运算能力,而不理会调度上的延迟。
 
Voluntary Kernel Preemption (Desktop):
适合普通桌面环境的自愿内核抢占,这个选项通过向内核添加更多的“清晰抢先点”来减少内核延迟。这些新的抢先点以降低吞吐量的代价,来降低内核的最大延迟,提供更快的应用程序响应。这通过允许低优先级的进程自动抢先来响应事件,即使进程在内核中进行系统调用。这使得应用程序运行得更“流畅”,即使系统已经是高负荷运转。如果你是为桌面系统编译内核,选这项。
 
Preemptible Kernel (Low-Latency Desktop):
适合运行实时程序的主动内核抢占,这个选项通过使所有内核代码(非致命部分)编译为“可抢先”来降低内核延迟。这通过允许低优先级进程进行强制抢先来响应事件,即使这些进程正在进行系统调用或者未达到正常的“抢先点”。这使得应用程序运行得更加“流畅”即使系统已 经是高负荷运转。代价是吞吐量降低,内核运行开销增大。选这项如果你是为桌面或者嵌入式系统编译内核,需要非常低的延迟。如果你要最快的响应,选第三项。
 
一般建议服务器选择第一或二项。 
 
 
Reroute for broken boot IRQs:
防止同时收到多个boot IRQ(中断)时,系统混乱
 
Machine Check / overheating reporting:
让CPU检测到系统故障时通知内核,以便内核采取相应的措施(如过热关机等)
 
/dev/cpu/microcode – microcode support
是否支持Intel IA32架构的CPU。这个选项将让你可以更新Intel IA32系列处理器的微代码,显然你需要到网上去下载最新的代码,LINUX不提供这些代码。当然你还必须在文件系统选项中选择/dev file system support才能正常的使用它。如果你把它译为模块 ,它将是 microcode。IA32主要用于高于4GB的内存。详见下面的“高内存选项”。使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU有效
 
/dev/cpu/*/msr – Model-specific register support:
是否打开CPU特殊功能寄存器的功能。这个选项桌面用户一般用不到,它主要用在Intel的嵌入式CPU中的,这个寄存器的作用也依赖与不同的CPU类型 而有所不同,一般可以用来改变一些CPU原有物理结构的用途,但不同的CPU用途差别也很大。在多cpu系统中让特权CPU访问x86的MSR寄存器
 
/dev/cpu/*/cpuid – CPU information support:
是否打开记录CPU相关信息功能。这会在/dev/cpu中建立一系列的设备文件,用以让过程去访问指定的CPU。能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)< > /sys/kernel/debug/x86/cpu/* – CPU Debug support
 
Numa Memory Allocation and Scheduler Support:
启用非对称内存访问支持。
 
Sparse Memory virtual memmap:
内核资源足够的内存映射有效选项
 
Reserve low 64K of RAM on AMI/Phoenix BIOSen:
针对AMI/Phoenix BIOS
 
MTRR (Memory Type Range Register) support :
内存类型区域寄存器。在 Intel P6 系列处理器(Pentium Pro, Pentium II 和更新的)上,MTRR将会用来规定和控制处理器访问某段内存区域的策略。如果你在PCI或者AGP总线上有VGA卡,这将非常有用。可以提升图像的传送速度2.5倍以上。选Y,会生成文件/proc/mtrr,它可以用来操纵 你的处理器的MTRR。典型地,X server 会用到。这段代码有着通用的接口,其他CPU的寄存器同样能够使用该功能。Cyrix 6×86, 6×86MX和 M II处理器有ARR ,它和 MTRR有着类似的功能。AMD K6-2/ K6-3有两个MTRR, Centaur C6有8个MCR允许复合写入。所有这些处理器都支持这段代码,你可以选Y如果你有以上处理器。选Y同样可以修正SMP BIOS的问题,它仅为第一个CPU提供MTRR,而不为其他的提供。这会导致各种各样的问题,所以选Y是明智的。你可以安全地选Y,即使你的机器没有MTRR。这会给内核增加9KB。打开它可以提升PCI/AGP总线上的显卡2倍以上的速度,并且可以修正某些BIOS错误
 
EFI runtime service support:
EFI启动支持这里允许内核在EFI平台上使用储存于EFI固件中的系统设置启动。这也允许内核在运行时使用EFI的相关服务。这个选项只在有EFI固件的系统上有用,它会使内核增加8KB。另外,你必须使用最新的ELILO 登录器才能使内核采用EFI的固件设置来启动(GRUB和LILO完全不知道EFI是什么东西)。即使你没有EFI,却选了这个选项,内核同样可以启动。大家应该用的是GRUB,所以选上这个也没什么用。除非你的系统支持EFI(一种可代替传统BIOS的技术)否则不选
 
Enable seccomp to safely compute untrusted bytecode:
只有嵌入式系统可以不选
 
Timer frequency (250 HZ):
允许设置时钟频率。这是用户定义的时钟中断频率 100HZ-1000 HZ ,不过 100 HZ 对服务器和NUMA系统更合适,它们不需要很快速的响应用户的要求,因为时钟中断会导致总线争用和缓冲打回。注意在SMP环境中,时钟中断由变量 NR_CPUS * Hz定义在每个CPU产生。
 
( ) 100 HZ:100 HZ是传统的对服务器、SMP 和 NUMA的系统选项。这些系统有比较多的处理器,可以在中断较集中的时候分担中断
(X) 250 HZ:250 HZ对服务器是一个好的折衷的选项,它同样在SMP 和 NUMA 系统上体现出良好的反应速度。
( ) 1000 HZ:1000 HZ对于桌面和其他需要快速事件反应的系统是非常棒的。

Timer frequency (250 HZ)  —>
 
kexec system call:
kexec 系统调用。kexec是一个用来关闭你当前内核,然后开启另一个内核的系统调用。它和重启很像,但是它不访问系统固件。由于和重启很像,你可以启动任何内核,不仅仅是LINUX。kexec这个名字是从exec系统调用来的。它只是一个进程,可以确定硬件是否正确关闭,提供kexec系统调用,可以不必重启而切换到另一个内核,如果需要就选择,对大多数用户来说并不需要
 
kernel crash dumps:
内核崩溃时,dump运行时信息
 
Build a relocatable kernel:
建立一个移动的内核,除非特殊要求否则只是增大内核大小而已
 
6.Power management and ACPI options
 
 
Suspend to RAM and standby (NEW):
待机
 
Hibernation (aka ‘suspend to disk’) (NEW):
休眠
 
ACPI (Advanced Configuration and Power Interface) Support  –>
 
ACPI 4.0 power meter:
如硬件有ACPI 4.0固件支持
 
CPU Frequency scaling  —>
 
Enable CPUfreq debugging:
启用CPUfreq调试,关闭
 
Default CPUFreq governor (performance):
使用高性能CPU调频方式
 
Default CPUFreq governor (performance)  —>
 
7.Bus options (PCI etc.)
 
 
PCI Express Hotplug driver:
PCI热拔插驱动支持
 
Root Port Advanced Error Reporting support :
硬件驱动会负责发送错误信息
 
PCI IOV support :
PCI虚拟化
 
8.Executable file formats / Emulations
保持默认
 
 
Kernel support for ELF binaries:
ELF支持
 
Kernel support for MISC binaries:
运行一些解释程序需要
 
IA32 Emulation:
在64位内核运行32位程序
 
9.Networking support
 
 
Amateur Radio support:
无线电支持
 
Bluetooth subsystem support:
蓝牙支持
 
Wireless:
无线支持
 
Networking options  —>
 
IP: kernel level autoconfiguration:
适合无盘工作站,自动配置IP等
 
IP: tunneling:
ip隧道
 
IP: multicast routing:
多播路由
 
IP: TCP syncookie support (disabled per default):
SYN Cookie支持
 
The IPv6 protocol:
ipv6支持
 
TCP: advanced congestion control  —>
 
Network packet filtering framework (Netfilter)  —>
iptables和lvs的选项
 
Core Netfilter Configuration  —>
 
 
 
 
IP virtual server support  —>
 
IP: Netfilter Configuration  —>
 
QoS and/or fair queueing  —>
 
 
 
8.Generic Driver Options  —>
 
Block devices  —>
 
SCSI device support  —>
 
SCSI Transports  —>
 
SCSI low-level drivers  —>
 
 
SCSI Device Handlers  —>
 
 
Serial ATA (prod) and Parallel ATA (experimental) drivers  –>
 
 
Multiple devices driver support (RAID and LVM)  —>
 
Fusion MPT device support  —>
 
IEEE 1394 (FireWire) support  —>
 
Network device support  —>
 
10.Firmware Drivers  —>
 
11.File systems  —>
 
CD-ROM/DVD Filesystems  —>
 
DOS/FAT/NT Filesystems  —>
 
Pseudo filesystems  —>
 
Network File Systems  —>
 
Partition Types  —>
 
Native language support  —>
 
12.Kernel hacking  —>
 
13.Security options  —>
 
14.Cryptographic API  —>
保存默认
 
 
15.Library routines  —>
保持默认
 

`configure' configures GRUB 2.00 说明

configure' configures GRUB 2.00 to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print
checking ...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for --cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or
..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, make install' will install all the files in
/usr/local/bin', /usr/local/lib' etc.  You can specify
an installation prefix other than
/usr/local' using --prefix',
for instance
--prefix=$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/grub]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]

Program names:
  --program-prefix=PREFIX            prepend PREFIX to installed program names
  --program-suffix=SUFFIX            append SUFFIX to installed program names
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
  --target=TARGET   configure for building compilers for TARGET [HOST]

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --disable-dependency-tracking  speeds up one-time build
  --enable-dependency-tracking   do not reject slow dependency extractors
  --disable-nls           do not use Native Language Support
  --disable-rpath         do not hardcode runtime library paths
  --disable-largefile     omit support for large files
  --enable-efiemu         build and install the efiemu runtimes
                          (default=guessed)
  --disable-werror        do not use -Werror when building GRUB
  --enable-mm-debug       include memory manager debugging
  --enable-cache-stats    enable disk cache statistics collection
  --enable-grub-emu-usb   build and install the grub-emu' debugging utility
                          with USB support (default=guessed)
  --enable-grub-emu-sdl   build and install the
grub-emu' debugging utility
                          with SDL support (default=guessed)
  --enable-grub-emu-pci   build and install the grub-emu' debugging utility
                          with PCI support (potentially dangerous)
                          (default=no)
  --enable-grub-mkfont    build and install the
grub-mkfont' utility
                          (default=guessed)
  --enable-grub-mount     build and install the grub-mount' utility
                          (default=guessed)
  --enable-device-mapper  enable Linux device-mapper support (default=guessed)
  --enable-libzfs         enable libzfs integration (default=guessed)

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-platform=PLATFORM
                          select the host platform [[guessed]]
  --with-bootdir=DIR      set the name of /boot directory [[guessed]]
  --with-grubdir=DIR      set the name of grub directory [[guessed]]
  --with-gnu-ld           assume the C compiler uses GNU ld default=no
  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
  --with-libintl-prefix[=DIR]  search for libintl in DIR/include and DIR/lib
  --without-libintl-prefix     don't search for libintl in includedir and libdir
  --without-included-regex
                          don't compile regex; this is the default on systems
                          with recent-enough versions of the GNU C Library
                          (use with caution on other systems).

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  YACC        The
Yet Another Compiler Compiler' implementation to use.
              Defaults to the first program found out of: bison -y', byacc',
              yacc'.
  YFLAGS      The list of arguments that will be passed by default to $YACC.
              This script will default YFLAGS to the empty string to avoid a
              default value of
-d' given by some make applications.
  CPP         C preprocessor
  CCAS        assembler compiler command (defaults to CC)
  CCASFLAGS   assembler compiler flags (defaults to CFLAGS)

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

grub-mkimage说明

SYNOPSIS
       grub-mkimage [OPTION]... [MODULES]
DESCRIPTION
       Make a bootable image of GRUB.
       -d, --directory=DIR
              use images and modules under DIR [default=/usr/lib/grub/i386-pc]
       -p, --prefix=DIR
              set grub_prefix directory [default=/boot/grub]
       -m, --memdisk=FILE
              embed FILE as a memdisk image
       -f, --font=FILE
              embed FILE as a boot font
       -c, --config=FILE
              embed FILE as boot config
       -o, --output=FILE
              output a generated image to FILE [default=stdout]
       -h, --help
              display this message and exit
       -V, --version
              print version information and exit
       -v, --verbose
              print verbose messages