编译你自己的Linux内核(Kernel)
摘要:
你马上就会发现,你也可以获得(get),配置(configure),编译(compile)和安装(install)属于你自己的Linux内核(Kernel)。
引言
为什么你想要编译并安装一个完全属于你自己的内核(Kernel)?可能是下列原因中的一种吧:
新内核提供更好的硬件支持能力。
新内核有某些特殊的优点,例如,对多处理器(SMP)更好的支持,或者是支持USB。这些特性已经被加入到2.4.x内核中。
新内核修正了一些BUG。
你自己定制的内核去除了多余的元素,因此它更快,更稳定。
编译(或说“轧制”)你自己的内核需要对计算机(译者
注:不仅要对机器本身有了解,还要对Linux系统有一定的了解)有一定的理解——这是一个难题。
因此一个Linux新手是根本不会尝试编译内核的。这篇文章中展示了一些在使用“make xconfig”命令编译内核过程中的截图。
使用这个命令(“make xconfig”),用户可以通过图形用户界面(GUI)和鼠标来对内核进行处理。
这里有差不多40张截图,它们解释了在某种特定的情况下为什么你需要或不能选择某个特定的内核选项(options)。
将这40幅截图逐一讨论看上去似乎有些夸张,但这的确是解释内核的内部工作机理(internal workings)以及特定内核选项存在的原因和工作原理的比较好的方法。
这些截图是kernel-2.4.6的。最新的内核是2.4.19,但是除去在菜单中有一些新的项目(e.g.对新硬件的支持)以外,
屏幕的显示以及编译的过程应该是一样的。建议你在开始编译前把这篇文章打印出来,这样你就可以随时查必要的信息!
本文的结构如下。首先讨论你在Internet的什么地方能够到内核的源码以及如何安装这些源码,
然后通过屏幕截图讨论使用图形界面配置内核。一旦内核配置完毕,它就需要被编译,但是一个新编译的内核并不能直接使用。
首先,新内核需要和引导程序“lilo”一起安装,然后,在使用lilo前你必须写配置文件“/f”。
另外,还有需要指出一些特殊的要点(specific points),比如笔记本电脑需要的PCMCIA支持。
看上去象信用卡的PCMCIA,小型板卡(small inserts)通常负责联网任务,在2.4.x的内核中已经可以直接提供支持。
但之前的内核需要重新编译安装后才能提供PCMCIA支持。SuSE Linux还有一个问题,那就是ALSA声卡驱动程序的音效支持。
这些驱动程序并不是内核的一部分,它们需要被编译进去然后重新安装,因为原始的驱动程序通常没有工作。
更麻烦的是,从一个系列的内核转到另一个系列的内核,比如从2.2.x系列转到2.4.x系列,可能会由于使用某种(某些)内核工具(kernel
utilities)而产生一些问题。这就是所谓的“modutils”(译者注:可以看为“Modules Utilities”的所写,这样就不会对这个名称感到费解了),包括代码(code)需要载入(load)的内核模块(kernel
module):图3解释了什么是内核模块。有时新内核不知道如何处理老的modutils,所以你必须编译和安装更新版本的modutils。
这样的问题虽然不多但是它们的确存在,而且目前只能预先指出它们。
但是如果你完全按照本文的步骤进行,几乎不会发生错误。新内核被添加到lilo,或者被复制(copy)到loadlin所在的分区。
因此,在紧急情况下,你仍然可以通过老内核启动机器。然后可以在老内核下试着解决新内核的问题。
即使你遇到modutils的问题,你也可以从老内核重新启动计算机,然后通过将它们(内核和modutils)分别编译和安装来修复(fix)这个问
题:所有新版本的modutils都对老内核向下兼容,所以新modutils在老内核下可以很好的工作。
安装内核源码
你在这一节所进行的所有工作都需要root权限,所以你必须以root登录(login)。
首先,也是最重要的,你必须安装内核源码,比如从安装盘上。在SuSE中,源码是被放在“d”类(为开发准备的文档)的“lx_kernel”包中。
安装适合你的发行版(distribution)的内核是比较适当的,因为不同的GUI在那时都会被自动安装。
一旦这件事情完成,最新版本的Linux内核的tar包,比如linux-2.4.6.tar.bz2可以从
/pub/linux/utils/kernel/modutils/v2.4/
。注意modutils的版本号和内核的版本号可以不完全吻合:只需要下载并安装最新的版本就行。编译并安装modutils将在后面的“安装modutils”讨论,现在我们先讨论内核的安装。你机器上的内核(译者注:指的是你的老内核)的源码被放在/usr/src/linux/目录下。比较明智的做法是保证源码的安全,比如通过更名(rename)linux目录:
cd/usr/src
mv linux linux-2.2.19(如果原来的内核源码是2.2.19.的)
只有当你安全的保存了原始内核后,你才可以解包新的内核:你将会看见linux-2.4.6.tar.bz2默认将所有东西解包到
“linux”目录,如果这个目录已经存在,它将重写这个目录,然后,你将会遇到一个麻烦:你无法重新编译老内核,你已经没有它的配置和其他东西。
在这个例子中,我在解包linux-2.4.6.的源码后立即将“linux”更名(rename)为“linux-2.4.6”,并且创建一个新的符号
链接“linux”到“linux-2.4.6”。这样的优点是你可以马上知道系统现在使用的内核的版本。
另外,还可以很容易的安装一个内核补丁(kernel upgrade)。命令是:(以root身份执行,
切记!)
cd/usr/src
cp~/linux-2.4.6.tar.bz2(加入tar包已经下载)
(进入你的家目录(home-directory),“~”)
bzip2-d linux-2.4.6.tar.bz2(这将花费一段时间)
tar-xvf linux-2.4.6.tar
mv linux linux-2.4.6
ln-s/usr/src/linux-2.4.6/usr/src/linux
当你完成这个步骤后,你到kernel的目录下,然后执行:
cd/usr/src/linux
make xconfig(见图1)
图1:
执行“make xconfig”命令后的用于定义(define)你的内核的图形界面。
这是用于定义(define)内核的主菜单。你需要点选(click on)不同的选项。然后点击“Save and Exit”保存你的选择,然后你就可以编译和安装你的内核了(见图40)。但是我们还没有到那一步。(才刚开始呢!)
配置内核(Configuring the kernel)
下面,我展示了配置内核的过程中的一些图片。红帽linux系统下载iso
每幅图片都有为什么会选择特定的选项的说明。仔细阅读这些例子,你会知道我这样选择的原因,你也可以更好的了解那些选项是适合你的。
“help”(帮助)提供了相同的信息。你make
xconfig自己的Linux发行版(distribution)时可以参考“help”。点击“Help”,帮助文档通常会建议你应该选择某个选项。
这些例子当然不可能讨论你所有的硬件设备。但是它们能够说明你应该如何处理自己的硬件,如何查内核是否支持你的硬件。
图2:
“code maturity level options”选项
在这部
分,你可以允许内核的一些试验选项(experimental options)。有时,这些选项是必需的,比如,需要支持新的显卡。
但是,多数情况下,如果这些试验选项(experimental options)导致内核不稳定的话,最好撤销这些选项。
在图1中,你可以看见“IEEE1394(FireWire)support”和“Bluetooth support”选项处于灰状态。
它们对应的代码正处于试验阶段,因此你暂时不能选择它们。
图三:可加载模块支持
.
(从现在起,截图都在超链接里,你可以自己在新的窗口里浏览它们)
加载模块是指内核代码(kernel code)的一些片断,比如驱动程序,当编译内核的时候它们
也被单独编译。
因此,这些代码不是内核的一部分,但是当你需要它的时候,它可以被加载并使用。
通常的建议是如果可能,将内核代码编译成可加载模块,因为这样可以使内核更小,而且更稳定。警告!千万不要将文件系统(File
System)部分的代码编译为可加载模块,见图32。如果你犯了这个错误,将文件系统(File System)部分的代码编译为可加载模块,结果将是内核无法读取它自己的文件系统。
然后内核无法加载它自己的配置文件——一些很明显是在正常启动Linux时所必需的东西。你将会发现我很少使用可加载模块:我喜欢我的内核能够直接和硬件对话,但这只是我自己的偏好。
图4:选择处理器类型(processor type)和特征(features)
.
这里,你可以选择你的处理器(Processor)的类型,决定是否选择不同的选项。通常“/dev/cpu”选项更高级,多数用户并不需要选择它。
“High Memory Support”只有当你的计算机有超过1GB内存(不是磁盘空间)时才是必须的。多数计算机的内存从64到512MB(并且拥有8到60GB硬盘空间),因此“High Memory Support”通常并不使用。
如果你的计算机是386或486SX的话,你必须打开“Math Emulation”选项。这些老系统没有Linux需要的浮点运算单元(Math
Emulation,也称数学协处理器),所以必须选择“Math Emulation”选项。
实际上现在所有的处理器都集成了浮点运算单元(译者注:从586级开始所有CPU集成了浮点运算单元),所以通常你可以不选择这个选项。
“MTRR”选项允许在PCI或者AGP总线众进行更快速的通讯。
由于现在所有系统都将它们的显卡接在PCI或AGP总线上,你通常需要选择“MTRR”:无论如何,打开这个选项通常都是安全的——即使你的机器没有使用
PCI或AGP总线的显卡。对称多处理器(SMP)需要能够支持超过一个处理器的主板,比如一块支持双Pentium II处理器的主板。
“Symmetric multi-processing”选项保证内核能够以最佳方式加载双处理器。
最后一个选项(“APIC”选项)通常也需要多处理器,但它通常是关闭的。
图5:常规内核选项
.
这里,你可以制定特定的内核常规选项。通常每个人都会选择“Networking support”,因为你通常需要它,比如Internel。
Linux有很重的Internet偏向,而且它在没有联网的情况下无法充分发挥优势。
另外,许多其他的操作也网络支持——即使它们看上去跟网络没多大关系。
内核在没有网络支持选项的情况下甚至无法编译。简而言之:一定要打开“Networking support”选项。
现在的所有系统都使用PCI总线,所以你应该选择相关选项。“PCMCIA/CardBus support”选项处于灰不可用状态,因为你刚才已经选择你不虚妄使用试验代码(见图2)。如果你使用笔记本电脑,你当然需要内核支持PCMCIA/CardBus以便使用网卡或者调制解调器(modem,即通常所说的“猫”)。(请参考
“PCMCIA支持(笔记本电脑)”)“System V IPC”允许程序通信和同步,“BSD process accounting”保持诸如进程结束时产生的错误代码的东西,“Sysctl
support”允许程序修改某些内核选项而不需要重新编译内核或者重新启动计算机。这些选项通常是打开的。
现在的Linux发行版(distributions)以ELF格式作为它们的“内核核心格式”(kernel core (/proc/kcore/)format):这是不同系统库(system
libraries)的标准格式,比如那种格式的提供给程序使用的系统代码片断。
“ELF”是已淘汰的“a.out”格式的继承者,和Microsoft Windows的.dll文件。
现在,所有Linux程序都使用ELF库(ELF library),不幸的是有些老的程序仍然需要a.out 格式支持。一个典型的例子是“Word
Perfect8for XWindow”:这个应用程序只有在a.out格式下可用,所以“xwp”无法在没有a.out 格式支持的情况下运行。
如果你想用“xwp”,将“a.out”作为一个可加载模块。我还把“MISC”作为一个可加载模块。原则上,我并不使用它,但是如果你经常使用java,python或者DOS模拟器“DOSEMU”,这样可能更方便。我还打开了“Power
Management support”和“Advanced Power Management BIOS
support”选项(在图5中没有显示)。ATX主板需要这两个选项来自动关闭计算机(turn off t he computer,包括关闭电源)。
另外的电源管理功能被关闭是因为它们在XWindow下无法正常工作,而我通常在XWindow 下使用Linux。
KDE和Gnome有它们自己的标准电源管理功能。
图6:配置存储设备(Memory Technology Devices)
.
需要这个选项来使Linux可以读取闪存卡(Flash Card)之类的存储器。闪存卡通常用于数码相机。
通过这个选项,Linux可以读取闪存卡(从特殊的设备中,比如读卡机),并且将图片保存为.jpg格式。
除非你确定你需要它,否则不必打开它:如果你发现自己需要,你可以在以后加上。
图7:配置并口(parallel port)
.
在USB技术出现以前,并口是最常用的连接计算机和打印机、扫描仪的方式。我的打印机使用了一个并口,所以我希望这个端口在Linux下可用。注意,配置并口和配置打印机不同:这将在后面的图28讨论。
图8:配置即插即用(PnP)设备
.
乎所有人都有即插即用设备,因此需要这个选项的支持。打开这个选项使内核能够自动配置即插即用设备并且使它们在系统中能够使用。
有时需要在BIOS中打开“Plug&Play OS”,否则Linux(当然Windows也一样)无法配置即插即用设备。“ISA
Plug&Play support”选项需要以即插即用模式运行的ISA卡(ISA Card)。
例如AWE64声卡。ISA总线(ISA bus)从来都没有即插即用标准,这增加了配置这些板卡的难度。
在2.4.x内核之前的早些时候,Linux用户在启动时必须呼叫(call)“isapnp”程序(isapnptools 包,使用rpm qil