鸟哥的 Linux 私房菜 -- Linux 核心编译

since2012/04/23

     
 
最近更新日期:2007/06/27
本文已不再维护,更新文章请参考此处
我们在前面的几个章节介绍了 Linux 其实指的就是核心而已,而整个 Linux 的世界当中, 最重要的也就是核心了!他控制了您的服务器的所有硬件,也控制了所有的您想要的功能, 例如软件磁盘阵列(RAID)、各种适配卡的驱动模块、防火墙的新增功能等等。透过管理您的 Linux 核心,将可让您的服务器跑得更加的顺畅,也更稳定您的服务器所提供的相关服务呢! 此外,为了让硬件驱动程序与相关的核心功能修订容易,所以 Linux 核心是支持『模块化』的,也就是说,您核心所想要的功能可以『后来才加挂上去』喔! 那么如何加挂上去呢?这就需要了解一下所谓的『模块』了!当然,连同模块的相关指令就得也要会用啰!^_^

大标题的图示前言:
我们在第一章 Linux 是什么里面就谈过 Linux 其实指的是核心! 这个『核心 (kernel)』是整个操作系统的最底层,他负责了整个硬件的驱动, 以及各个核心工具的提供,包括防火墙机制、是否支持 LVM 或 Quota 等文件系统等等, 这些都是核心所负责与提供的!也就因为如此,所以开机过程当中,除了 MBR 之外, 第一个读入系统内存当中的,就是核心档案。

如果你还记得开机流程里面提到的相关信息的话, 那么就知道,基本上,核心就是用来控制您的硬件系统的,您想要硬件帮您达成的任何工作, 都得要透过『核心』来帮您达成啊!换句话说,如果您的『核心』并没有支持您的某项硬设备, 也就是核心无法『认识』您的某项硬件,呵呵!那么该硬件也就无法在这样的核心底下工作了!


小标题的图示 什么是核心( Kernel )
这已经是整个 Linux 基础的最后一篇了,所以,底下这些数据您应该都要『很有概念』才行~ 不能只是『好像有印象』~~好了,那就复习一下几个名词吧!

  • Kernel:
  • 还记得我们在前面的 BASH shell 部分提到过:计算机真正在工作的东西其实是『硬件』, 例如数值运算要使用到 CPU、数据储存要使用到硬盘、图形显示会用到显示适配器、 音乐发声要有音效芯片、连接 Internet 可能需要网络卡等等。那么如何控制这些硬件呢? 那就是核心的工作了!也就是说,你所希望计算机帮你达成的各项工作, 都需要透过『核心』的帮助才行! 当然啰,如果你想要达成的工作是核心所没有提供的, 那么你自然就没有办法透过核心来控制计算机使他工作啰!

    举例来说,如果你想要有某个网络功能 ( 例如核心防火墙机制 ) , 但是你的核心偏偏忘记加进去这项功能,那么不论你如何『卖力』的设定该网络套件,很抱歉! 不来电?换句话说,你想要让计算机进行的工作,都必须要『核心有支持』才可以 !!这个标准不论在 Windows 或 Linux 这几个操作系统上都相同! 如果有一个人开发出来一个『全新的硬件』,目前的核心不论 Windows 或 Linux 都不支援,呵呵!那么不论你用什么系统,哈哈! 这个硬件都是英雄无用武之地啦!那么是否了解了『核心』的重要了呢?没错! 所以我们才需要来了解一下如何编译我们的核心啦!

    那么核心到底是什么啊?讲了这么多??其实核心就是系统上面的一个档案而已, 这个档案包含了驱动主机各项硬件的侦测程序与驱动模块,在 开机流程分析 章节当中,我们也提到这个档案被读入主存储器的时机是:
    1. BIOS
    2. MBR 载入 Loader ( Linux 中的 Lilo 或 Grub 或 SPFdisk等等 )
    3. 藉由 Loader 的辅助,加载核心档案到主存储器当中,此时核心档案解压缩后, 会开始侦测硬件的各项配备,并加载适当的驱动模块来让硬件生效;
    4. 在硬件准备妥当后,加载第一支程序 init ,并藉由 /etc/inittab 的设定来确认预设 run level;
    5. 经由 /etc/inittab 及 run level 来决定执行的各项启动的 scripts ;
    6. 开始执行 login 或 X Window 等待登入等。
    看到了吗?第三个步骤时,我们的系统就可以经由 loader 来将核心加载主存储器当中, 并且开始侦测分析硬件,加载适当的驱动程序,整个主机就可以待命,让用户来执行相关的程序了。 这个核心档案通常被放置成 /boot/vmlinuz ,不过也不见得, 因为一部主机上面可以拥有多个核心档案,只是开机的时候仅能选择一个来加载而已。 甚至我们也可以在一个 distribution 上面放置多个核心,然后以这些核心来做成多重引导呢!

  • 核心模块:
  • 还记得我们之前谈到开机流程分析时,提到的核心模块吧? 既然核心档案都已经包含了硬件侦测与驱动模块,那么什么是核心模块啊? 要注意的是,现在的硬件更新速度太快了,如果我的核心比较旧, 但我换了新的硬件,那么,这个核心肯定无法支持!怎么办?重新拿一个新的核心来处理吗? 开玩笑~核心的编译过程可是很麻烦的~

    所以啰,为了这个缘故,我们的 Linux 很早之前就已经开始使用所谓的模块化设定了! 亦即是将一些不常用的类似驱动程序的咚咚独立出核心,编译成为模块, 然后,核心可以在运作的过程当中加载这个模块到核心的支持当中。 如此一来,我在不需要更动核心的前提之下,只要编译出适当的驱动模块,并且加载他, 呵呵!我的 Linux 就可以使用这个硬件啦!简单又方便!!

    那我的模块放在哪里啊??可恶!当然一定要知道的啦!就是 /lib/modules/`uname -r`/ 当中啦!

  • 核心编译:
  • 刚刚上面谈到的核心其实是一个档案,那么这个档案怎么来的?呵呵~ 当然是透过原始码 (source code) 编译而成的啊!因为核心是直接被读入到主存储器当中的, 所以当然要将他编译成为系统可以认识的数据才行!也就是说, 我们必须要取得核心的原始码,然后利用 Source code 与 Tarball 章节当中提到的编译概念来达成核心的编译才行啊!(这也是本章的重点啊! ^_^)

  • 关于驱动程序与核心的问题
  • 既然核心与硬件是息息相关的,那么是否意味着每次有厂商推出新版本的硬件时, 我们都需要『重新编译核心』啊?好加在!并不需要的喔!因为我们 Linux 的核心相当的具有弹性,他是支持模块化的,也就是说,只要新硬件可以推出搭配核心的驱动模块( 也就是大家口头上常常讲的『驱动程序』 ),那么我们只要将该模块挂加载核心,核心就可以支持该硬件啦!

    但是,很多朋友还是常常感到困惑,就是 Linux 上面针对最新硬件的驱动程序总是慢了几个脚步, 所以觉得好像 Linux 的支持度不足!其实不可以这么说的,为什么呢?因为在 Windows 上面,对于最新硬件的驱动程序需求,基本上, 也都是厂商提供的驱动程序才能让该硬件工作的,因此,在这个『驱动程序开发』的工作上面来说, 应该是属于硬件发展厂商的问题,因为他要我们买他的硬件, 自然就要提供消费者能够使用的驱动程序啦!所以,如果大家想要让某个硬件能够在 Linux 上面跑的话,那么似乎可以发起一人一信的方式,强烈要求硬件开发商发展 Linux 上面的驱动程序!这样一来,也可以促进 Linux 的发展呢!


    小标题的图示我干嘛要更新核心
    这个『核心』是除了 BIOS 之外,一个操作系统中最早被启动的东西, 他包含了所有可以让硬件与软件工作的信息,所以,如果没有搞定核心的话, 那么你的系统肯定会有点小问题!好了,那么是不是将『 所有目前核心有支持的东西都给他编译进去我的核心中, 那就可以支持目前所有的硬件与可执行的工作啦!』!

    这话说的是没错啦,但是你是否曾经看过一个为了怕自己今天出门会口渴、会饿、会冷、会热、会被车撞、 会摔跤、会被性骚扰,而在自己的大包包里面放了大瓶矿泉水、便当、厚外套、短裤、防撞钢梁、止滑垫、 电击棒....等一大堆东西,结果却累死在半路上的案例吗?当然有!但是很少啦!我相信不太有人会这样做! ( 会这么做的人通常都已经在医院了~ ) 取而代之的是会看一下天气,冷了就只带外套, 热了就只带短衣、如果穿的漂亮一点又预计晚点回家就多带个电击棒、 出远门到没有便利商店的地方才多带矿泉水....

    说这个干什么!对啦!就是要您了解到,核心的编译重点在于『你要你的 Linux 作什么?』,是啦!如果没有必要的工作,就干脆不要加在你的核心当中了!这样才能让你的 Linux 跑得更稳、更顺畅!这也是为什么我们要编译核心的最主要原因了!
    Tips:
    说到这里突然想到以前国军研究的『经国号战斗机』事件,在当时, 经国号里头的配备都是『最棒的!』包括测量仪器、瞄准配备、武器系统等等,但是呢, 却配上一部普普通通的客机用引擎!挖哩ㄌㄟ?最早期试飞的时候, 经国号竟然只能『在跑道上滑行!』真是悲哀!同样的道理, Linux 的核心也是这样的,如果你的硬件与核心之间没有办法达到良好的配合,那么 Linux 确实可能会跑得不很顺畅!!
    鸟哥的图示
    Linux 的核心有几个主要的特色,除了『Kernel 可以随时、随各人喜好而更动』之外,Kernel 的『版本更动次数太频繁』也是一个特点!所以啰,除非你有特殊需求, 否则一次编译成功就可以啦!不需要随时保持最新的核心版本,而且也没有必要 ( 编译一次核心要粉久的ㄋㄟ! ) 。话说到这里又突然想到今天看到的一篇文章,大意是说老板想要雇用的人会希望是 Linux 的老手,因为他们比较容易了解问题的所在,除此之外,如果有任何问题发生,由于其使用 Linux 是可以随时修补漏洞的!但是如果是 Windows 的话,就得要将机器关闭,直到 MS 推出修补套件后才能再启用~

    那么是否『我就一定需要在安装好了 Linux 之后就赶紧给他编译核心呢?』, 老实说,『并不需要的』!这是因为几乎在每一个 distribution 当中,他们已经预设好了相当大量的模块了, 所以几乎使用者常常或者可能会使用到的数据都已经被编译成为模块,也因此,呵呵! 我们使用者确实不太需要重新来编译核心!尤其是『一般的使用者, 由于系统已经将核心编译的相当的适合一般使用者使用了,因此一般入门的使用者,基本上, 不太需要编译核心』。

    OK!那么鸟哥闲闲没事干跑来写个什么东西?既然都不需要编译核心还写编译核心的分享文章, 鸟哥卖弄才学呀!?很抱歉,鸟哥虽然是个『不学有术』的混混,却也不会平白无故的写东西要您来指教~ 当然是有需要才会来编译核心啦!编译核心的时机可以归纳为几大类:
    • 新功能的需求
      我需要新的功能,而这个功能只有在新的核心里面才有,那么为了获得这个功能,只好来重新编译我的核心了 ( 例如 iptables 这个防火墙机制只有在 2.4.xx 版本里面才有,而新出产的 AGP 显示适配器,很多也需要新的核心推出之后,才能正常而且有效率的工作!) 再举个例子, 之前的 Red Hat 7.2 的版本中,由于预设是将 CD-ROM 编译成核心的『模块』, 也就是说,核心本身还没有支持 CD-ROM 的功能,必须要挂上模块之后才能使用与读取这个 CD-ROM !是否觉得很麻烦呢?呵呵!那么这个时候,如果你想要直接让 kernel 支持 CD ROM 的话,就得要重新编译核心啰;

    • 原本核心太过臃肿
      如果您是那种对于系统『稳定性』很要求的人, 那么对于核心多编译了很多莫名其妙的功能而不太喜欢的时候, 那么就可以重新编译核心来取消掉该功能啰;

    • 与硬件的搭配稳定性
      由于原本 Linux 的核心大多是针对 Intel 的 CPU 来作开发的,所以如果你的 CPU 是 AMD 的系统时,有可能 ( 注意!只是有可能,不见得一定会如此 ) 会让系统跑得『不太稳!』就鸟哥的经验来看,使用旧的 Pentum 系列的旧机器安装 Linux 的结果,还没有胡乱当机的经验!但是安装在 K6-2, K6-3 上面的 Linux ,通常需要重新编译一下核心会比较稳定一些!

    • 其他
      就是你需要特殊的环境需求时,就得自行设计你的核心啰!( 像是一些商业的软件包系统,由于需要较为小而美的操作系统, 那么他们的核心就需要更简洁有力了!)
    另外,需要注意重新编译核心虽然可以针对你的硬件作优化的步骤 ( 例如刚刚提到的 CPU 的问题! ) ,不过由于这些优化的步骤对于整体效能的影响是很小很小的, 因此如果是为了增加效能来编译核心的话,基本上,效益不大!然而,如果是针对『系统稳定性』来考虑的话, 那么就有充分的理由来支持您重新编译核心啰!

    如果系统已经运行很久了,而且也没有什么大问题, 加上我又不增加冷门的硬设备,那么建议就不需要重新编译核心了!』, 因为重新编译核心的最主要目的是『想让系统变的更稳!』既然您的 Linux 主机已经达到这个目的了,何必再编译核心?不过,就如同前面提到的, 由于预设的核心不见得适合您的需要,加上预设的核心可能并无法与您的硬件配备相配合, 此时才开始考虑重新编译核心吧!
    Tips:
    早期鸟哥是强调最好重新编译核心的一群啦!不过,最近这个想法改变了~ 既然原本的 distribution 都已经帮我们考虑好如何使用核心了,那么, 我们也不需要再重新的编译核心啦!尤其是 distribution 都会主动的释出新版的核心 RPM 版本, 所以,实在不需要自己重新编译的!当然啦,如同前面提到的, 如果您有特殊需求的话,那就另当别论噜! ^_^
    鸟哥的图示
    然而由于『核心的主要工作是在控制硬件!』所以编译核心之前, 请先了解一下您的硬件配备,与您这部主机的未来功能!由于核心是『 越简单越好!』所以只要将这部主机的未来功能给他编进去就好了! 其他的就不用去理他啦!


    小标题的图示 核心的版本与何处下载最新核心
    既然这一章的内容要讨论的是如何编译核心,那么我们就来聊一聊核心的版本吧!

  • 核心的版本:
  • 由于不同的核心版本之间,使用的函式库并不相同,所以,我们必须要知道自己的 Linux 核心版本之后,才能够取用最新支持的核心版本来编译新的核心啊!那么要在哪里找到这个核心的信息呢? 应该还记得那个 uname 查看的信息吧!没错!就是他了,可以使用其功能来查询目前在工作的核心版本:
    [root@linux ~]# uname -r
    2.6.13-1.1532_FC4
    # 因为鸟哥的 FC4 已经升级核心多次,所以这个版本应该与你的不同!
    
    看到了吧!那个东西就是核心版本的信息啦!好了!我们依照 RPM 版本的先例,也来谈一谈 kernel 的版本吧!基本上, kernel 的版本可以区分为:
      [主版本].[次版本].[释出版本(release)]-[修改版本]
    整个版本的定义当中,最需要注意的是前两个,亦即主版本与次版本。 相同的[主][次]版本,代表他使用的函式库是差不多的,所以,可以直接升级到较高的[释出版本]上。 值得注意的是,由于核心功能的增加速度实在太快了,一般商业用户与一般用户, 根本不需要很多的测试中的功能,因此,[主][次]版本中,依据[次版本]的奇偶数, 又分为底下两种版本:
    • 如果[次版本]是奇数的话,例如 2.3, 2.5 等等,那表示他是一个『 测试性质功能的核心版本 』, 这种核心通常是在推出稳定版本的核心之前,用来给 developer ( 核心维护更新测试者!) 测试用的!虽然功能较为强大,但是由于是属于测试性质,所以可能会有些许的 bugs 也说不定;

    • 如果[次版本]是偶数的话,例如 2.4, 2.6 等等,那表示他是一个经过测试之后才释出的 『稳定核心版本,这种核心较为稳定不容易出错, 比较适合一般个人或者是商业使用!
    所以啦!我们要升级的时候,大多就是使用那种偶数的核心版本啦!不过这里还是要再提一遍!就是『 2.4 与 2.6 是两个具有相当大差异的核心版本, 两者之间使用到的函式库基本上已经不相同了,所以在升级之前,如果您的核心原本是 2.4.xx 版,那么就升级到 2.4.xx 版本的最新版,不要由 2.4.xx 直接升级到 2.6.xx 版,否则到时可能会欲哭无泪~~』, 这个问题在讨论区一再地被提起!这里再次说明!
    Tips:
    为什么不能从 2.4 升级到 2.6 呢?其实还是可以啦!只是过程很复杂! 我们知道软件 (packages) 是架构在系统核心上面来进行编译、安装与执行的, 也就是说,这些 packages 与核心之间,是有相关性的!这些 packages 会用到很多核心提供的功能。 但是不同的[主][次]版本之间,他们提供的功能架构差异太大,因此,若你由 2.4 升级到 2.6 的话, 那么绝大部分的软件『都需要重新再编译!』这样了解为何不要在不同的版本间升级了吧?
    鸟哥的图示
    此外,2.4.xx 与 2.6.xx 的比较中,并不是 2.6.xx 就一定比 2.4.xx 还要新,因为这两种版本同时在进行维护与升级的工作!如果有兴趣的话,可以前往 Linux 核心网站 http://www.kernel.org 一看究竟,您就可以了解目前的核心变动情况了!

    基本上,目前最新的 distributions ,包括 FC, SuSE, Mandriva 等等,都使用 2.6 的核心, 所以,您可以直接由 http://www.kernel.org 下载最新的 2.6.xx 版本的核心来尝试编译啊!目前 (2005/11/20) 鸟哥可以查到的最新版本是 2.6.14-2 , 底下我们将主要以这个版本来测试。另外,由于较新的核心版本可能会多出一些选项, 因此若有不同的项目也没有关系!稍微查看一下说明内容就可以了解啦!

    例题:什么是『释出版本』?
    答:
      由于核心的新功能增加太快,为了要统合这些功能,因此,每隔一段时间的稳定性测试后, 这些新功能才会被放到原本的核心内,最后被推出。而为了与前一个核心原始码作区别, 所以就被加上一个数字较高的『释出版本』数字了。
    例题:那什么是『修改版本』?
    答:
      由于原本的核心原始码可能有点 bugs 在里面,经过程序开发人员的程序代码修改后 (debug), 再重新推出的一个类似加强版的意思。基本功能是不变的,只是有问题的地方被克服而已。

  • 核心下载地点:
  • Linux 的核心目前是由其发明者 Linus Torvalds 所属团队在负责维护的, 而其网站在底下的站址上,在该网站上可以找到最新的 kernel 信息!不过,美中不足的是目前的核心越来越大了 ( linux-2.6.14.2.tar.bz2 这一版,这一个档案大约 37MB 了! ),所以如果你的 ISP 连外很慢的话, 那么使用台湾的映射站台来下载不失为一个好方法:

    大标题的图示核心原始码的取得与升级
    既然核心是个档案,要制作这个档案给系统使用则需要编译,既然要有编译,当然就得要有原始码啊! 那么原始码怎么来?除了刚刚前一个小节提到的,需要注意核心的版本之外,还有哪些要注意的事项??


    小标题的图示取得原本的 distributions 提供的 kernel source
    事实上,各大主要 distributions 在推出他们的产品时,其实已经都附上了核心原始码了! 以我们的 FC4 为例,你如果有安装工具程序的话,那么应该就可以利用 rpm 找到套件名称为 kernel-devel 的套件,那就是我们的核心原始码了(这个套件名称在各个不同的版本上头都不一样! 所以,您应该要使用 rpm -qa | grep kernel 来寻找喔!)。如果还是找不到,那表示你没有安装啊! 此时,拿出原版光盘,一片一片去 mount 且搜寻一下,肯定可以找到的啦! 然后安装他就好了!

    既然要重新编译,那么干嘛还要使用原本 distributions 释出的原始码啊?真没创意~ 话不是这么说,因为原本的 distribution 释出的原始码当中,含有他们设定好的预设设定值, 所以,我们可以轻易的就了解到当初他们是如何选择与核心及模块有关的各项设定项目的参数值, 那么就可以利用这些可以配合我们 Linux 系统的默认参数来加以修改,如此一来, 我们就可以『修改核心,调整到自己喜欢的样子』啰!而且编译的难度也会比较低一点!


    小标题的图示取得最新的核心
    虽然使用原本的 source code 来重新编译核心比较方便,但是,如此一来, 新硬件所需要的新驱动程序,也就无法藉由原本的核心原始码来编译啊! 所以啰,如果是站在要更新驱动程序的立场来看,当然使用最新的核心会比较好啊!

    取得最新的核心版本,上一个小节已经讲过了,请自行前往 http://www.kernel.org 去下载吧!


    小标题的图示保留原本设定:利用 patch 升级核心原始码
    如果你曾经自行以最新的核心版本来编译过核心,那么你的系统当中应该已经存在前几个版本的核心原始码, 以及上次你自行编译的参数设定值才对。如果您只是想要更新到最新版本的核心, 原本的参数设定值并不要进行大幅度的修改,那么该如何是好?

    呵呵!每一次核心释出时,除了释出完整的核心压缩文件之外,也会释出『该版本与前一版本的差异性 patch 档案』, 关于 patch 的制作我们已经在 原始码与 tarball 章节当中提及, 您可以自行前往参考。这里仅是要提供给您的是,每个核心的 patch 仅有针对前一版的核心来分析而已, 所以,万一你想要由 2.6.10 升级到 2.6.14 的话,那么你就得要下载 2.6.11, 2.6.12, 2.6.13 及 2.6.14 的 patch file ,然后『依次』一个一个的去进行 patch , 才能够升级到 2.6.14 喔!这个重要!不要忘记了。

    在进行完 patch 之后,你可以直接检查一下原本的设定值,如果没有问题, 就可以直接编译,而不需要再重新的选择核心的参数值,这也是一个省时间的方法啊! 至于 patch file 的下载,同样是在 kernel 的相同目录下,寻找文件名是 patch 开头的就是了。


    小标题的图示核心目录下的次目录信息
    假设你已经有安装了核心的原始码,以 FC4 为例,他的预设核心原始码放置在 /usr/src/kernels/2.6.11-1.1369_FC4-i686/ 这个目录下,在该目录下,基本上有这几个目录:
    arch	:与硬件平台有关的项目,例如 CPU 的等级等等;
    crypto	:核心所支持的加密的技术,例如 md5 或者是 des 等等;
    drivers	:一些硬件的驱动程序,例如显示适配器、网络卡、PCI 相关硬件等等;
    fs	:核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等;
    lib	:一些函式库;
    net	:与网络有关的各项协议数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等;
    sound	:与音效有关的各项模块;
    
    每个目录底下也都含有很多不同的次目录,例如 drivers 目录下就含有 net, sound, usb, pci, vedio... 等等多到数不清的次目录,这些目录底下还是含有相关的硬件驱动模块等等~呵呵~想要完整的了解是很难的啦! 例如,核心使如何让工作排到 CPU 去执行的?核心是如何存取物理内存与 Swap ? 核心是如何读取各不同的 filesystems 等等,如果有兴趣的话, 那么最新核心档案解压缩之后,都会有个 Documentation 的目录, 可以进去查阅各个相关的说明啊! ^_^


    大标题的图示设定核心的编译设定 (Makefile)
    就如同我们在原始码与 tarball 的章节当中提到的, 由于各个主机硬件都不相同,所以当然需要针对我们的主机环境来选择可以编译的项目啦!那就是 Makefile 的编辑。但是核心的数据实在多到不行~所以,核心有提供不少的工具来让我们简单的进行参数的设定喔!


    小标题的图示如何编辑核心的 Makefile
    在这一章当中,鸟哥假设你是以 http://www.kernel.org 这个核心官方网站下载最新的核心版本来编译的, 鸟哥下载的是 2.6.14-2 版,下载的完整网址在: 如果你是以 FC4 系统默认的核心原始码来重新编译, 那么请自行安装 kernel-devel 这个套件,以及前往 /usr/src/kernels/ 目录下, 找到核心原始码;如果您之前已经以下载的核心档案编译过核心, 那么请依序下载各 patch 档案,然后请自行参考 patch 的用法以及找到相关的路径吧!反正,这一章当中,我假设您与我一样, 使用的是最新版的核心就是了。

    假设你下载之后将整个档案放置到 /root 内,那么首先请解压缩吧!
    [root@linux ~]# cd /usr/src
    [root@linux src]# tar -jxvf /root/linux-2.6.14.2.tar.bz2
    # 这个时候就会产生一个 /usr/src/linux-2.6.14.2 的目录,该目录就是 source code。
    # 不过,这个目录下有个 README 的档案务必参考,此外,
    # 还有个 Documentation 的目录,也可以仔细的看一看喔!
    
    [root@linux src]# cd linux-2.6.14.2
    [root@linux linux-2.6.14.2]# make mrproper
    # 这个过程在删除一些以前留下来的 .o 档案。
    
    特别留意一下,核心的原始码最好不要直接放置到 /usr/src/linux 这个目录, 这是因为该目录是很多的软件读取核心功能的目录,如果你将这个新核心放置到 /usr/src/linux 下时, 可能会让某些软件读到错误的核心档案。因此,您才可能看到目前的核心原始码都放到 /usr/src/kernels/ 目录下 (FC4 的默认放置目录)。 所以,我们新的核心主要建议您还是放置到 /usr/src/ 目录下, 但是目录名称保持 linux-2.6.14.2 即可,不必更名为 linux 啰!这点重要!

    另外,在进行核心的参数设定之前,务必要执行『 make mrproper 』这个项目, 还记得原始码的编译过程吧?编译过程会有 *.o 的目标档案对吧! 那这些 *.o 必须要先删除啊!否则可能会产生旧的数据啊!这个要注意。

    另外,其实我们也知道,整个原始码的编译过程当中,那个 Makefile 占有举足轻重的地位的! 这是因为我们的 make 取用的参数数据都是记录在 Makefile 档案当中啊! 所以啰,你必须要确定你的系统已经安装了 make, gcc 等等的编译套件, 否则是无法进行编译的。此外,核心的 Makefile 没有办法像一些软件一样, 简单的使用 ./configure 就能够自动的侦测主机。这是因为每个人对于核心的要求都不一样嘛! 好了,那么如何建立 Makefile 啊?难道要手动去编辑??当然不是啦! 我们可以透过核心提供的功能,就是那个 make menuconfig 来达成喔!
    • make menuconfig
      利用类似选单模式的方式来进行核心参数的挑选,好处是,他是纯文本模式的! 不需要启动 X Window ,还可以远程登录进行核心参数的挑选!真方便!

    • make xconfig
      利用 X Window 的功能来进行挑选,是图形接口的,很华丽~不过,当然就比较耗系统资源。 如果你的服务器没有安装 X Window ,那就别提了!

    • make gconfig
      利用 GDK 函式库的图形接口来选择,也是需要 X Window 的支持才行!
    还有一些早期的编译流程,不过不好用,所以鸟哥就不介绍了。我这里推荐您使用 make menuconfig 来进行核心参数的挑选。这是因为很多的服务器本来就可能没有 X Window , 加上 make menuconfig 也可以作类似图形化接口的选单模式,可以随时作参数的选择, 方便又好用! ^_^。只要在 /usr/src/linux-2.6.14.2 目录下,输入『make menuconfig』 就可以出现如下的画面喔!

    核心编译工作前的参数挑选
    图、核心编译工作前的参数挑选

    看到上面的图是之后,你会发现主要分为两大画面,一个是大框框内的反白光柱,另一个则是底下的小框框, 里面有 select, exit 与 help 三个选项的内容。这几个组件的用法如下:
    • 最底下的 <Select> <Exit> <Help> :可以使用『左右键』来移动光标;
    • 上下键可以移动上面大框框部分的 Code maturity level options 那一行! 若该行有箭头『 ---> 』则表示该行内部还有其他细项需要来设定的意思;
    • 当以『上下键』选择好想要设定的项目之后,并以『左右键』选择 <Select> 之后, 按下『 Enter 』就可以进入该项目去作更进一步的细部设定啰;
    • 在细部项目的设定当中,如果前面有 [ ] 或 < > 符号时,该项目才可以选择, 而选择可以使用『空格键』来选择;
    • 若为 [*] <*> 则表示编译进核心;若为 <M> 则表示编译成模块! 尽量在不知道该项目为何时,且有模块可以选,那么就可以直接选择为模块啰!
    • 当在细项目选择 <Exit> 后,并按下 Enter ,那么就可以离开该细部项目啰!
    基本上建议只要『上下左右 空白 及 Enter 』这六个按键就好了!不要使用 Esc ,否则一不小心就有可能按错的!另外,关于整个核心的内容选择上面,建议您可以这样思考:
    • 『肯定』核心一定要的功能,直接编译进核心内;
    • 『可能在未来会用到』的功能,那么尽量编译成为模块;
    • 『不知道那个东西要干嘛的,看 help 也看不懂』的话,那么就保留默认值,或者将他编译成为模块;
    总之,尽量保持核心小而美,剩下的,就编译成为模块,尤其是『需要考虑到未来扩充性』, 像鸟哥之前认为螃蟹卡就够我用的了,结果,后来竟然网站流量大增,鸟哥只好改换 3Com 的网络卡。 不过,我的核心却没有相关的模块可以使用~因为.....鸟哥自己编译的核心忘记加入这个模块了。 最后,只好重新编译一次核心的模块,呵呵!真是惨痛的教训啊!


    小标题的图示核心的内容与模块设定
    由上面的图示当中,我们知道核心的可以选择的项目有很多啊! 光是第一面,就有 17 个项目,每个项目内还有不同的细项!哇!真是很麻烦啊~ 而每个项目其实都可能有 <Help> 的说明,所以,如果看到不懂的项目, 务必要使用 Help 查阅查阅!好了,底下我们就一个一个项目来看看如何选择吧!


  • Code maturity level options(核心的 code 开发维护)
  • 这个项目主要在设计您的核心是否要支持一些尚未测试的很完整功能。 一般来说,我们是一般用户,不是 kernel 的开发维护者,所以,当然不需要额外的功能啦! 所以,鸟哥这里的选择是比较保守的 (不使用额外功能),也因为如此, 所以底下的很多项目当中,可能不会出现一些较为特殊的选项喔!这个要注意! 鸟哥的选择如下:
    [ ] Prompt for development and/or incomplete code/drivers
    # 这个可选可不选~不过,鸟哥这里是不选择的啦!
    

  • General setup
  • 这个项目则是关于核心的一般设定,包括核心的附加版本信息等等,都可以在这里设定。
    ()  Local version - append to kernel release
    [ ] Automatically append version information to the version string (NEW)
    	# 上面这两个都与核心的附加版本有关。例如 FC4 的核心版本为
    	# 2.6.14-1.1637_FC4 ,后面那个 1.1637_FC4 就是那个附加版本啦!
    [*] Support for paging of anonymous memory (swap)
    	# 这个与 swap 的使用有关!当然要选择啦
    [*] System V IPC
    	# IPC 是 Inter Process Communication 的简写,这个与一个 programs
    	# 可以被多人同时启用有关,所以务必要选择才行!
    [*] BSD Process Accounting
    [ ]   BSD Process Accounting version 3 file format
    [*] Sysctl support
    	# 这个就是在产生 /proc/sys 的支持!务必选择!
    [*] Auditing support
    [*]   Enable system-call auditing support
    	# 上面这两个是额外核心功能 (如 SELinux) 加载时所需要的设定!务必选择
    --- Support for hot-pluggable devices
    [*] Kernel Userspace Events
    	# 让核心能够监听使用者的动作。举例来说, USB 装置的联机与否等等的实时装置。
    [ ] Kernel .config support
    ()  Initramfs source file(s)
    [ ] Configure standard kernel features (for small systems)  --->
    
    这里的项目主要都是针对核心与程序之间的相关性来设计的,基本上, 保留默认值即可!除非您想要编辑属于自己的附加版本,那么在上表的第一项按下 Enter 后, 就可以输入一些信息了。不要随便取消上面的任何一个项目, 可能会造成某些程序无法被同时执行的困境喔!


  • Loadable module support
  • 还记得我们上头曾经提过模块这个玩意儿吧!如果你要核心能够支持模块实时加载某些核心功能的话, 那么这里面的设定就显的很重要了!因为他涉及是否支持模块加载啊!
    [*] Enable loadable module support
    [*]   Module unloading
    [*]   Source checksum for all modules
    [*]   Automatic kernel module loading
    
    不用想太多,全部都选择吧!


  • Processor type and features
  • 这个就与您的 CPU 有关啦!我的主机装备的是 P-III 的 CPU ,所以就选择相关的即可。 你要依据你自己的主机来设计喔!不要胡乱选择啊!
    Subarchitecture Type (PC-compatible)  --->
    	(X) PC-compatible    <==这里是次目录
    	( ) AMD Elan
    	( ) Voyager (NCR)
    	( ) NUMAQ (IBM/Sequent)
    	( ) SGI 320/540 (Visual Workstation)
    	# 这里在选择主机的硬件类型。我们使用 PC 兼容的主机啊!选这个就对了。
    
    Processor family (Pentium-III/Celeron(Coppermine)/Pentium-III Xeon)  --->
    	( ) 386         <==这里是次目录
    	( ) 486
    	( ) 586/K5/5x86/6x86/6x86MX
    	( ) Pentium-Classic
    	( ) Pentium-MMX
    	( ) Pentium-Pro
    	( ) Pentium-II/Celeron(pre-Coppermine)
    	(X) Pentium-III/Celeron(Coppermine)/Pentium-III Xeon
    	( ) Pentium M
    	( ) Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon
    	( ) K6/K6-II/K6-III
    	( ) Athlon/Duron/K7
    	( ) Opteron/Athlon64/Hammer/K8
    	( ) Crusoe
    	( ) Efficeon
    	( ) Winchip-C6
    	( ) Winchip-2
    	( ) Winchip-2A/Winchip-
    	( ) GeodeGX1
    	( ) CyrixIII/VIA-C3
    	( ) VIA C3-2 (Nehemiah)
    	# 这里则是 CPU 的等级,我使用的是 P-III ,您得要选择自己的啊!
    
    [*] Generic x86 support
    	# 对 x86 的 CPU 架构支持较佳。
    [*] HPET Timer Support
    [ ] Symmetric multi-processing support
    	# 如果您使用两颗 CPU 以上的系统,这里『务必』要选择!否则不用选
        Preemption Model (No Forced Preemption (Server))  --->
    	(X) No Forced Preemption (Server)
    	( ) Voluntary Kernel Preemption (Desktop)
    	( ) Preemptible Kernel (Low-Latency Desktop)
    	# 这里与 CPU 的效能有关。如果您想要作一个服务器的核心,选择第一个!
    	# 否则,为了稳定,最好选择第二项。
    
    [*] Local APIC support on uniprocessors
    [*]   IO-APIC support on uniprocessors
    	# 单颗 CPU 的环境中,这个项目可以选择起来,让 CPU 具有
    	# Advanced Programmable Interrupt Controller 的功能啊!
    [*] Machine Check Exception
    	# 让 Pentium 系列的 CPU 可以在侦测到 kernel 有问题时,立刻响应到终端接口
    < >   Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4
    < > Toshiba Laptop support
    < > Dell laptop support
    	# 上面这三个就得要看看你的系统是否支持啦!基本上,可以设定成 M 啦!
    [ ] Enable X86 board specific fixups for reboot
    <M> /dev/cpu/microcode - Intel IA32 CPU microcode support
    <M> /dev/cpu/*/msr - Model-specific register support
    <M> /dev/cpu/*/cpuid - CPU information support
    	# 因为我的是 P-III CPU 啊,所以这里当然选择成模块即可!
        Firmware Drivers  --->
           < > BIOS update support for DELL systems via sysfs (NEW)
           < > Dell Systems Management Base Driver (NEW)
    	# 如果你的系统是 Dell 的,那么上面记得编成模块!鸟哥不需要~
        High Memory Support (4GB)  --->
    	( ) off
    	(X) 4GB
    	( ) 64GB
    	# 这个重要!一般来说,我们对于主机的要求是 RAM 越大越好(一般情况下);
    	# 但是,原本的核心支持仅到 1GB 的内存,所以,这里要加大!
    	# 一般的个人计算机主机,或者是 X86 主机,通常只要 4GB 就够了,
    	# 除非是特殊的工业用主机才可以额外插到 4GB 以上的内存!
    	# 如果这里选择成 off 的话,那么您的内存最大只能被捉到 1GB 。
    
    [*] Allocate 3rd-level pagetables from highmem
    	# 这个与 High Memory Support 有关,如果你的内存支持到 4GB,这里可以加入
    [ ] Math emulation
    	# 这个与 CPU 是否具有浮点运算单元有关。目前我们的 CPU (586 以上)
    	# 都已经内建了浮点运算单元了,所以这里可以不要选啦!
    [*] MTRR (Memory Type Range Register) support
    	# 这玩意儿可以让 CPU 具有读取内存特殊区块的能力,尤其在高效能的 AGP
    	# 与相关的 PCI/AGP 总线进行数据传输时,可以增进不少效能。
    	# 选择这个项目后,会产生 /proc/mtrr ,我们的 X 会读取这个咚咚喔。
    [ ] Boot from EFI support (EXPERIMENTAL)
    [*] Enable seccomp to safely compute untrusted bytecode
    	# 这个项目通常要加,不过,如果是嵌入式系统的话,可以不加入!
        Timer frequency (250 HZ)
    	# 这个项目则与核心针对某个事件立即回应的速度有关。一般来说,
    	# 如果是一般桌上计算机,那么反应时间可以调整的快速一点,因为不会有其他事件。
    	# 如果是主机,由于同一时间点可能有多人联机进来,启发的事件太多了,所以,
    	# 这个反应时间反而要调慢一点,会比较稳定,而且效能也不差。通常保留默认值
    	# 250 就很好了。
    

  • Power management options (ACPI, APM)
  • 这部分则是电源管理,主要的内容有底下这些:
    [ ]   Power Management Debug Support
    [ ] Software Suspend
    	# 这个与将目前的环境暂存在 swap 当中有关。万一你想要将目前的资料暂存,
    	# 因为系统可能必须要关机一阵子,那么这个项目可以选择。不过,
    	# 由于可能会有一些问题,所以不建议您使用这个功能(主机也很少用到!)
        ACPI (Advanced Configuration and Power Interface) Support  --->
    	# 这个电源管理模块虽然可以管理你的电源,不过,却会增加核心约 70K ,所以
    	# 对嵌入式系统来说,可能需要考虑考虑。至于 desktop/server 当然就选择啊!
    	[*] ACPI Support
    	[*]   Sleep States
    	[*]     /proc/acpi/sleep (deprecated)
    	# 如果要启动 ACPI 的支持,那上面这几个几乎都是必要的!
    	<M>   AC Adapter
    	<M>   Battery
    	<M>   Button
    	<M>   Video
    	# 这几个则只要编译成为模块即可,因为桌上型与服务器用不到。
    	# 他主要大该都是针对笔记本电脑来设计的! ^_^
    	<*>   Fan
    	<*>   Processor 
    	<*>     Thermal Zone
    	# 每一部主机都有的 CPU/风扇 等,当然也可以编译进核心,也可以设定成模块。
    	<M>   ASUS/Medion Laptop Extras
    	<M>   IBM ThinkPad Laptop Extras 
    	<M>   Toshiba Laptop Extras
    	(2001) Disable ACPI for systems before Jan 1st this year
    	[ ]   Debug Statements
    	[*]   Power Management Timer Support
    
        APM (Advanced Power Management) BIOS Support  --->
    	<*> 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 
    	# 由于鸟哥比较少使用电源管理,所以,我这里大多使用默认值而已。
    
        CPU Frequency scaling  --->
    	# 什么?可以经过核心修改 CPU 的运作频率?哈哈!没错!是这样!
    	# 不过,在说明档当中也提及,还需要启动底下的 dynamic cpufreq governor
    	# 才可以顺利的启动这个项目。当然,如果你不愿意的话,这里可以取消。
    	[*] CPU Frequency scaling
    	[*]   Enable CPUfreq debugging
    	<M>   CPU frequency translation statistics
    	[*]     CPU frequency translation statistics details
    	# 如果想要启动在休眠时, CPU 自动降频的功能,上面都给他设定好吧!
    	      Default CPUFreq governor (userspace)  --->
    		( ) performance
    		(X) userspace
    		# 休眠时 CPU 频率的考虑,是以效能为主,还是您可以手动修改
    		# 既然要自动降频,当然不以效能为考虑~所以选 userspace 吧!
    
    	<*>   'performance' governor
    	<M>   'powersave' governor
    	---   'userspace' governor for userspace frequency scaling 
    	<M>   'ondemand' cpufreq policy governor
    	<M>   'conservative' cpufreq governor
    	# 上面这几个则是在载入哪些调节器(governor) ~
    	---   CPUFreq processor drivers
    	<M>   ACPI Processor P-States driver
    	< >   AMD Mobile K6-2/K6-3 PowerNow!
    	<M>   AMD Mobile Athlon/Duron PowerNow!
    	< >   Cyrix MediaGX/NatSemi Geode Suspend Modulation
    	<*>   Intel Enhanced SpeedStep
    	[*]     Use ACPI tables to decode valid frequency/voltage pairs
    	[*]     Built-in tables for Banias CPUs
    	<*>   Intel Speedstep on ICH-M chipsets (ioport interface)
    	<M>   Intel Pentium 4 clock modulation
    	<*>   Transmeta LongRun
    	< >   VIA Cyrix III Longhaul
    	# 上面这几个就与 CPU 的型号有关啦!我用的是 P-III,
    	# 所以,不相关的数据我直接将他编成模块而已!
    	---   shared options
    	[ ]   /proc/acpi/processor/../performance interface (deprecated)
    	[ ]   Relaxed speedstep capability checks
    
    	# 其实,这个项目主要是在主机 Idle 的时候,透过 CPU 本身的功能,
    	# 然后让系统可以自动的降频的一个选项啦! ^_^
    
    老实说,由于鸟哥的 Linux 机器主要都是站在 Server 的角度,所以我的机器都是全年无休的。 在这样的条件下,我老是选择不要使用电源管理的说~ @_@。不过,如果是站在桌面计算机的角度, 呵呵~启动电源管理这可是很棒的选项,因为.....电费越来越贵了~ 能省则省啊! ^_^ 另外,绝大部分的选项都可以编译成为模块啊!只是会花去一些编译的时间就是了。


  • Bus options (PCI, PCMCIA, EISA, MCA, ISA)
  • 这个项目则与总线有关啦!分为最常见的 PCI,还有笔记本电脑常见的 PCMCIA 插卡啊!详细的资料有这些:
    --- PCI support
          PCI access mode (Any)  --->
    [ ]   PCI Express support
    	# 这个重要!如果你的主板有支持较新的 PCI-Express 显示适配器的话,
    	# 这里请务必要勾选~鸟哥的主板太旧了,用的是 AGP 显示适配器,所以这里不选!
    [ ]   Message Signaled Interrupts (MSI and MSI-X)
    [*]   Legacy /proc/pci interface
    [ ]   PCI Debugging
    [*] ISA support
    [ ]   EISA support
    	# 这个是比 PCI 还要更早的总线插槽,一般来说,
    	# 最好还是保留 ISA 插槽比较妥当点~
    [ ] MCA support
    < > NatSemi SCx200 support
        PCCARD (PCMCIA/CardBus) support  --->
    	< > PCCard (PCMCIA/CardBus) support
    	[ ]   Enable PCCARD debugging
    	< >   16-bit PCMCIA support
    	[ ]     PCMCIA control ioctl (obsolete)
    	---   32-bit CardBus support
    	---   PC-card bridges
    	< >   CardBus yenta-compatible bridge support
    	< >   Cirrus PD6729 compatible bridge support
    	< >   i82092 compatible bridge support
    	< >   i82365 compatible bridge support
    	< >   Databook TCIC host bridge support
    	# 这个是 PC 卡,一般来说,桌面计算机不会有这种卡的存在,
    	# 所以,鸟哥通常是不选择~不过,如果你的主机是笔记本电脑,
    	# 这里可就得要选择了!否则很多插卡就不能被使用啊!切记切记!
    
        PCI Hotplug Support  --->
    	# 这个是进阶功能,可以不用理他!
    
    PCI 插槽是重要的,因为几乎所有的适配卡都是插在 PCI 插槽上面的。 此外,这个设定项目里面有个比较有趣又重要的地方,那就是 PCI-E (PCI Express) 的设定项目了!如果你的主板是最近买的,而且你的显示适配器是 PCI-E 的话, 这个项目就务必要编入核心才行!否则显示适配器会捉不到的!


  • Executable file formats
  • 这里必须要勾选才行喔!因为是给 Linux 核心运作执行文件之用的数据! 除了第一项必须要编成核心功能之外,其他两项是可以编译成为模块的啦!
    [*] Kernel support for ELF binaries
    <M> Kernel support for a.out and ECOFF binaries
    <*> Kernel support for MISC binaries
    

  • Networking
  • 这个项目是相当相当相当 * n 重要的选项,因为他还包含了防火墙相关的项目! 就是未来在服务器篇会谈到的防火墙 iptables 这个数据啊!所以,千万注意了!
    --- Networking support
          Networking options  --->
    	# 就是这个光啊!里面的数据全部都是重要的防火墙项目!
    	# 在这里面的项目当中,如果可以编成模块,尽量将他编成模块!
    	<*> Packet socket
    	# 唯独这个项目务必要编进核心里面!因为他是防火墙啊!
    	[*]   Packet socket: mmapped IO
    	<*> Unix domain sockets
    	<*> IPsec user configuration interface
    	<M> PF_KEY sockets
    
    	# 底下是 TCP/IP 的设定,大多是 IPv4 ,只要保留默认值就很 OK 了!
    	[*] TCP/IP networking
    	[*]   IP: multicasting
    	[*]   IP: advanced router
    	        Choose IP: FIB lookup algorithm (choose FIB_HASH if unsure) 
    	[*]   IP: policy routing
    	[*]     IP: use netfilter MARK value as routing key
    	[*]   IP: equal cost multipath
    	[ ]     IP: equal cost multipath with caching support (EXPERIMENTAL)
    	[*]   IP: verbose route monitoring
    	[ ]   IP: kernel level autoconfiguration
    	<M>   IP: tunneling
    	<M>   IP: GRE tunnels over IP
    	[*]     IP: broadcast GRE over IP
    	[*]   IP: multicast routing
    	[*]     IP: PIM-SM version 1 support
    	[*]     IP: PIM-SM version 2 support
    	[*]   IP: TCP syncookie support (disabled per default)
    	<M>   IP: AH transformation
    	<M>   IP: ESP transformation
    	<M>   IP: IPComp transformation
    	<M>   IP: tunnel transformation
    	<*>   INET: socket monitoring interface
    	[ ]   TCP: advanced congestion control
    
    	      IP: Virtual Server Configuration  --->
    		# 这个项目则主要与 cluster 有关~里面保留默认值即可!
    
    	# 这底下则与 IPv6 ,新一代的 IP 协议有关!同样做成模块!
    	<M>   The IPv6 protocol
    	[*]     IPv6: Privacy Extensions (RFC 3041) support
    	<M>     IPv6: AH transformation
    	<M>     IPv6: ESP transformation
    	<M>     IPv6: IPComp transformation
    	---     IPv6: tunnel transformation
    	<M>     IPv6: IPv6-in-IPv6 tunnel
    
    	# 底下就重要啦!就是我们一直讲一直讲的防火墙啦! ^_^
    	[*] Network packet filtering (replaces ipchains)  --->
    		--- Network packet filtering (replaces ipchains)
    		[ ]   Network packet filtering debugging
    		[*]   Bridged IP/ARP packets filtering
    		<M>   Netfilter netlink interface
    
    		      IP: Netfilter Configuration  --->
    			<M> Connection tracking (required for masq/NAT)
    			[*]   Connection tracking flow accounting
    			[*]   Connection mark tracking support
    			[ ]   Connection tracking events
    			<M>   Connection tracking netlink interface
    			<M>   FTP protocol support
    			<M>   IRC protocol support
    			<M>   TFTP protocol support
    			<M>   Amanda backup protocol support
    			<M>   PPTP protocol support
    			<M> IP Userspace queueing via NETLINK (OBSOLETE)
    			<M> IP tables support (required for filtering/masq/NAT)
    			<M>   limit match support
    			<M>   IP range match support
    			<M>   MAC address match support
    			<M>   Packet type match support
    			<M>   netfilter MARK match support
    			<M>   Multiple port match support
    			<M>   TOS match support
    			<M>   recent match support
    			<M>   ECN match support
    			<M>   DSCP match support
    			<M>   AH/ESP match support
    			<M>   LENGTH match support
    			<M>   TTL match support
    			<M>   tcpmss match support
    			<M>   Helper match support
    			<M>   Connection state match support
    			<M>   Connection tracking match support
    			<M>   Owner match support
    			<M>   Physdev match support
    			<M>   address type match support
    			<M>   realm match support
    			<M>   SCTP protocol match support
    			<M>   DCCP protocol match support
    			<M>   comment match support
    			<M>   Connection mark match support
    			<M>   Connection byte/packet counter match support
    			<M>   hashlimit match support
    			<M>   string match support
    			<M>   Packet filtering
    			<M>     REJECT target support
    			<M>   LOG target support
    			<M>   ULOG target support (OBSOLETE)
    			<M>   TCPMSS target support
    			<M>   NFQUEUE Target Support
    			<M>   Full NAT
    			<M>     MASQUERADE target support
    			<M>     REDIRECT target support
    			<M>     NETMAP target support
    			<M>     SAME target support
    			<M>   Packet mangling
    			<M>     TOS target support
    			<M>     ECN target support
    			<M>     DSCP target support
    			<M>     MARK target support
    			<M>     CLASSIFY target support
    			<M>     TTL target support
    			<M>     CONNMARK target support
    			<M>   raw table support (required for NOTRACK/TRACE)
    			<M>     NOTRACK target support
    			<M> ARP tables support
    			<M>   ARP packet filtering
    			<M>   ARP payload mangling
    
    		      Bridge: Netfilter Configuration  --->
    			# 这个项目内容也一样,全部编成模块!
    
    	# 底下同样的,可能的话就编译成为模块啊!
    	<M> 802.1d Ethernet Bridging
    	<M> 802.1Q VLAN Support
    	< > DECnet Support
    	< > ANSI/IEEE 802.2 LLC type 2 Support
    	<M> The IPX protocol
    	[ ]   IPX: Full internal IPX network
    	<M Appletalk protocol support
    	[*]   Appletalk interfaces support
    	<M>     Apple/Farallon LocalTalk PC support 
    	<M>     COPS LocalTalk PC support
    	[*]       Dayna firmware support
    	[*]       Tangent firmware support
    	<M>     Appletalk-IP driver support
    	[*]       IP to Appletalk-IP Encapsulation support
    	[*]       Appletalk-IP to IP Decapsulation support
    	[*] QoS and/or fair queueing  --->
    	<M> Firewall based classifier
    	<M> U32 classifier
    	[*]   U32 classifier performance counters
    	[*] classify input device (slows things u32/fw)
    	[*] Use nfmark as a key in U32 classifier
    	<M> Special RSVP classifier
    	<M> Special RSVP classifier for IPv6
    	[*] Extended Matches
    	(32)  Stack size
    	<M>   Simple packet data comparison
    	<M>   Multi byte comparison
    	<M>   U32 hashing key
    	<M>   Metadata
    	<M>   Textsearch
    	[*] Traffic policing (needed for in/egress)
    	    Network testing  --->
    
    # 底下则是一些特殊的网络设备,例如红外线啊、蓝牙啊!
    # 如果不清楚的话,就使用模块吧!除非你真的知道不要该项目!
    [ ]   Amateur Radio support  --->
    <M>   IrDA (infrared) subsystem support  --->
    <M>   Bluetooth subsystem support  --->
    <M>   Generic IEEE 802.11 Networking Stack
    [ ]     Enable full debugging output
    <M>     IEEE 802.11 WEP encryption (802.1x)
    <M>     IEEE 802.11i CCMP support
    <M>     IEEE 802.11i TKIP encryption
    
    在这个设定项目当中,很多东西其实我们在基础篇还没有讲到, 因为大部分的参数都与网络、防火墙有关!由于防火墙是在启动网络之后再设定即可, 所以绝大部分的内容都可以被编译成为模块,而且也建议您编成模块! 有用到才载入到核心即可啊!


  • Device Drivers
  • 这个是所有硬件装置的驱动程序库!哇!光是看到里面这么多内容,鸟哥头都昏了~ 不过,为了您自己的主机好,建议你还是得要一个项目一个项目的去挑选挑选才行~ 这里面的数据就与您主机的硬件有绝对的关系了!
    Generic Driver Options  --->
    	# 与韧体有关,保留默认值即可!
    
    Connector - unified userspace <-> kernelspace linker  --->
    Memory Technology Devices (MTD)  --->
    	# 上面这两个不知道会不会用到的数据,暂时可以编译成为模块即可!
    
    Parallel port support  --->
    	<M> Parallel port support
    	<M>   PC-style hardware
    	<M>     Multi-IO cards (parallel and serial)
    	<M>   Support for PCMCIA management for PC-style ports
    	[*] IEEE 1284 transfer modes
    	# 平行串行端口,呵呵!与打印机相关性挺高的!编译成为模块即可!
    
    Plug and Play support  --->
    	[*] Plug and Play support
    	# 不啰唆,这个当然要选择啊!
    
    Block devices  --->
    	# 这里面与储存装置有关,全部给他编成模块!当然,确定不需要的,
    	# 就不要编译咯!
    
    ATA/ATAPI/MFM/RLL support  --->
    	# 底下的设定你可以保留默认值,来让核心支持较为完整!
    	# 不过,既然我们已经知道主机的硬件与主板的芯片,当然可以作一些选择啰!
    	<*> ATA/ATAPI/MFM/RLL support
    	<*>   Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
    	---     Please see Documentation/ide.txt for help/info on IDE drives
    	[ ]     Support for SATA (deprecated; conflicts with libata SATA driver)
    		# 这个不要选!因为 SATA 的新的驱动程序是包含在 SCSI 中的!
    	[ ]     Use old disk-only driver on primary interface
    	<*>     Include IDE/ATA-2 DISK support
    	[*]     Use multi-mode by default
    	<M>     PCMCIA IDE support
    	<*>     Include IDE/ATAPI CDROM support
    	<*>     Include IDE/ATAPI FLOPPY support
    		# 上面这两个就必选!让核心主动支持 CDROM 与软盘!
    
    	<M>     SCSI emulation support
    	[ ]     IDE Taskfile Access
    	---     IDE chipset support/bugfixes
    	<*>     generic/default IDE chipset support
    	[*]     CMD640 chipset bugfix/support
    	[*]       CMD640 enhanced support
    	[*]     PNP EIDE support
    		# 上面这几个也可以挑选起来,尤其会比较适合 Pentium 的主机!
    
    		# 底下这几个则主要与主板的芯片组有关啊!
    	[*]     PCI IDE chipset support
    	[*]       Sharing PCI IDE interrupts support
    	[ ]       Boot off-board chipsets first support
    	<*>       Generic PCI IDE Chipset Support
    	<*>       RZ1000 chipset bugfix/support
    	[*]       Generic PCI bus-master DMA support
    			# 底下这几个请特别挑选一番!
    	[ ]         Force enable legacy 2.0.X HOSTS to use DMA
    	[*]         Use PCI DMA by default when available
    	[ ]           Enable DMA only for disks
    	< >         AEC62XX chipset support
    	< >         ALI M15x3 chipset support
    	[ ]           ALI M15x3 WDC support (DANGEROUS)
    	< >         AMD and nVidia IDE support
    	< >         ATI IXP chipset IDE support
    	< >         CMD64{3|6|8|9} chipset support
    	< >         Compaq Triflex IDE support
    	< >         CY82C693 chipset support
    	< >         Cyrix/National Semiconductor CS5530 MediaGX chipset support
    	< >         HPT34X chipset support
    	< >         HPT36X/37X chipset support
    	< >         National SCx200 chipset support
    	<*>         Intel PIIXn chipsets support
    	<*>         IT821X IDE support
    	< >         NS87415 chipset support
    	<*>         PROMISE PDC202{46|62|65|67} support
    	[ ]           Special UDMA Feature
    	<*>         PROMISE PDC202{68|69|70|71|75|76|77} support
    	[*]           Enable controller even if disabled by BIOS
    	< >         ServerWorks OSB4/CSB5/CSB6 chipsets support
    	< >         Silicon Image chipset support
    	< >         SiS5513 chipset support
    	< >         SLC90E66 chipset support
    	< >         Tekram TRM290 chipset support
    	< >         VIA82CXXX chipset support
    	[ ]     Other IDE chipset support
    	[ ]     IGNORE word93 Validation BITS
    	# 因为我的是 Intel 芯片组的主板,所以全部无关的我都没有选择。
    	# 不过,为了您自己好~其实,上面绝大部分的数据都给他做成模块比较妥当!
    
    SCSI device support  --->
    # 不论你有没有 SCSI 装置,你都必须要启动 SCSI 的支持!理由有二:
    # 1. 因为 USB 装置用的就是仿真 SCSI 啊!
    # 2. 因为 SATA 的设定项目就在这里面!
    	< > RAID Transport Class
    	<M> SCSI device support
    	[*]   legacy /proc/scsi/ support
    	---   SCSI support type (disk, tape, CD-ROM)
    	<M>   SCSI disk support
    	<M>   SCSI tape support
    	<M>   SCSI OnStream SC-x0 tape support
    	<M>   SCSI CDROM support
    	[*]     Enable vendor-specific extensions (for SCSI CDROM)
    	<M>   SCSI generic support
    	<M>   SCSI media changer support
    	---   Some SCSI devices (e.g. CD jukebox) support multiple LUNs
    	[*]   Probe all LUNs on each SCSI device
    	[*]   Verbose SCSI error reporting (kernel size +=12K)
    	[*]   SCSI logging facility
    	      SCSI Transport Attributes  --->
    	      SCSI low-level drivers  --->
    		# 在这个项目当中,都保留默认值即可不过,
    		# 如果你有 SATA 的硬盘,请确认底下已经编译起来了!
    		<M> Serial ATA (SATA) support
    		<M>   AHCI SATA support
    		<M>   ServerWorks Frodo / Apple K2 SATA support
    		<M>   Intel PIIX/ICH SATA support
    		<M>   Promise SATA TX2/TX4 support
    		<M>   Pacific Digital SATA QStor support
    		<M>   VIA SATA support
    		<M>   VITESSE VSC-7174 SATA support
    	      PCMCIA SCSI adapter support  --->
    
    Old CD-ROM drivers (not SCSI, not IDE)  --->
    Multi-device support (RAID and LVM)  ---> 
    	# 还记得不久之前才谈过的 LVM 吧?这里当然要选择啰!
    	[*] Multiple devices driver support (RAID and LVM)
    	<*>   RAID support
    	<M>     Linear (append) mode
    	<M>     RAID-0 (striping) mode
    	<M>     RAID-1 (mirroring) mode
    	<M>     RAID-4/RAID-5 mode
    	<M>     RAID-6 mode
    	<M>     Multipath I/O support
    	<M>     Faulty test module for MD
    	<M>   Device mapper support
    
    Fusion device support  --->
    IEEE 1394 (FireWire) support  --->
    I2O device support  --->
    	# 上面也编译成为模块即可!那个 IEEE 1394 就是我们常听到的『火线』。
    
    Network device support  --->
    	# 您总是有网络卡吧?所以啰~这里得要选择一个网络卡装置啊!
    	[*] Network device support
    	<M>   Dummy net driver support
    	<M>   Bonding driver support
    	<M>   EQL (serial line load balancing) support
    	<M>   Universal TUN/TAP device driver support
    	<M>   General Instruments Surfboard 1000
    	      ARCnet devices  --->
    	      PHY device support  --->
    	      Ethernet (10 or 100Mbit)  --->
    		# 这里面含有的就是 10/100 的网络卡!大部分都可以编成模块。
    		<M> RealTek RTL-8129/8130/8139 PCI Fast Ethernet Adapter support
    		<M> VIA Rhine support
    		# 上面这两个就是有名的螃蟹卡与 D-Link 530 所用的驱动程序。
    	      Ethernet (1000 Mbit)  --->
    		# 这里面含有的就是 10/100/1000 的网络卡!大部分都可以编成模块。
    	      Ethernet (10000 Mbit)  --->
    	      Token Ring devices  --->
    	      Wireless LAN (non-hamradio)  --->
    	      PCMCIA network device support  --->
    	      Wan interfaces  --->
    	[*]   FDDI driver support
    	< >     Digital DEFEA and DEFPA adapter support
    	<M>     SysKonnect FDDI PCI support
    	<M>   PLIP (parallel port) support
    	<*>   PPP (point-to-point protocol) support
    	[*]     PPP filtering
    	<M>     PPP support for async serial ports
    	<M>     PPP support for sync tty ports
    	<M>     PPP Deflate compression
    	# 如果您有 ADSL 拨接的话,呵呵!PPP 的装置也要选择上喔!
    	< >     PPP BSD-Compress compression
    	<M>   SLIP (serial line) support
    	[*]     CSLIP compressed headers
    	[*]     Keepalive and linefill
    	[ ]     Six bit SLIP encapsulation
    	[*]   Fibre Channel driver support
    
    ISDN subsystem  --->
    Telephony Support  --->
    	# 上面这两个我都没有,所以并没有选择!
    
    Input device support  --->
    	# 这里面含有鼠标、键盘、游戏杆等等的输入设备,也是需要挑选的!
    	--- Generic input layer (needed for keyboard, mouse, ...)
    	---   Userland interfaces
    	---   Mouse interface
    	# 底下这三个与鼠标有关啦!也可以选择的!
    	[ ]     Provide legacy /dev/psaux device
    	(1024)  Horizontal screen resolution
    	(768)   Vertical screen resolution
    	<M>   Joystick interface
    	< >   Touchscreen interface 
    	<*>   Event interface
    	< >   Event debugging
    	---   Input Device Drivers
    	---   Keyboards  --->
    	[*]   Mouse  --->
    	[ ]   Joysticks  --->
    	[ ]   Touchscreens  ---> 
    		# 我没有游戏杆也没有触控式面版,所以上面两个不选!
    	[*]   Miscellaneous devices  --->
    	    Hardware I/O ports  --->
    
    Character devices  --->
    	# 里面的资料也很多,也要注意 AGP 显示适配器的芯片组啊!
    	# 而因为鸟哥的环境是 Intel 的芯片,所以自然将那个编进去,
    	# 其他的成为模块即可!其他的除非确定不需要,否则保留默认值即可!
    	<*> /dev/agpgart (AGP Support)
    	<M>   ALI chipset support
    	<M>   ATI chipset support
    	<M>   AMD Irongate, 761, and 762 chipset support
    	<M>   AMD Opteron/Athlon64 on-CPU GART support
    	<*>   Intel 440LX/BX/GX, I8xx and E7x05 chipset support
    	<M>   NVIDIA nForce/nForce2 chipset support
    	<M>   SiS chipset support
    	<M>   Serverworks LE/HE chipset support
    	<M>   VIA chipset support
    	<M>   Transmeta Efficeon support
    	<M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)
    	<M>   3dfx Banshee/Voodoo3+
    	<M>   ATI Rage 128
    	<M>   ATI Radeon
    	<M>   Intel I810
    	<M>   Intel 830M, 845G, 852GM, 855GM, 865G
    	<M>     i830 driver
    	<M>     i915 driver
    	<M>   Matrox g200/g400
    	<M>   SiS video cards
    	<M>   Via unichrome video cards
    	< >   Savage video cards
    
    I2C support  --->
    	# 还记得我们去侦测主板的温度与压力吧?呵呵!那就是透过核心的
    	# 这个 I2C 的模块功能了!默认情况下,这个项目都有支持,所以,
    	# 保留默认值即可。
    
    Dallas's 1-wire bus  --->
    	# 这个与某些热感应装置有关,可以不编译,也可以保留编成模块即可!
    
    Hardware Monitoring support  --->
    	# 这个也与 I2C 有点关系,他主要可以接受硬件的侦测,
    	# 所以在这个项目内您会看到 LM_XX 之类的模块!啊!就保留模块即可!
    
    Misc devices  --->
    Multimedia Capabilities Port drivers  --->
    Multimedia devices  --->
    	# 类似影像撷取卡、FM 广播声卡等等,可在这里设定!
    	# 如果您的主机是用作服务器,那么这里或许可以不要选择。
    	# 当然啦,这个项目几乎都是模块,保留默认值也不错!
    
    Graphics support  --->
    	# 嘿嘿!重点之一,显示适配器的芯片组~刚刚前面提到的都是主板的
    	# 对显示适配器的总线支持 (PCI-E 与 AGP) ,这里则是针对显示适配器芯片!
    	# 鸟哥的显示适配器是 NVidia 的,所以将他选择即可!其他的可以编成模块!
    	<*> Support for frame buffer devices
    	---   Enable Video Mode Handling Helpers
    	---   Enable Tile Blitting Support
    	<M>   Cirrus Logic support
    	< >   Permedia2 support
    	< >   CyberPro 2000/2010/5000 support
    	< >   Arc Monochrome LCD board support
    	[ ]   Chips 69000 display support
    	[ ]   IMS Twin Turbo display support
    	<M>   VGA 16-color graphics support
    	[*]   VESA VGA graphics support
    	< >   Hercules mono graphics support
    	<M>   nVidia Framebuffer Support
    	<M>   nVidia Riva support
    	[ ]     Enable DDC Support
    	[ ]     Lots of debug output from Riva(nVidia) driver
    	<M>   Matrox acceleration
    	[*]     Millennium I/II support
    	[*]     Mystique support
    	[*]     G100/G200/G400/G450/G550 support
    	<M>     Matrox I2C support
    	<M>       G400 second head support
    	[*]     Multihead support
    	< >   ATI Radeon display support (Old driver)
    	<M>   ATI Radeon display support
    	[*]     DDC/I2C for ATI Radeon support
    	[ ]     Lots of debug output from Radeon driver
    	<M>   ATI Rage128 display support
    	<M>   ATI Mach64 display support
    	[*]     Mach64 CT/VT/GT/LT (incl. 3D RAGE) support
    	[*]       Mach64 generic LCD support (EXPERIMENTAL)
    	[ ]       Rage XL No-BIOS Init support
    	[*]     Mach64 GX support
    	<M>   SiS/XGI display support
    	<M>   NeoMagic display support
    	<M>   IMG Kyro support
    	<M>   3Dfx Banshee/Voodoo3 display support
    	<M>   3Dfx Voodoo Graphics (sst1) support
    	< >   Cyberblade/i1 support
    	<M>   Trident support
    	< > Epson S1D13XXX framebuffer support
    	< > Virtual Frame Buffer support (ONLY FOR TESTING!)
    	    Console display driver support  --->
    	    Logo configuration  --->
    	[*] Backlight & LCD device support  --->
    
    Sound  --->
    	# 这个是声卡啊!鸟哥的机器上面没有声卡,所以直接不选。
    	# 您可以进入后选择您的声卡啊!
    
    USB support  --->
    	# 这个则是 USB 的驱动模块!还记得我们在硬件维护的地方讲过的
    	# USB 的模块名称吧?呵呵!在里面找找吧!
    	# 其实这里面鸟哥仅保留默认值,然后再加上选择 USB 2.0 的支持,
    	# 其他的 usb 装置全部给他勾成模块!这样就 OK 啦!
    
    MMC/SD Card support  --->
    	# 这是多媒体卡 (multi-media card) ,鸟哥是用不到的,所以不选!
    
    InfiniBand support  --->
    SN Devices  --->
    	# 这两个应该也用不到,所以保留默认值即可!
    
    在这里面真的很重要,因为很多数据都与你的硬件有关。核心推出时的默认值是比较符合一般状态的, 所以很多数据其实保留默认值就可以编的很不错了!不过,也因为较符合一般状态, 所以核心额外的编译进来很多跟你的主机系统不符合的数据,例如网络卡装置~ 你可以针对你的主板与相关硬件来进行编译。不过,还是要记得有『未来扩充性』的考虑! 之前鸟哥不是谈过吗,我的网络卡由螃蟹卡换成 3Com 时,核心捉不到~ 因为......我并没有将 3Com 的网络卡编译成为模块啊! @_@


  • File systems
  • 文件系统的支持也是很重要的一项核心功能!因为如果不支持某个文件系统, 那么我们的 Linux kernel 就无法认识,当然也就无法使用啦!例如 Quota, NTFS 等等特殊的 filesystem 。底下是详细的资料啰!
    <*> Second extended fs support
    [*]   Ext2 extended attributes
    [*]     Ext2 POSIX Access Control Lists
    [*]     Ext2 Security Labels
    [ ]   Ext2 execute in place support
    <*> Ext3 journalling file system support
    [*]   Ext3 extended attributes
    [*]     Ext3 POSIX Access Control Lists
    [*]     Ext3 Security Labels
    [ ] JBD (ext3) debugging support
    # EXT2/EXT3 是必选的吧!将他选择起来先!
    
    <M> Reiserfs support
    [ ]   Enable reiserfs debug mode
    [*]   Stats in /proc/fs/reiserfs
    [*]   ReiserFS extended attributes
    [*]     ReiserFS POSIX Access Control Lists
    [*]     ReiserFS Security Labels
    <M> JFS filesystem support
    [*]   JFS POSIX Access Control Lists
    [*]   JFS Security Labels
    [ ]   JFS debugging
    [ ]   JFS statistics
    <M> XFS filesystem support
    [*]   XFS Quota support
    [*]   XFS Security Label support
    [*]   XFS POSIX ACL support
    <M> Minix fs support
    # 上面这几个 filesystem 不知道什么时候会用到,当然是编成模块比较好!
    
    <M> ROM file system support
    [*] Inotify file change notification support
    [*] Quota support
    < >   Old quota format support
    <*>   Quota format v2 support
    # Quota 够重要吧!务必要将他圈选起来才行喔!
    
    <M> Kernel automounter support
    <M> Kernel automounter version 4 support (also supports v3)
    < > Filesystem in Userspace support
        CD-ROM/DVD Filesystems  --->
    	<*> ISO 9660 CDROM file system support
    	[*]   Microsoft Joliet CDROM extensions
    	[*]   Transparent decompression extension
    	<M> UDF file system support 
    	# 注意!那个 ISO 9660 的 filesystem 务必要挑选!
        
        DOS/FAT/NT Filesystems  --->
    	<M> MSDOS fs support
    	<M> VFAT (Windows-95) fs support
    	(950) Default codepage for FAT
    	(big5) Default iocharset for FAT
    	<M> NTFS file system support
    	[ ]   NTFS debugging support (NEW)
    	[*]   NTFS write support
    	# 哇!不但可以选择预设是中文语系,而且,还可以支持 NTFS
    	# 可擦写哩!这一版真强!不过,NTFS 能否真的可以写入,不确定~
    
        Pseudo filesystems  --->
    	[*] /proc file system support
    	[*]   /proc/kcore support
    	[*] Virtual memory file system support (former shm fs)
    	[*] HugeTLB file system support
    	< > Relayfs file system support
    	# 这几个是一定要的啦!
    
        Miscellaneous filesystems  --->
    	# 这里面的数据可以选择默认即可!
    	
        Network File Systems  --->
    	<M> NFS file system support
    	[*]   Provide NFSv3 client support
    	[*]     Provide client support for the NFSv3 ACL protocol extension
    	<M> NFS server support
    	[*]   Provide NFSv3 server support
    	[*]     Provide server support for the NFSv3 ACL protocol extension
    	[*]   Provide NFS server over TCP support
    	<M> SMB file system support (to mount Windows shares etc.)
    	[*]   Use a default NLS
    	(cp950) Default Remote NLS Option
    	# 这里可以加上这个预设参数,支持中文语系啊!
    	<M> CIFS support (advanced network filesystem for Samba, Window and othe
    	[ ]   CIFS statistics
    	[*]   CIFS extended attributes (EXPERIMENTAL)
    	[*]     CIFS POSIX Extensions (EXPERIMENTAL)
    	[ ]   CIFS Experimental Features (EXPERIMENTAL)
    	<M> NCP file system support (to mount NetWare volumes)
    	[*]   Packet signatures
    	[*]   Proprietary file locking
    	[*]   Clear remove/delete inhibit when needed
    	[*]   Use NFS namespace if available
    	[*]   Use LONG (OS/2) namespace if available
    	[*]   Lowercase DOS filenames
    	[*]   Use Native Language Support
    	[*]   Enable symbolic links and execute flags
    	<M> Coda file system support (advanced network fs)
    	[ ]   Use 96-bit Coda file identifiers
    	# 其实大部分仍然是模块的项目啦!
    
        Partition Types  --->
    	# 里面含有 Minix, sun 等等的磁盘分区表的格式支持,
    	# 您如果确定不需要,可以将他拿掉就是了!
    
        Native Language Support  --->
    	(utf8) Default NLS Option
    	<*>   Traditional Chinese charset (Big5)
    	# 其他都保留默认值即可,这两个项目稍微确认一下!
    
    这部份也是有够麻烦~因为涉及核心是否能够支持某些文件系统,以及某些操作系统支持的 partition table 的支持项目。在进行选择时,也务必要特别的小心在意喔! 尤其是我们常常用到的网络操作系统 (NFS/Samba 等等),以及基础篇谈到的 Quota 等, 您都得要勾选啊!否则是无法被支持的。比较有趣的是 NTFS 在这一版的核心里面竟然有支持可写入的项目, 着实让鸟哥吓了一跳了!^_^


  • Security options
  • 这一部份与安全性比较有关。几乎保留默认值即可,仔细注意一下 SELinux 的项目, 该项目是美国国家安全局发展的 Linux 细部安全维护控件目,需要勾选才行!


  • Cryptographic options
  • 这部份则是加密参数的设定。一般我们使用的账号密码登入,利用的就是 MD5 这个加密机制,要让核心有支持才行啊!几乎所有的项目都给他做成模块即可! 不过 MD5 与 SHA1 必须要直接由核心支持比较好!
    --- Cryptographic API
    ---   HMAC support
    <M>   Null algorithms
    <M>   MD4 digest algorithm
    <*>   MD5 digest algorithm
    <*>   SHA1 digest algorithm
    <M>   SHA256 digest algorithm
    <M>   SHA384 and SHA512 digest algorithms
    <M>   Whirlpool digest algorithms
    <M>   Tiger digest algorithms
    <M>   DES and Triple DES EDE cipher algorithms
    <M>   Blowfish cipher algorithm
    <M>   Twofish cipher algorithm
    <M>   Serpent cipher algorithm
    <M>   AES cipher algorithms (i586)
    <M>   CAST5 (CAST-128) cipher algorithm
    <M>   CAST6 (CAST-256) cipher algorithm
    <M>   TEA, XTEA and XETA cipher algorithms
    <M>   ARC4 cipher algorithm
    <M>   Khazad cipher algorithm
    <M>   Anubis cipher algorithm
    <M>   Deflate compression algorithm
    <M>   Michael MIC keyed digest algorithm
    <M>   CRC32c CRC algorithm
    

  • 取用旧数据与储存设定
  • 还有底下这两个项目:
    Load an Alternate Configuration File
    Save Configuration to an Alternate File
    
    这两个项目分别是储存刚刚做好的所有项目的设定数据,另一个则是将来自其他人作的选择给他读入! 事实上,刚刚我们所做的设定只要在离开时选择 SAVE ,那么这些项目 通通会记录到目前这个目录下的 .config 档案内。 而我们也可以使用上面提到的 Save Configuration 这个项目来将刚刚做完的设定储存成另外的档案, 做成这个档案的好处是,你可以在下次在其他版本的核心作选择时,直接以 Load 来将这个档案的设定项目读入,这样可以减少您还要重新挑选一遍的困境啊!

    在最初的画面上面选择 <Exit> 项目后,画面会出现一个询问你是否要储存的窗口,选择 Yes 后, 您所有的选择数据就都会被纪录到 .config 这个隐藏档案里面去了!有兴趣的话, 您可以使用 vi 去到该档案查阅一下,就知道你做过哪些设定啰! ^_^

    要请您注意的是,上面的资料主要是适用在鸟哥的个人机器上面的, 目前鸟哥比较习惯使用原本 distributions 提供的预设核心,因为他们也会主动的进行更新, 所以鸟哥就懒的自己重编核心了~ ^_^

    此外,因为鸟哥重视的地方在于『网络服务器』上面,所以里头的设定少掉了相当多的个人桌上型 Linux 的硬件编译!所以,如果你想要编译出一个适合您的机器的核心, 那么可能还有相当多的地方需要来修正的!不论如何,请随时以 Help 那个选项来看一看内容吧!反正 Kernel 重编的机率不大!花多一点时间重新编译一次! 然后将该编译完成的参数档案储存下来,未来就可以直接将该档案叫出来读入了! 所以花多一点时间安装一次就好!那也是相当值得的!

    大标题的图示核心的编译与安装
    做完核心项目的选择啰~接下来呢?当然是编译与安装啦!核心的编译与安装很简单啦!来看看吧!


    小标题的图示编译的流程
    整个编译的过程真的很简单!作这个动作即可:
    [root@linux linux-2.6.14.2]# make clean
    # 将以前曾经进行过的 *.o 档案删除掉,这样比较不会产生新旧版本的误差!
    
    [root@linux linux-2.6.14.2]# make bzImage
    # 制作出核心档案!这个重要!过程很长啊!而且那个是大写的 I 喔!
    
    [root@linux linux-2.6.14.2]# make modules
    # 制作出模块相关的档案!
    
    只要这三个动作,您的核心与模块就通通制作出来了!不过,制作出来的资料还是被放置在 /usr/src/linux-2.6.14.2 这个目录下~并没有被放到系统的相关路径中喔! 在上面的过程当中,如果有发生任何错误的话,那么很可能是核心项目的挑选选择的不好, 可能您需要重新以 make menuconfig 再次的检查一下您的相关设定喔! 如果还是无法成功的话,那么或许将原本的核心数据内的 .config 档案,复制到您的核心原始文件目录下, 然后据以修改,应该就可以顺利的编译出您的核心了。注意到,下达了 make bzImage 后, 最后的结果应该会像这样:
    Root device is (3, 2)
    Boot sector 512 bytes.
    Setup is 7016 bytes.
    System is 1721 kB
    Kernel: arch/i386/boot/bzImage is ready  (#1)
    [root@linux linux-2.6.14.2]# ll arch/i386/boot/bzImage
    -rw-r--r--  1 root root 1770185 Dec  2 14:32 arch/i386/boot/bzImage
    
    如此一来,您就可以发现您的核心已经编译好而且放置在 /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage 里面啰~那个就是我们的核心档案!最重要就是他啦!我们等一下就会安装到这个档案哩! 然后就是编译模块的部分啰~ make modules 进行完毕后,就等着安装啦! ^_^


    小标题的图示模块安装时的注意事项:
    要强调的还是得强调,是这样的,在上面的介绍里,我们不是说过 Kernel 的外挂模块是放在 /lib/modules/`uname -r` 吗?好了,那么现在来想一想,如果你的『同一版本的核心编译两次』 的情况下,会怎样?这是很可能的情况呢!怎么说?万一你的第一次的编译没有成功的话, 那总得编译第二次吧?而由于第一次编译完成之后,你的一些模块已经放在 /lib/modules/2.6.14.2 当中了( 以这一次我们使用的核心版本为例 ),那么下次在编译完成后,核心的模块还是会放在 /lib/modules/2.6.14.2 这个目录下,那不是重复了吗?有些模块会被重复放置,导致问题重重的~ 因此上,如果同一个版本的核心被编译两次以上的话,那么请将 /lib/modules 里面的该版核心先移动掉吧!举个例子来说,假如你的核心版本是 2.6.14.2 ,而又要对 2.6.14.2 重新编译一次,那么就必需要:
    [root@linux ~]# cd /lib/modules
    [root@linux modules]# mv 2.6.14.2 2.6.14.2.old
    
    这样才行呢!不然安装之后还是会有问题的呦!请特别留意呢!

    处理完毕后,开始要安装模块了~安装的方法很简单,直接这样做就好了!
    [root@linux linux-2.6.14.2]# make modules_install
    
    整个模块就安装到 /lib/modules 里面去喔~一般来说,目录名称会是 /lib/modules/2.6.14-2 ,但是如果您有填写核心附版本的话, 就会出现类似 2.6.14-1.1644_FC4 之类的目录名称啰! ^_^ 接下来,就是准备要进行核心的安装了!哈哈!又跟 grub 有关啰~


    小标题的图示安装旧版与新版的核心成多重引导系统
    在编译好核心之后,我们已经知道核心档案放置在 /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage ,而我们也晓得一部主机是可以做成多重引导系统的!这样说,应该知道鸟哥想要干嘛了吧? 呵呵!对啦!我们将同时保留旧版的核心,并且新增新版的核心在我们的主机上面。

    这样做有什么好处呢?最大的好处是可以确保能够顺利开机啦!因为核心虽然被编译成功了, 但是并不保证我们刚刚挑选的核心项目完全适合于目前这部主机系统, 可能有某些地方我们忘记选择了,这个将导致新核心无法顺利驱动整个主机系统,更差的情况是, 您的主机无法成功开机完成!此时,如果我们保留旧的核心, 呵呵!若新核心测试不通过,就用旧核心来启动啊!嘿嘿!保证比较不会有问题嘛!

    另外,不要忘记制作 initrd 这个初始化虚拟磁盘,因为目前有很多朋友都是使用 LVM 文件系统, 或者是 RAID, SATA, SCSI 等磁盘类型,如果没有建立这个档案的话,那妳的 Linux 可能无法开机成功。 详细的 initrd 说明请参考 Loader 与 initrd 的相关性说明。 建立的方法很简单,这样做就好了:
    [root@linux ~]# mkinitrd  /boot/initrd_2.6.14.2  2.6.14.2
    # 此时会产生新档案 /boot/initrd_2.6.14.2 喔!
    # 且这个动作需要在安装好模块之后进行才会生效!
    
    关于多重引导的设定详情请参考 开机关机流程与 Loader 那一章,我这里不详细的说明了。我只假设您与我一样使用 grub 开机管理程序, 那么只要这样做,就能够设定好您的新核心了!
    1. 移动新核心到 /boot 里面去:
    [root@linux ~]# cp /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage \
    > /boot/vmlinuz-2.6.14-2
    # 就一般的习惯而言,鸟哥建议您将核心档名设定成以 vmlinuz 为首的名称,
    # 比较容易管理啦!
    [root@linux ~]# cp /usr/src/linux-2.6.14.2/System.map \
    > /boot/System.map-2.6.14-2
    
    2. 修改 grub 配置文件
    [root@linux ~]# vi /boot/grub/menu.lst
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title VBird linux 2.6.14-2
            root (hd0,0)
            kernel /vmlinuz-2.6.14-2 ro root=/dev/hda2 rhgb quiet vga=788
            initrd /initrd_2.6.14.2
    title Fedora Core (2.6.11-1.1369_FC4)
            root (hd0,0)
            kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda2 rhgb quiet vga=788
            initrd /initrd-2.6.11-1.1369_FC4.img
    # 这个是鸟哥我的个人环境,您请依照您的主机系统来编写这个档案!
    
    嘿嘿!这样才算成功的完成了整个核心的编译与安装~接下来呢? 当然就是 reboot 去测试一下新核心是否可以顺利的启动您的系统啦! 加油的啦! ^_^

    大标题的图示额外(单一)模块编译:
    我们现在知道核心所支持的功能当中,有直接编译到核心内部的,也有使用外挂模块的,外挂模块可以简单的想成 就是驱动程序 啦!那么也知道这些核心模块依据不同的版本, 被分别放置到 /lib/modules/`uname -r`/ 目录中,各个硬件的驱动程序则是放置到 /lib/modules/`uname -r`/kernel/drivers/ 当中!而这些模块与装置代号的对应, 就必须要被写入 /etc/modprobe.conf 档案当中了。更多与 modprobe.conf 的数据请参考 开机流程与 loader 章节啰!

    另外,关于模块的管理方面,我们也已经在 开机流程与 loader 当中稍微提过了。事实上,我们的 Linux 核心真的是越来越聪明了, 一般来说,当我们的软件有使用到核心的某项功能时,其实核心是会『主动的』去加载该功能的! 根本不需要使用什么 modprobe 还是 insmod 之类的指令去加载呢!不过,有时候某些程序写的不好时, 确实可能需要我们手动来加载模块就是了。

    那么在 Linux kernel 2.6 版里面的模块文件名是怎样呢?这个得要特别说明一下啰。在 kernel 2.4 版以前,模块的文件名都是 *.o 的,例如 vfat.o 这个文件系统模块就放在:
    • /lib/modules/`uname -r`/kernel/fs/vfat/vfat.o
    但是在 kernel 2.6 版以后,所有的核心模块都被改名字成为 *.ko 了!所以,如果你有 vfat 的模块, 他就会被放置到:
    • /lib/modules/`uname -r`/kernel/fs/vfat/vfat.ko
    请特别留意这个差异喔! ^_^。此外,由于我们的核心原本就有提供很多的核心工具给硬件开发商来使用, 而硬件开发商也需要针对核心所提供的功能来设计他们的驱动程序模块,因此, 我们如果想要自行使用硬件开发商所提供的模块来进行编译时,就需要使用到核心所提供的原始档当中, 所谓的头文件案 (header include file) 来取得驱动模块所需要的一些函式库或标头的定义啦! 也因此我们常常会发现到,如果想要自行编译核心模块时,就得要拥有核心原始码嘛!

    那核心原始码我们知道他是可能放置在 /usr/src/ 底下,早期的核心原始码被要求一定要放置到 /usr/src/linux/ 目录下,不过,如果您有多个核心在一个 Linux 系统当中,而且使用的原始码并不相同时, 呵呵~问题可就大了!所以,在 2.6 版以后,核心使用比较有趣的方法来设计他的原始码放置目录, 那就是以 /lib/modules/`uname -r`/build 及 /lib/modules/`uname -r`/source 这两个连结档来指向正确的核心原始码放置目录。如果以我们刚刚由 kernel 2.6.14.2 建立的核心模块来说, 那么他的核心模块目录底下有什么咚咚?
    [root@linux ~]# ls -l /lib/modules/2.6.14.2/
    lrwxrwxrwx  1 root root     23 Dec  2 15:45 build -> /usr/src/linux-2.6.14.2
    drwxr-xr-x  9 root root   4096 Dec  2 15:46 kernel
    -rw-r--r--  1 root root 216725 Dec  2 15:46 modules.alias
    -rw-r--r--  1 root root     69 Dec  2 15:46 modules.ccwmap
    -rw-r--r--  1 root root 176206 Dec  2 15:46 modules.dep
    -rw-r--r--  1 root root    739 Dec  2 15:46 modules.ieee1394map
    -rw-r--r--  1 root root    206 Dec  2 15:46 modules.inputmap
    -rw-r--r--  1 root root  16383 Dec  2 15:46 modules.isapnpmap
    -rw-r--r--  1 root root 175001 Dec  2 15:46 modules.pcimap
    -rw-r--r--  1 root root  83299 Dec  2 15:46 modules.symbols
    -rw-r--r--  1 root root 231507 Dec  2 15:46 modules.usbmap
    lrwxrwxrwx  1 root root     23 Dec  2 15:45 source -> /usr/src/linux-2.6.14.2
    
    其中比较有趣的除了那两个连结档之外,还有那个 modules.dep 档案也挺有趣的, 那个档案是记录了核心模块的相依属性的地方,依据该档案,我们可以简单的使用 modprobe 这个指令来加载模块呢!至于核心原始码提供的头文件,在上面的案例当中, 则是放置到 /usr/src/linux-2.6.14.2/include/ 目录中,当然就是藉由 build/source 这两个链接档案来取得目录所在的啦!^_^


    小标题的图示单一模块编译
    想象两个情况:
    • 如果我的默认核心忘记加入某个功能,而且该功能可以编译成为模块,不过, 默认核心却也没有将该项功能编译成为模块,害我不能使用时,该如何是好?

    • 如果 Linux 核心原始码并没有某个硬件的驱动程序 (module) ,但是开发该硬件的厂商有提供给 Linux 使用的驱动程序原始码,那么我又该如何将该项功能编进核心模块呢?
    很有趣对吧!不过,在这样的情况下其实没有什么好说的,反正就是 『去取得原始码后,重新编译成为系统可以加载的模块』啊!很简单,对吧!^_^ 但是,上面那两种情况的模块编译行为是不太一样的,不过,都是需要 make, gcc 以及核心所提供的 include 头文件与函式库等等。


  • 硬件开发商提供的额外模块:
  • 很多时候,可能由于核心默认的核心驱动模块所提供的功能您不满意, 或者是硬件开发商所提供的核心模块具有更强大的功能, 又或者该硬件是新的,所以预设的核心并没有该硬件的驱动模块时,那您只好自行由硬件开发商处取得驱动模块, 然后自行编译啰!

    如果您的硬件开发商有提供驱动程序的话,那么真的很好解决,直接下载该原始码,重新编译, 将他放置到核心模块该放置的地方后,呵呵!就能够使用了!举例来说,如果您不想使用核心原本提供的 Intel 网络卡模块,而想使用 Intel 官方释出的最新模块,例如下面这个例子: 您可以利用各种方法将他下载后,假设这个档案放置到 /root ,那么直接将他解压缩吧! 之后就可以读一读 INSTALL/README ,然后找一下 Makefile ,就能够编译了。整体流程有点像这样:
    1. 将档案解压缩:
    [root@linux ~]# cd /usr/local/src
    [root@linux src]# tar -zxvf /root/e100-3.4.14.tar.gz
    [root@linux src]# cd e100-3.4.14
    
    2. 开始进行编译与安装:
    [root@linux e100-3.4.14]# vi README  <==注意查一下该档案内容
    [root@linux e100-3.4.14]# cd src
    [root@linux src]# make
    # 此时您会看到出现如下这一行:
    # make[1]: Entering directory `/usr/src/kernels/2.6.13-1.1532_FC4-i686'
    # 这代表这个驱动程序在编译时,会去读取的核心原始码 include file
    # 的目录所在!有兴趣的朋友,务必查阅一下 Makefile 啦!
    [root@linux src]# ls -l
    -rw-r--r--  1 root root  77908 Jul  2 08:24 e100.c
    -rw-r--r--  1 root root 351351 Dec  5 00:48 e100.ko
    -rw-r--r--  1 root root   4775 Dec  5 00:48 e100.mod.c
    -rw-r--r--  1 root root  39684 Dec  5 00:48 e100.mod.o
    -rw-r--r--  1 root root 312564 Dec  5 00:48 e100.o
    -rw-r--r--  1 root root  21092 Jul  2 08:24 ethtool.c
    -rw-r--r--  1 root root  43258 Jul  2 08:24 kcompat.h
    -rw-r--r--  1 root root   9610 Jul  2 08:24 Makefile
    
    3. 开始将该模块移动到核心目录,并且更新模块相依属性!
    [root@linux src]# cp e100.ko  \
    > /lib/modules/`uname -r`/kernel/drivers/net
    [root@linux src]# cd /lib/modules/`uname -r`
    [root@linux 2.6.13-1.1532_FC4]# depmod -a
    
    有趣吧!透过这样的动作,我们就可以轻易的将模块编译起来,并且还可以将他直接放置到核心模块目录中, 同时以 depmod 将模块建立相关性,未来就能够利用 modprobe 来直接取用啦!^_^ 但是需要提醒您的是,当自行编译模块时, 若您的核心有更新 (例如利用自动更新机制进行在线更新) 时,则您必须要重新编译该模块一次, 重复上面的步骤!才行!因为这个模块仅针对目前的核心来编译的啊!对吧!


  • 利用旧有的核心原始码进行编译:
  • 举个例子来说,鸟哥目前 FC4 的核心就是 2.6 版,而且也有 NTFS 的原始码,只不过, FC4 就是没有将这个模块给他编译起来!那我能否使用目前的核心原始码进行 NTFS 文件系统的模块编译呢?当然可以啊!不过,我是否需要整个核心编译的过程从头来一次呢? 呵呵!当然不需要啊!否则~多麻烦~那该怎么作?

    很简单啦~我们首先到目前的核心原始码所在目录下达 make menuconfig , 然后将 NTFS 的选项设定成为模块,之后直接下达:
      make fs/ntfs/
    那么 ntfs 的模块就会自动的被编译出来了!可惜的是,预设的 FC4 核心原始码并没有附上所有的程序代码, 仅有提供相关的 Makefile 档案而已,伤脑筋~ 因此,您仅能以我们刚刚才建立的 /usr/src/linux-2.6.14.2 这个目录, 直接下达 make fs/ntfs 来建立起 ntfs.ko 这个模块~ 然后将该模块复制到 /lib/modules/2.6.14.2/kernel/fs/ntsf/ 目录下, 再去到 /lib/modules/2.6.14.2 底下执行 depmod -a ,呵呵~ 就可以在原来的核心底下新增某个想要加入的模块功能啰~ ^_^


    小标题的图示核心模块管理: lsmod, modinfo, modprobe, insmod, rmmod...
    核心与核心模块是分不开的,至于驱动程序模块在编译的时候,更与核心的原始码功能分不开~ 因此,您必须要先了解到:核心、核心模块、驱动程序模块、核心原始码与头文件案的相关性, 然后才有办法了解到为何编译驱动程序的时候老是需要找到核心的原始码才能够顺利编译! 然后也才会知道,为何当核心更新之后,自己之前所编译的核心模块会失效~

    此外,与核心模块有相关的,还有那个很常被使用的 modprobe 指令, 以及开机的时候会读取到的模块定义数据文件 /etc/modprobe.conf , 这些数据您也必须要了解才行~相关的指令说明我们已经在开机流程与 loader 文章内谈过了, 您应该要自行前往了解喔! ^_^

    2002/05/29:第一次完成
    2003/02/11:重新编排与加入 FAQ
    2004/06/11:原本的 2.4.xx 版本核心被移动到 此处
    2005/11/15:原本的模块管理已经先移动到开机流程管理那一篇啰!
    2005/12/05:经过将近一个月,呵呵!终于给他整理出来这一篇了~真难得~
    2007/06/27:增加了 initrd 的简单说明,详细还是得看 loader 那一章。
     
         
    http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

    本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室