本文以Gentoo的2.6.10-r6的内核为例,讲述了如何配置、编译2.6版本的内核。
首先对内核进行菜单配置,
# cd /usr/src/linux
# make menuconfig
进入图形界面的内核配置。
代码成熟度选项,
Code maturity level options —>
[*] Prompt for development and/or incomplete code/drivers
[*] Select only drivers expected to compile cleanly
打开使用开发中、不完全的代码/驱动会让内核配置多出很多选项,由于我们需要使用一些正在开发中的功能,因此必需打开这一选项。
General setup —>
() Local version – append to kernel release
[*] Support for paging of anonymous memory (swap)
[*] System V IPC
[*] POSIX Message Queues
[*] BSD Process Accounting
[*] BSD Process Accounting version 3 file format
[*] Sysctl support
[ ] Auditing support
(15) Kernel log buffer size (16 => 64KB, 17 => 128KB)
[*] Support for hot-pluggable devices
[*] Kernel Userspace Events
[*] Kernel .config support
[*] Enable access to .config through /proc/config.gz
[*] Configure standard kernel features (for small systems) —>
— Configure standard kernel features (for small systems)
[ ] Load all symbols for debugging/kksymoops
[*] Enable futex support
[*] Enable eventpoll support
[*] Optimize for size
[*] Use full shmem filesystem
(0) Function alignment
(0) Label alignment
(0) Loop alignment
(0) Jump alignment
Support for paging of anonymous memory (swap):这是使用交换分区或者交换文件来做为虚拟内存的,当然要选上了。
System V IPC:表示系统5的Inter Process Communication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来的。
POSIX Message Queues:这是POSIX的消息队列,它同样是一种IPC。建议你最好将它选上。
BSD Process Accounting:这是充许用户进程访问内核将账户信息写入文件中的。这通常被认为是个好主意,建议你最好将它选上。
Sysctl support:这个选项能不重新编译内核修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核的参数或变量。建议你最好将它选上。
Auditing support:审记支持,用于和内核的某些子模块同时工作,例如SELinux。只有选择此项及它的子项,才能调用有关审记的系统调用。
Kernel log buffer size:内核日志缓存的大小,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。
Support for hot-pluggable devices:是否支持热插拔的选项,肯定要选上。不然USB、PCMCIA等这些设备都用不了。
Kernel Userspace Events:内核中分为系统区和用户区,这里系统区和用户区进行通讯的一种方式,选上。
Kernel .config support:将.config配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc中得到内核的配置。还记得另一篇贴子我是如何取得启动光盘的内核配置信息,并在此基础上配置新的内核吗?
Configure standard kernel features (for small systems):这是为了编译某些特殊的内核使用的,通常你可以不选择这一选项,你也不用对它下面的子项操心了。
Load all symbols for debugging/kksymoops:是否装载所有的调试符号表信息,如果你不需要对内核调试,不需要选择此项。
Enable futex support:不选这个内核不一定能正确的运行使用glibc的程序,当然要选上。
Enable eventpoll support:不选这个内核将不支持事件轮循的系统调用,最好选上。
Optimize for size:这个选项使gcc使用-Os的参数而不是-O2的参数来优化编译,以获得更小尺寸的内核,建议选上。
Use full shmem filesystem:除非你在很少的内存且不使用交换内存时,才不要选择这项。
后面的这四项都是在编译时内存中的对齐方式,0表示编译器的默认方式。使用内存对齐能提高程序的运行速度,但是会增加程序对内存的使用量。
内核也是一组程序呀。
可加载模块,
Loadable module support —>
[*] Enable loadable module support
[*] Module unloading
[ ] Forced module unloading
[*] Module versioning support (EXPERIMENTAL)
[ ] Source checksum for all modules
[*] Automatic kernel module loading
Enable loadable module support,很多人喜欢将全部功能、硬件支持一股脑的编进内核,而不是使用模块的方式。这样做非常不好(个人觉得)。其实我也做过嵌入式的开发,在针 对特定硬件的平台下尽可能将内核编小,将始终是支持模块加载的。例如我们开发的防火墙就是做为内核的模块被加载的。使用模块支持,你的系统能具有更好的可 扩充性。还有一个原因就是自己编写的功能模块、设备驱动模块(假设编写的质量不高)以模块方式工作引起Kernel Panic的机率要远远低于不支持模块全部编进内核的方式。讲了这么多,终于可以理直气壮的选上这一功能了。
Module unloading,不选这个功能,加载的模块就不能卸载。没什么需要多解释的,建议最好选上。
Forced module unloading,这个选项能强行卸载模块,即使内核认为这样并不安全,也就是说你可以把正在使用中的模快卸载掉。如果你不是内核开发人员或者骨灰级的玩家,不要选择这个选项。
Module versioning support (EXPERIMENTAL),这个功能可以让你使用其它版本的内核模块,由于我自己写一些模块,所以我会用到这个选项,因为内核更新太快了,我的头文件 更新根本赶不上内核的更新。还有,虽然我在Gentoo下开发,但实际真实环境用的却是从kernel.org下载的内核。虽然我选择了这个选项,不过建 议你不要选择这个选项。
Source checksum for all modules,这个功能是为了防止更改了内核模块的代码但忘记更改版本号而造成版本冲突。我估计现在没有哪家公司在开发中还没使用版本控制工具,所以不需要这项了。如果你不是自己写内核模块,那就更不需要这一选项了。
Automatic kernel module loading,这个选项能让内核自动的加载部份模块,建议你最好选上。举个例子说明一下,如模块eth1394依赖于模块ieee1394。如果选择了 这个选项,可以直接加载模块eth1394;如果没有选择这个选项,必需先加载模块ieee1394,再加载模块eth1394,否则将出错。
2.6内核的配置与编译(4)
处理器内型及特性,
Processor type and features —>
Subarchitecture Type (PC-compatible) —>
Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon) —>
[ ] Generic x86 support
[*] HPET Timer Support
[*] Symmetric multi-processing support
(2) Maximum number of CPUs (2-255)
[*] SMT (Hyperthreading) scheduler support
[ ] Preemptible Kernel
[ ] Machine Check Exception
<M> Toshiba Laptop support
<M> Dell laptop support
< > /dev/cpu/microcode – Intel IA32 CPU microcode support
< > /dev/cpu/*/msr – Model-specific register support
< > /dev/cpu/*/cpuid – CPU information support
Firmware Drivers —>
< > BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL)
High Memory Support (4GB) —>
[ ] Allocate 3rd-level pagetables from highmem
[ ] Math emulation
[*] MTRR (Memory Type Range Register) support
[ ] Boot from EFI support (EXPERIMENTAL)
[*] Enable kernel irq balancing
[ ] Use register arguments (EXPERIMENTAL)
Subarchitecture Type,这没什么好说的,如果用PC机的话都选这个。
Processor family,这也没什么好说的,选择你机器对应的处理器即可。
Generic x86 support,这一选项针对x86系列的CPU使用更多的常规优化。如果你在上面一项选的是i386、i586之类的才选这个。
HPET Timer Support,HPET是替代8254芯片的下一代时钟处理器。这里你可以安全的选上这一选项。如果硬件不支持的话,将仍使用8254时钟处理器。
Symmetric multi-processing support,对称多处理器支持,在单CPU的机器上,不选这个选项会更快一些。由于超线程技术,看起来是两颗CPU,因些要选上这个选项。
Maximum number of CPUs (2-255),支持的最大CPU数。
SMT (Hyperthreading) scheduler support,超线程支持,如果你的CPU是P4超线程的,应该选上这一选项。
Preemptible Kernel,这个选项能使应用程序即使内核在高负载时也很可靠,建议最好选上。
Machine Check Exception,这个选项能让CPU检测到系统故障时通知内核,一般我用组装的台式机会选这项。本本嘛,我感觉还是非常可靠的,所以就不选它了。
Toshiba Laptop support,Dell laptop support,这两项都是对本本的支持,其实编译内核的原则应该是让内核能在特定的环境下运行,由于我编译的内核可能公司的其它人也会使用,所以我尽可 能的不针对特定的硬件。将对特定的硬件支持编译成模块。
/dev/cpu/microcode – Intel IA32 CPU microcode support,这个选项是让你使用不随Linux内核发行的IA32 microcode,但是你必需有IA32 microcode的二进制文件。
/dev/cpu/*/msr – Model-specific register support,这个选项能让特权CPU访问x86的MSR寄存器。由于超线程并不是真正的多处理器环境,所以不要选择这个。
/dev/cpu/*/cpuid – CPU information support,这个选项能从/dev/cpu/x/cpuid获得CPU的唯一标识符。
BIOS Enhanced Disk Drive calls determine boot disk,台式机的有些BIOS支持从某块特定的硬盘启动,由于本本只能装一块硬盘,所以就不选择这项了。如果你的BIOS不支持这个功能而你选上的话,有可能无法启动。
High Memory Support (4GB),4GB的内存支持,已经足够了。
Allocate 3rd-level pagetables from highmem,除非你真的有几G的内存,选择这个是没有意义的。
Math emulation,估计现在没人有386或486SX的处理器了吧,那就不要选这个。
MTRR (Memory Type Range Register) support,这个选项必需要选上。
Boot from EFI support (EXPERIMENTAL),由于我使用的是GRUB,所以选上这个也没什么用,如果你打算使用EFI的功能,你可以到http://elilo.sourceforge.net看看。
Enable kernel irq balancing,选上这个选项能让内核进行IRQ均衡。
Use register arguments (EXPERIMENTAL),使用-mregparm=3参数编译内核,将前3个参数以寄存器方式进行参数调用。GCC的版本必需大于等于3.0。
电源管理,
Power management options (ACPI, APM) —>
[*] Power Management support
[ ] Power Management Debug Support
[ ] Software Suspend (EXPERIMENTAL)
ACPI (Advanced Configuration and Power Interface) Support —>
APM (Advanced Power Management) BIOS Support —>
CPU Frequency scaling —>
Power Management support,电源管理没什么好说的,不想浪费电就选上。如果不选你可以跳过这部份。
Power Management Debug Support,电源管理的调试信息支持,如果不是要调试内核有关电源管理部份,请不要选择这项。
Software Suspend (EXPERIMENTAL),休眠到硬盘。也就是将内存写入交换分区中,下次启动可以通过参数resume=/dev/swappartition(例 如:resume=/dev/hda6)来恢复上次机器运行的状态。这项功能对于系统引导时启动许多服务的机器来说很有用,可以节约启动时间。这项功能根 据自己的需要选择吧,如果你选择这项功能,记得恢复休眠后重做交换分区。
2.6内核的配置与编译(6)
ACPI (Advanced Configuration and Power Interface) Support —>
[*] ACPI Support
[ ] Sleep States (EXPERIMENTAL)
<M> AC Adapter
<M> Battery
<M> Button
<M> Video
<M> Fan
<M> Processor
<M> Thermal Zone
<M> ASUS/Medion Laptop Extras
<M> IBM ThinkPad Laptop Extras
<M> Toshiba Laptop Extras
(0) Disable ACPI for systems before Jan 1st this year
[ ] Debug Statements
[ ] Power Management Timer Support
ACPI Support,这是一种电源管理方式,你可以看看你的BIOS是否支持。如果支持的话建议你选上这项。
Sleep States (EXPERIMENTAL),这项功能可以让系统进入休眠状态(不是休眠到硬盘)。休眠是指系统仍然通着电,只是进入最大幅度的省电状态;而休眠到硬盘 是指系统已经断电。不过如果你不是驱动程序的电源管理部份的开发人员,建议你最好不要选择这项。相信未来linux下的驱动对电源支持的功能会越来越好, 或者也搞个硬件兼容列表,到时就可以放心的使用这项功能了。
AC Adapter,检测是电源供电还是电池供电,通常只对本本有用。
Battery,通过/proc/acpi/battery得到电池的信息,通常这也是针对笔记本的。
Button,捕获Power、Sleep、Lid(我也不知道这是什么按钮)等按钮是否按下,并做相应的动作。
Video,集成在板上的显卡的ACPI支持,对有些板卡可能不起作用。
Fan,风扇的支持。这一点很明显,不选这项我的本本的风扇一直在转,选上以后风扇只是间断的转转。
Processor,当机器负荷轻时节省处理器的用电,处理器可是电脑中的第一用电大户(可能老式的CRT显示器和它有的一比)。
Thermal Zone,这个我也不太清楚是什么,只是据说大部份的台式机和笔记本都支持,不选还可能把处理器烧掉。如果你不会让模块正常工作,还是把它编进内核吧,怪吓人的。
ASUS/Medion Laptop Extras、IBM ThinkPad Laptop Extras、Toshiba Laptop Extras,这三种本本的扩展支持。你的内核如果只是自己用,选个该选的就行了。
(0) Disable ACPI for systems before Jan 1st this year,输入四位数的年份,在该年的1月1日前不使用ACPI的功能。0表示一直使用。
Debug Statements,详细的ACPI调试信息,不搞开发就别选。
Power Management Timer Support,我的本本支持HPET(要是忘了是什么,再看看前面),所以不选它。要是你的机器不支持,应该把它选上。
2.6内核的配置与编译(7)
APM (Advanced Power Management) BIOS Support —>
<M> APM (Advanced Power Management) BIOS support
[ ] Ignore USER SUSPEND
[*] Enable PM at boot time
[ ] Make CPU Idle calls when idle
[ ] Enable console blanking using APM
[ ] RTC stores time in GMT
[ ] Allow interrupts during APM BIOS calls
[*] Use real mode APM BIOS call to power off
APM (Advanced Power Management) BIOS support,高级电源管理的支持,一般来说笔记本应该选上,台式机可以不选。
Ignore USER SUSPEND,只有NEC Versa M系列的笔记本需要选择这一项。
Enable PM at boot time,启动时支持电源管理,选上这个选项能让系统自动的进行电源管理,除非在启动时死机,才不要选这项。
Make CPU Idle calls when idle,系统空闲时调用空闲指令。只有老式的CPU才用这项。其实调用空闲指令还是让CPU执行了一条指令。这个选项在内核循环中调用空闲指令。
Enable console blanking using APM,支持关闭监视器。据说这项功能对所有的笔记本都无效。如果你都按我的建议配置,系统是能自动休眠的(使用ACPI)。你也不用担心你的显示器一直亮着的。
RTC stores time in GMT,按Unix的标准,硬件的时钟应该设为格林威治时间。还是那句老话,因为我还要用Windows,所以硬件时钟设成了本地时间,当然就不要选这项了。
Allow interrupts during APM BIOS calls,允许APM的BIOS调用时中断。多数的机器不需要这项,Thinkpad的一些新机器需要这项。如果休眠时挂机(包括睡下去就醒不来),再把这项选上。
Use real mode APM BIOS call to power off,建议最好选上此项,保证软件关机。如果你有兴趣可以试试你的机器不选这项能不能正常的软件关机(多数机器不能)。
补充一点,如果既选择了ACPI又选择了APM,先加载的将被使用。
通过这么多的例子,大家应该可以看出来在menuconfig 中,圆括号内是参数,可以选择某一选项或者输入具体的参数。方括号只能选择“Y”或“N”,尖括号除了选择“Y”和“N”还可以选择“M”。“Y”表示将 该选项包括在内核中,menuconfig中以“*”表示。“N”表示不使用此选项的功能,“M”表示将此选项的功能编译成模块。
ACPI是为了取代APM而设计的,因此尽量使用ACPI的功能,实在不行再加载apm模块。
2.6内核的配置与编译(8) ‘
[*] CPU Frequency scaling
[ ] Enable CPUfreq debugging
< > /proc/cpufreq interface (deprecated)
Default CPUFreq governor (performance) —>
— ‘performance’ governor
<M> ‘powersave’ governor
<M> ‘userspace’ governor for userspace frequency scaling
[ ] /proc/sys/cpu/ interface (2.4. / OLD)
<M> ‘ondemand’ cpufreq policy governor
<*> CPU frequency table helpers
<M> ACPI Processor P-States driver
<M> AMD Mobile K6-2/K6-3 PowerNow!
<M> AMD Mobile Athlon/Duron PowerNow!
<M> AMD Opteron/Athlon64 PowerNow!
<M> Cyrix MediaGX/NatSemi Geode Suspend Modulation
<M> Intel Enhanced SpeedStep
[ ] Use ACPI tables to decode valid frequency/voltage pairs
— Built-in tables for Banias CPUs
<M> Intel Speedstep on ICH-M chipsets (ioport interface)
<M> Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface)
<M> Intel Pentium 4 clock modulation
< > nVidia nForce2 FSB changing
<M> Transmeta LongRun
<M> VIA Cyrix III Longhaul
— shared options
[ ] /proc/acpi/processor/../performance interface (deprecated)
[ ] Relaxed speedstep capability checks
CPU Frequency scaling,这一选项允许改变CPU的主频,使CPU在低负荷或使用电池时降低主频,达到省电的目的。
Enable CPUfreq debugging,是否允许调试CPU改变主频的功能,如果要调试,还需要在启动时加上参数。cpufreq.debug=<value>
1:变频技术的内核调试
2:变频技术的驱动调试
4:变频技术的调节器调试
/proc/cpufreq interface (deprecated) ,是否允许/proc/cpufreq来调节主频,建议使用默认的sysfs来调节。
Default CPUFreq governor (performance) —>,默认的主频调节,圆括号内的是你选择的结果,这里表示以性能为主。
‘powersave’ governor,最大限度的节约电能调节器。
‘userspace’ governor for userspace frequency scaling,用户自定义调节器。
/proc/sys/cpu/ interface (2.4. / OLD),兼容2.4内核的用户调节器。
‘on …