关于 Linux 的内核编译流程介绍,与注意事项说明!
我们说的 Linux 其实指的就是内核 (kernel) 而已。这个内核控制你主机的所有硬件并提供系统所有的功能, 所以说,他重不重要啊!我们开机的时候其实就是利用开机管理程序加载这个内核文件来侦测硬件, 在内核加载适当的驱动程序后,你的系统才能够顺利的运作。现今的系统由于强调在线升级机制,因此非常不建议自订内核编译! 但是,如果你想要将你的 Linux 安装到 USB U盘、想要将你的 Eee PC 小笔电安装自己的 Linux , 想让你的 Linux 可以驱动你的小家电,此时,内核编译就是相当重要的一个任务了! 这一篇比较高端,如果你对系统移植没有兴趣的话,这一篇可以先略过喔! ^_^
我们在第一章里面就谈过 Linux 其实指的是内核!这个『内核 (kernel)』是整个操作系统的最底层,他负责了整个硬件的驱动,以及提供各种系统所需的内核功能,包括防火墙机制、是否支持 LVM 或 Quota 等文件系统等等,这些都是内核所负责的!所以啰,在第二十章的开机流程中,我们也会看到 MBR 内的 loader 加载内核文件来驱动整个系统的硬件呢! 也就是说,如果你的内核不认识某个最新的硬件,那么该硬件也就无法被驱动,你当然也就无法使用该硬件啰!
这已经是整个 Linux 基础的最后一篇了,所以,底下这些数据你应该都要『很有概念』才行~ 不能只是『好像有印象』~好了,那就复习一下内核的相关知识吧!
还记得我们在第十一章的 BASH shell 提到过:电脑真正在工作的东西其实是『硬件』, 例如数值运算要使用到 CPU、数据保存要使用到硬盘、图形显示会用到显卡、音乐发声要有音效芯片、连接 Internet 可能需要网络卡等等。那么如何控制这些硬件呢?那就是内核的工作了!也就是说,你所希望电脑帮你达成的各项工作, 都需要通过『内核』的帮助才行!当然啰,如果你想要达成的工作是内核所没有提供的, 那么你自然就没有办法通过内核来控制电脑使他工作啰!
举例来说,如果你想要有某个网络功能 (例如内核防火墙机制) ,但是你的内核偏偏忘记加进去这项功能, 那么不论你如何『卖力』的设置该网络套件,很抱歉!不来电!换句话说,你想要让电脑进行的工作,都必须要『内核有支持』才可以!这个标准不论在 Windows 或 Linux 这几个操作系统上都相同!如果有一个人开发出来一个『全新的硬件』,目前的内核不论 Windows 或 Linux 都不支持,那么不论你用什么系统,哈哈!这个硬件都是英雄无用武之地啦! 那么是否了解了『内核』的重要了呢?所以我们才需要来了解一下如何编译我们的内核啦!
那么内核到底是什么啊?其实内核就是系统上面的一个文件而已, 这个文件包含了驱动主机各项硬件的侦测程序与驱动模块。在第二十章的开机流程分析中,我们也提到这个文件被读入主内存的时机, 当系统读完 BIOS 并加载 MBR 内的开机管理程序后,就能够加载内核到内存当中。然后内核开始侦测硬件, 挂载根目录并取得内核模块来驱动所有的硬件,之后调用 /sbin/init 就能够依序启动所有系统所需要的服务了!
这个内核文件通常被放置成 /boot/vmlinuz ,不过也不见得, 因为一部主机上面可以拥有多个内核文件,只是开机的时候仅能选择一个来加载而已。 甚至我们也可以在一个 distribution 上面放置多个内核,然后以这些内核来做成多重开机呢!
既然内核文件都已经包含了硬件侦测与驱动模块,那么什么是内核模块啊?要注意的是, 现在的硬件更新速度太快了,如果我的内核比较旧,但我换了新的硬件,那么,这个内核肯定无法支持! 怎么办?重新拿一个新的内核来处理吗?开玩笑~内核的编译过程可是很麻烦的~
所以啰,为了这个缘故,我们的 Linux 很早之前就已经开始使用所谓的模块化设置了! 亦即是将一些不常用的类似驱动程序的咚咚独立出内核,编译成为模块,然后, 内核可以在系统正常运作的过程当中加载这个模块到内核的支持。如此一来, 我在不需要更动内核的前提之下,只要编译出适当的内核模块,并且加载他,呵呵!我的 Linux 就可以使用这个硬件啦!简单又方便!
那我的模块放在哪里啊?可恶!怎么会问这个傻问题呢?当然一定要知道的啦!就是 /lib/modules/$(uname -r)/kernel/ 当中啦!
刚刚上面谈到的内核其实是一个文件,那么这个文件怎么来的?当然是通过原代码 (source code) 编译而成的啊!因为内核是直接被读入到主内存当中的,所以当然要将他编译成为系统可以认识的数据才行!也就是说, 我们必须要取得内核的原代码,然后利用第二十二章 Tarball 安装方式提到的编译概念来达成内核的编译才行啊!(这也是本章的重点啊! ^_^)
现在我们知道硬件的驱动程序可以编译成为内核模块,所以可以在不改变内核的前提下驱动你的新硬件。 但是,很多朋友还是常常感到困惑,就是 Linux 上面针对最新硬件的驱动程序总是慢了几个脚步, 所以觉得好像 Linux 的支持度不足!其实不可以这么说的,为什么呢?因为在 Windows 上面,对于最新硬件的驱动程序需求,基本上,也都是厂商提供的驱动程序才能让该硬件工作的, 因此,在这个『驱动程序开发』的工作上面来说,应该是属于硬件发展厂商的问题, 因为他要我们买他的硬件,自然就要提供消费者能够使用的驱动程序啦!
所以,如果大家想要让某个硬件能够在 Linux 上面跑的话,那么似乎可以发起一人一信的方式,强烈要求硬件开发商发展 Linux 上面的驱动程序!这样一来,也可以促进 Linux 的发展呢!
除了 BIOS 之外,内核是操作系统中最早被加载到内存的咚咚, 他包含了所有可以让硬件与软件工作的信息,所以,如果没有搞定内核的话, 那么你的系统肯定会有点小问题!好了,那么是不是将『所有目前内核有支持的东西都给他编译进去我的内核中, 那就可以支持目前所有的硬件与可运行的工作啦!』!
这话说的是没错啦,但是你是否曾经看过一个为了怕自己今天出门会口渴、会饿、会冷、会热、会被车撞、 会摔跤、会被性骚扰,而在自己的大包包里面放了大瓶矿泉水、便当、厚外套、短裤、防撞钢梁、止滑垫、 电击棒....等一大堆东西,结果却累死在半路上的案例吗?当然有!但是很少啦!我相信不太有人会这样做! (会这么做的人通常都已经在医院了~) 取而代之的是会看一下天气,冷了就只带外套, 热了就只带短衣、如果穿的漂亮一点又预计晚点回家就多带个电击棒、 出远门到没有便利商店的地方才多带矿泉水....
说这个干什么!对啦!就是要你了解到,内核的编译重点在于『你要你的 Linux 作什么?』,是啦!如果没有必要的工作,就干脆不要加在你的内核当中了!这样才能让你的 Linux 跑得更稳、更顺畅!这也是为什么我们要编译内核的最主要原因了!
Linux 的内核有几个主要的特色,除了『Kernel 可以随时、随各人喜好而更动』之外,Kernel 的『版本更动次数太频繁』也是一个特点!所以啰,除非你有特殊需求, 否则一次编译成功就可以啦!不需要随时保持最新的内核版本,而且也没有必要 (编译一次内核要粉久的ㄋㄟ!) 。话说到这里又突然想到今天看到的一篇文章,大意是说老板想要雇用的人会希望是 Linux 的老手,因为他们比较容易了解问题的所在,除此之外,如果有任何问题发生,由于其使用 Linux 是可以随时修补漏洞的!但是如果是 Windows 的话,就得要将机器关闭,直到 MS 推出修补套件后才能再激活~
那么是否『我就一定需要在安装好了 Linux 之后就赶紧给他编译内核呢?』, 老实说,『并不需要的』!这是因为几乎每一个 distribution 都已经缺省编译好了相当大量的模块了, 所以用户常常或者可能会使用到的数据都已经被编译成为模块,也因此,呵呵! 我们用户确实不太需要重新来编译内核!尤其是『一般的用户, 由于系统已经将内核编译的相当的适合一般用户使用了,因此一般入门的用户,基本上, 不太需要编译内核』。
OK!那么鸟哥闲闲没事干跑来写个什么东西?既然都不需要编译内核还写编译内核的分享文章, 鸟哥卖弄才学呀?很抱歉,鸟哥虽然是个『不学有术』的混混,却也不会平白无故的写东西请您来指教~ 当然是有需要才会来编译内核啦!编译内核的时机可以归纳为几大类:
另外,需要注意重新编译内核虽然可以针对你的硬件作优化的步骤 (例如刚刚提到的 CPU 的问题!) ,不过由于这些优化的步骤对于整体性能的影响是很小很小的, 因此如果是为了增加性能来编译内核的话,基本上,效益不大!然而,如果是针对『系统稳定性』来考量的话, 那么就有充分的理由来支持你重新编译内核啰!
『如果系统已经运行很久了,而且也没有什么大问题, 加上我又不增加冷门的硬件设备,那么建议就不需要重新编译内核了』, 因为重新编译内核的最主要目的是『想让系统变的更稳!』既然你的 Linux 主机已经达到这个目的了,何必再编译内核?不过,就如同前面提到的, 由于缺省的内核不见得适合你的需要,加上缺省的内核可能并无法与你的硬件配备相配合, 此时才开始考虑重新编译内核吧!
由于『内核的主要工作是在控制硬件!』所以编译内核之前, 请先了解一下你的硬件配备,与你这部主机的未来功能!由于内核是『越简单越好!』所以只要将这部主机的未来功能给他编进去就好了! 其他的就不用去理他啦!
内核的版本问题,我们在第一章已经谈论过, 主要的版本定义为:『[主].[次].[发布]-[修改]』的样式。 你只要知道 2.6.x 是稳定版本,2.5.x 是测试用版本即可。 我们要使用最新的内核来重新编译内核时,大多就是使用那种偶数的内核版本啦!不过这里还是要再提一遍!就是『 2.4.x 与 2.6.x 是两个具有相当大差异的内核版本, 两者之间使用到的函数库基本上已经不相同了,所以在升级之前,如果你的内核原本是 2.4.xx 版,那么就升级到 2.4.xx 版本的最新版,不要由 2.4.xx 直接升级到 2.6.xx 版,否则到时可能会欲哭无泪~~』, 这个问题在讨论区一再地被提起!这里再次说明!
此外,2.4.xx 与 2.6.xx 的比较中,并不是 2.6.xx 就一定比 2.4.xx 还要新,因为这两种版本同时在进行维护与升级的工作!如果有兴趣的话,可以前往 Linux 内核网站 http://www.kernel.org 一看究竟,你就可以了解目前的内核变动情况了!
基本上,目前最新的 distributions ,包括 CentOS, FC, SuSE, Mandriva 等等,都使用 2.6 的内核, 所以,你可以直接由 http://www.kernel.org 下载最新的 2.6.xx 版本的内核来尝试编译啊!目前 (2009/07/27) 鸟哥可以查到的最新版本是 2.6.30 , 底下我们将主要以这个版本来测试。另外,由于较新的内核版本可能会多出一些选项, 因此若有不同的项目也没有关系!稍微查看一下说明内容就可以了解啦!
既然内核是个文件,要制作这个文件给系统使用则需要编译,既然要有编译,当然就得要有原代码啊! 那么原代码怎么来?基本上,依据你的 distributions 去挑选的内核原代码来源主要有:
事实上,各主要 distributions 在推出他们的产品时,其实已经都附上了内核原代码了! 以我们的 CentOS 5.x 为例,你可以在国家高速网络中心网站下载相关的内核 SRPM 的文件! 由于 CentOS 5.x 一直有在进行更新动作,因此你也可以在 update 的目录底下找到内核原代码喔!如下链接所示:
你或许会说:既然要重新编译,那么干嘛还要使用原本 distributions 发布的原代码啊?真没创意~ 话不是这么说,因为原本的 distribution 发布的原代码当中,含有他们设置好的缺省设置值, 所以,我们可以轻易的就了解到当初他们是如何选择与内核及模块有关的各项设置项目的参数值, 那么就可以利用这些可以配合我们 Linux 系统的缺省参数来加以修改,如此一来, 我们就可以『修改内核,调整到自己喜欢的样子』啰!而且编译的难度也会比较低一点!
虽然使用 distribution 发布的内核 source code 来重新编译比较方便,但是,如此一来, 新硬件所需要的新驱动程序,也就无法借由原本的内核原代码来编译啊! 所以啰,如果是站在要更新驱动程序的立场来看,当然使用最新的内核可能会比较好啊!
Linux 的内核目前是由其发明者 Linus Torvalds 所属团队在负责维护的,而其网站在底下的站址上,在该网站上可以找到最新的 kernel 信息!不过,美中不足的是目前的内核越来越大了 (linux-2.6.30.3.tar.bz2 这一版,这一个文件大约 57MB 了!),所以如果你的 ISP 连外很慢的话,那么使用台湾的映射站台来下载不失为一个好方法:
如果 (1)你曾经自行编译过内核,那么你的系统当中应该已经存在前几个版本的内核原代码, 以及上次你自行编译的参数设置值才对; (2)如果你只是想要在原本的内核底下加入某些特殊功能, 而该功能已经针对内核原代码推出 patch 补丁文件时。那你该如何进行内核原代码的更新,以便后续的编译呢?
其实每一次内核发布时,除了发布完整的内核压缩档之外,也会发布『该版本与前一版本的差异性 patch 文件』, 关于 patch 的制作我们已经在第二十二章当中提及, 你可以自行前往参考。这里仅是要提供给你的信息是,每个内核的 patch 仅有针对前一版的内核来分析而已, 所以,万一你想要由 2.6.27 升级到 2.6.30 的话,那么你就得要下载 patch-2.6.28, patch-2.6.29, patch-2.6.30 等文件,然后『依序』一个一个的去进行 patch 的动作后, 才能够升级到 2.6.30 喔!这个重要!不要忘记了。
但是,如果你想要升级 2.6.30 的修改版本到 2.6.30.3 时,由于修改版本是针对 2.6.30 来制作的, 因此你只要下载 patch-2.6.30.3 来直接将 2.6.30 升级至 2.6.30.3 即可。但反过来说,如果你要从 2.6.30.2 升级到 2.6.30.3 呢?很抱歉的是,并没有 2.6.30.2 到 2.6.30.3 的补丁文件,所以你必须要将 2.6.30.2 还原至 2.6.30, 然后才能使用 patch-2.6.30.3 来升级 2.6.30 喔!注意这个差异!
同样的,如果是某个硬件或某些非官方认定的内核添加功能网站所推出的 patch 文件时,你也必须要了解该 patch 文件所适用的内核版本,然后才能够进行 patch ,否则容易出现重大错误喔!这个项目对于某些商业公司的工程师来说是很重要的。 举例来说,鸟哥的一个高中同学在业界服务,他主要是进行类似 Eee PC 开发的计划,然而该计划的硬件是该公司自行推出的! 因此,该公司必须要自行搭配内核版本来设计他们自己的驱动程序,而该驱动程序并非 GPL 授权,因此他们就得要自行将驱动程序集成进内核!如果改天他们要将这个驱动程序发布,那么就得要利用 patch 的方式, 将硬件驱动程序文件发布,我们就得要自行以 patch 来更新内核啦!
在进行完 patch 之后,你可以直接检查一下原本的设置值,如果没有问题, 就可以直接编译,而不需要再重新的选择内核的参数值,这也是一个省时间的方法啊! 至于 patch file 的下载,同样是在 kernel 的相同目录下,寻找文件名是 patch 开头的就是了。
由于鸟哥是比较喜欢直接由内核官网取得原始内核的家伙,所以,底下的动作是使用 2.6.30.3 这个版本的内核来安装的! 如果你想要使用 distributions 提供的 SRPM 来处理的话,得自行找到 SRPM 的相关安装方法来处理啰! 其实看一下第二十二章就知道该如何处理啦。 总之,本章的内核原代码是由底下的链接取得的:
鸟哥这里假设你也是下载上述的链接内的文件,然后该文件放置到 /root 底下。由于 2.6.x 内核原代码一般建议放置于 /usr/src/kernels/ 目录底下,因此你可以这样处理:
[root@www ~]# tar -jxvf linux-2.6.30.3.tar.bz2 -C /usr/src/kernels/
此时会在 /usr/src/kernels 底下产生一个新的目录,那就是 linux-2.6.30.3 这个目录啰! 我们在下个小节会谈到的各项编译与设置,都必须要在这个目录底下进行才行喔!好了,那么这个目录底下的相关文件有啥咚咚? 底下就来谈谈:
在上述内核目录下含有哪些重要数据呢?基本上有底下这些东西:
这些数据先大致有个印象即可,至少未来如果你想要使用 patch 的方法加入额外的新功能时, 你要将你的原代码放置于何处?这里就能够提供一些指引了。当然,最好还是跑到 Documentation 那个目录底下去瞧瞧正确的说明, 对你的内核编译会更有帮助喔!
什么?内核编译还要进行前处理?没错啦!事实上,内核的目的在管理硬件与提供系统内核功能,因此你必须要先找到你的系统硬件, 并且规划你的主机未来的任务,这样才能够编译出适合你这部主机的内核!所以,整个内核编译的重要工作就是在『挑选你想要的功能』。 底下鸟哥就以自己的一部主机软/硬件环境来说明,解释一下如何处理内核编译啰!
鸟哥的一部主机硬件环境如下 (通过 /proc/cpuinfo 及 lspci 观察):
硬件大致如上,至于这部主机的需求,是希望做为未来在鸟哥上课时,可以通过虚拟化功能来处理学生的练习用虚拟机。 这部主机也是鸟哥用来放置学校上课教材的机器,因此,这部主机的 I/O 需求须要好一点,未来还需要打开防火墙、 WWW 服务器功能、FTP 服务器功能等,基本上,用途就是一部小型的服务器环境啰。大致上需要这样的功能啦!
了解了硬件相关的数据后,我们还得要处理一下内核原代码底下的残留文件才行!假设我们是第一次编译, 但是我们不清楚到底下载下来的原代码当中有没有保留目标文件 (*.o) 以及相关的设置档存在, 此时我们可以通过底下的方式来处理掉这些编译过程的目标文件以及设置档:
[root@www linux-2.6.30.3]# make mrproper
请注意,这个动作会将你以前进行过的内核功能选择文件也删除掉, 所以几乎只有第一次运行内核编译前才进行这个动作,其余的时刻,你想要删除前一次编译过程的残留数据, 只要下达:
[root@www linux-2.6.30.3]# make clean
因为 make clean 仅会删除类似目标档之类的编译过程产生的中间文件,而不会删除设置档! 很重要的!千万不要搞乱了喔!好了,既然我们是第一次进行编译,因此,请下达『make mrproper』吧!
不知道你有没有发现 /boot/ 底下存在一个名为 config-xxx 的文件?那个文件其实就是内核功能列表档! 我们底下要进行的动作,其实就是作出该文件!而我们后续小节所要进行的编译动作,其实也就是通过这个文件来处理的! 内核功能的挑选,最后会在 /usr/src/kernels/linux-2.6.30.3/ 底下产生一个名为 .config 的隐藏档, 这个文件就是 /boot/config-xxx 的文件啦!那么这个文件如何创建呢?你可以通过非常多的方法来创建这个文件! 常见的方法有:(注1)
大致的功能选择有上述的方法,不过鸟哥个人比较偏好 make menuconfig 这个项目啦!如果你喜欢使用图形接口, 然后使用鼠标去挑选所需要的功能时,也能使用 make xconfig 或 make gconfig ,不过需要有相关的图形接口支持! 如果你是升级内核原代码并且需要重新编译,那么使用 make oldconfig 会比较适当!好了,那么如何选择呢? 以 make menuconfig 来说,出现的画面会有点像这样:
看到上面的图标之后,你会发现画面主要分为两大部分,一个是大框框内的反白光柱,另一个则是底下的小框框, 里面有 select, exit 与 help 三个选项的内容。这几个组件的大致用法如下:
基本上建议只要『上下左右的方向键、空白键、Enter』这六个按键就好了!不要使用 Esc ,否则一不小心就有可能按错的!另外,关于整个内核功能的选择上面,建议你可以这样思考:
总之,尽量保持内核小而美,剩下的功能就编译成为模块,尤其是『需要考虑到未来扩充性』, 像鸟哥之前认为螃蟹卡就够我用的了,结果,后来竟然网站流量大增,鸟哥只好改换 3Com 的网络卡。 不过,我的内核却没有相关的模块可以使用~因为.....鸟哥自己编译的内核忘记加入这个模块了。 最后,只好重新编译一次内核的模块,呵呵!真是惨痛的教训啊!
由上面的图标当中,我们知道内核的可以选择的项目有很多啊!光是第一面,就有 16 个项目,每个项目内还有不同的细项!哇!真是很麻烦啊~每个项目其实都可能有 <Help> 的说明,所以,如果看到不懂的项目,务必要使用 Help 查阅查阅! 好了,底下我们就一个一个项目来看看如何选择吧!
与 Linux 最相关的进程交互、内核版本说明、是否使用发展中代码等信息都在这里设置的。 这里的项目主要都是针对内核与程序之间的相关性来设计的,基本上,保留默认值即可! 不要随便取消底下的任何一个项目,因为可能会造成某些程序无法被同时运行的困境喔! 不过底下有非常多新的功能,如果你有不清楚的地方,可以按 <Help> 进入查阅,里面会有一些建议! 你可以依据 Help 的建议来选择新功能的启动与否!
[ ] Prompt for development and/or incomplete code/drivers # 这个建议不要选择,因为我们不是内核专家,不需要使用发展中或不完整的代码! (vbird) Local version - append to kernel release [*] Automatically append version information to the version string # 我希望我的内核版本成为 2.6.30.3.vbird ,那这里可以就这样设置! Kernel compression mode (Bzip2) ---> # 建议选择成为 Bzip2 即可,因为压缩比较佳! [*] Support for paging of anonymous memory (swap) # 任何人均可访问 swap 是合理的!所以这里务必要勾选! [*] System V IPC # IPC 是 Inter Process Communication (进程通信) 缩写,与进程沟通有关,要选! [*] BSD Process Accounting [ ] BSD Process Accounting version 3 file format # 与标准 Unix (BSD) 的进程支持有关,但不要支持 version 3 ,可能有兼容性问题 [ ] Export task/process statistics through netlink (EXPERIMENTAL) # 这个额外的高端选项可以将他取消的! [*] Auditing support [*] Enable system-call auditing support # 上面这两个是额外内核功能 (如 SELinux) 加载时所需要的设置!务必选择 RCU Subsystem ---> RCU Implementation (Classic RCU) ---> # 选择标准 RCU 即可,不需要使用大量 CPU 的集成功能。 <M> Kernel .config support [ ] Enable access to .config through /proc/config.gz (NEW) # 让 .config 这个内核功能列表可以写入实际的内核文件中! (17) Kernel log buffer size (16 => 64KB, 17 => 128KB) [ ] Control Group support (NEW) ---> # 集成 CPU 或分离设备的功能,属于高端设置,我们先不要使用这功能。 [*] Create deprecated sysfs layout for older userspace tools (NEW) # 如果使用支持旧式设备,如 /sys/devices 者,这里要勾选!但如果是 2008 # 年后的 distribution ,这里可能需要取消喔! CentOS 5.x 要选的! -*- Kernel->user space relay support (formerly relayfs) -*- Namespaces support [*] UTS namespace (NEW) [*] IPC namespace (NEW) # 使用 uname 时,会输出较多的信息,所以可以尝试选择看看。 [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support () Initramfs source file(s) # 这是一定要的!因为要支持开机时加载 initail RAM disk 嘛! [*] Optimize for size # 可以减低内核的文件大小,其实是 gcc 参数使用 -Os 而不是 -O2 [ ] Configure standard kernel features (for small systems) ---> # 给嵌入式系统使用的,我们用 PC ,所以这里不选。 [ ] Strip assembler-generated symbols during link (NEW) [ ] Disable heap randomization (NEW) # 2000 年后推出的版本,可以取消这个项目! Choose SLAB allocator (SLAB) ---> [*] Profiling support (EXPERIMENTAL) [ ] Activate markers (NEW) <M> OProfile system profiling (EXPERIMENTAL) [ ] OProfile AMD IBS support (EXPERIMENTAL) (NEW) [*] Kprobes
要让你的内核能够支持动态的内核模块,那么底下的第一个设置就得要启动才行!至于第二个 block layer 则缺省是启动的, 你也可以进入该项目的细项设置,选择其中你认为需要的功能即可!
[*] Enable loadable module support ---> <==底下为细项 --- Enable loadable module support [ ] Forced module loading <==大概就是这个不要选,其他的都选起来! [*] Module unloading [*] Module versioning support [*] Source checksum for all module ================================================================================ -*- Enable the block layer ---> <==看吧!缺省就是已经选择了!底下为细项 [ ] Block layer data integrity support <==特殊保存设备支持,可以不选 IO Schedulers ---> <*> Anticipatory I/O scheduler <==较复杂的一种I/O调度 <*> Deadline I/O scheduler <==较适用于 database 的加载 <*> CFQ I/O scheduler <==较适用于 desktop 的环境 Default I/O scheduler (Deadline) ---> <==适用于鸟哥环境
进入『Processor type and features』后,请挑选你主机的实际 CPU 形式。鸟哥这里使用的是 Athlon 64 的 CPU, 而且鸟哥的主机还有启动 Xen 这个虚拟化的服务 (在一部主机上面同时启动多个操作系统),因此,所以底下的选择是这样的:
[*] Tickless System (Dynamic Ticks) <==可增加些许省电功能 [ ] High Resolution Timer Support [*] Symmetric multi-processing support <==多内核 CPU 环境必选 [ ] Support sparse irq numbering [*] Enable MPS table <==让多 CPU 支持 ACPI [ ] Support for extended (non-PC) x86 platforms [*] Single-depth WCHAN output [*] Paravirtualized guest support ---> <==支持半虚拟化功能 --- Paravirtualized guest support <==底下为 Xen 与 KVM 两种虚拟机支持! [*] Xen guest support (32) Maximum allowed size of a domain in gigabytes [*] Enable Xen debug and tuning parameters in debugfs [*] KVM paravirtualized clock [*] KVM Guest support -*- Enable paravirtualization code ================================================================================ [ ] paravirt-ops debugging (NEW) <==不需要具有 debug 的功能 [ ] Memtest Processor family (Opteron/Athlon64/Hammer/K8) ---> <==要选对啊! [*] AMD IOMMU support <==启动 AMD 的 IOMMU 功能! (8) Maximum number of CPUs [ ] SMT (Hyperthreading) scheduler support <==Intel CPU 的超线程功能 [*] Multi-core scheduler support <==多内核功能的支持 Preemption Model (No Forced Preemption (Server)) ---> # 这是与进程有关的设置项目,鸟哥这里创建 Server 主机,因此选这项! # 如果是台式机的使用,建议进入选择 desktop 项目。 [ ] Reroute for broken boot IRQs [*] Machine Check Exception <==可将内核侦测之错误回报到终端机显示! [*] Intel MCE features (NEW) [*] AMD MCE features (NEW) < > Dell laptop support <M> /dev/cpu/microcode - microcode support [ ] Intel microcode patch loading support [*] AMD microcode patch loading support <M> /dev/cpu/*/msr - Model-specific register support <*> /dev/cpu/*/cpuid - CPU information support < > /sys/kernel/debug/x86/cpu/* - CPU Debug support [ ] Numa Memory Allocation and Scheduler Support Memory model (Sparse Memory) ---> [*] Sparse Memory virtual memmap <==可强化些许内核性能 [ ] Allow for memory hot-add [*] Add LRU list to track non-evictable pages (65536) Low address space to protect from user allocation [ ] Check for low memory corruption [*] Reserve low 64K of RAM on AMI/Phoenix BIOSen <==重新侦测 BIOS 信息 [*] MTRR (Memory Type Range Register) support # 可以让 CPU 具有读取内存特殊区块的能力,尤其在高性能的显卡方面, # 可以增进不少性能。这个项目会产生 /proc/mtrr ,X 会读取这个咚咚喔。 [*] MTRR cleanup support (0) MTRR cleanup enable value (0-1) (1) MTRR cleanup spare reg num (0-7) [ ] x86 PAT support [ ] EFI runtime service support [*] Enable seccomp to safely compute untrusted bytecode Timer frequency (300 HZ) ---> # 这个项目则与内核针对某个事件立即回应的速度有关。Server 用途可以调整到 # 300Hz 即可,如果是台式机使用,需要调整高一点,例如 1000Hz 较佳! [*] kexec system call [ ] kernel crash dumps -*- Support for hot-pluggable CPUs [ ] Compat VDSO support <==旧式功能,可以不要选择 [ ] Built-in kernel command line <==正常开机菜单 (grub) 环境,不需要此项功能
如果选择了『Power management and ACPI options』之后,就会进入系统的电源管理机制中。 其实电源管理机制还需要搭配主板以及 CPU 的相关省电功能,才能够实际达到省电的效率啦! 不论是 Server 还是 Desktop 的使用,在目前电力不足的情况下,能省电就加以省电吧!
[*] Power Management support [ ] Power Management Debug Support [*] Suspend to RAM and standby [ ] Hibernation (aka 'suspend to disk') [*] ACPI (Advanced Configuration and Power Interface) Support ---> # 这是个较新的电源管理模块,由于选择后会增加内核约 70K ,所以 # 对嵌入式系统来说,可能需要考虑考虑。至于 desktop/server 当然就选择啊 --- ACPI (Advanced Configuration and Power Interface) Support [ ] Deprecated /proc/acpi files [*] Deprecated power /proc/acpi directories [*] Future power /sys interface [*] Deprecated /proc/acpi/event support <M> AC Adapter <M> Battery <M> Button -M- Video <*> Fan <*> Processor <*> Thermal Zone [ ] Debug Statements <M> PCI slot detection driver <M> Smart Battery System ================================================================================ CPU Frequency scaling ---> # 可以经过内核修改 CPU 的运作频率,在说明档当中也提及,还需要启动底下的 # dynamic cpufreq governor 才可以顺利的启动这个项目。 [*] CPU Frequency scaling [*] Enable CPUfreq debugging <M> CPU frequency translation statistics [*] CPU frequency translation statistics details Default CPUFreq governor (userspace) ---> -*- 'performance' governor <M> 'powersave' governor <M> 'userspace' governor for userspace frequency scaling <M> 'ondemand' cpufreq policy governor -*- 'conservative' cpufreq governor *** CPUFreq processor drivers *** <M> ACPI Processor P-States driver <*> AMD Opteron/Athlon64 PowerNow! <==因为我们是 AMD 的 CPU 啊! <M> Intel Enhanced SpeedStep (deprecated) < > Intel Pentium 4 clock modulation ================================================================================ -*- CPU idle PM support Memory power savings --->
这个项目则与总线有关啦!分为最常见的 PCI 与 PCI-express 的支持,还有笔记本电脑常见的 PCMCIA 插卡啊!要记住的是,那个 PCI-E 的接口务必要选取!不然你的新显卡可能会捉不到!
[*] PCI support [*] Support mmconfig PCI config space access [*] PCI Express support <M> PCI Express Hotplug driver [*] Root Port Advanced Error Reporting support -*- Message Signaled Interrupts (MSI and MSI-X) [*] Enable deprecated pci_find_* API [ ] PCI Debugging <M> PCI Stub driver [*] Interrupts on hypertransport devices [*] PCI IOV support <==与虚拟化有关!请加选此项! < > PCCard (PCMCIA/CardBus) support ---> <==鸟哥的主机不是 notebook,所以不选。 <*> Support for PCI Hotplug ---> <==不关机情况下,热拔插 PCI 设备 --- Support for PCI Hotplug <M> Fake PCI Hotplug driver <M> ACPI PCI Hotplug driver <M> ACPI PCI Hotplug driver IBM extensions [ ] CompactPCI Hotplug driver <M> SHPC PCI Hotplug driver
选择『Executable file formats / Emulations』会见到如下选项。 底下的选项必须要勾选才行喔!因为是给 Linux 内核运作运行档之用的数据。通常是与编译行为有关啦!
[*] Kernel support for ELF binaries [ ] Write ELF core dumps with partial segments <*> Kernel support for MISC binaries [*] IA32 Emulation <==因为我们这里是 64 比特,因此 32 比特为仿真结果 <M> IA32 a.out support
这个『Networking support』项目是相当重要的选项,因为他还包含了防火墙相关的项目!就是未来在服务器篇会谈到的防火墙 iptables 这个数据啊!所以,千万注意了!在这个设置项目当中,很多东西其实我们在基础篇还没有讲到, 因为大部分的参数都与网络、防火墙有关!由于防火墙是在启动网络之后再设置即可,所以绝大部分的内容都可以被编译成为模块,而且也建议你编成模块!有用到再加载到内核即可啊!
--- Networking support Networking options ---> # 就是这个光啊!里面的数据全部都是重要的防火墙项目!尽量编成模块啰! # 至于不晓得功能的部分,就尽量保留默认值即可! <*> Packet socket <==网络封包,当然要选择啊! [*] Packet socket: mmapped IO <*> Unix domain sockets <==Unix 插槽档,也一定要选择啊! <*> Transformation user configuration interface <M> PF_KEY sockets [*] TCP/IP networking <==能不选择 TCP/IP 吗? [*] IP: multicasting [*] IP: advanced router Choose IP: FIB lookup algorithm (FIB_HASH) ---> [*] IP: policy routing [*] IP: equal cost multipath [*] 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: IPsec transport mode <M> IP: IPsec tunnel mode <*> IP: IPsec BEET mode -*- Large Receive Offload (ipv4/tcp) <M> INET: socket monitoring interface [*] TCP: advanced congestion control ---> <==内部细项全为模块 <M> The IPv6 protocol ---> <==除必选外,内部细项全为模块 [*] NetLabel subsystem support -*- Security Marking [*] Network packet filtering framework (Netfilter) ---> # 这个就是我们一直讲的防火墙部分!里面细项几乎全选择成为模块! --- Network packet filtering framework (Netfilter) [ ] Network packet filtering debugging <==debug 部分不选! [*] Advanced netfilter configuration [*] Bridged IP/ARP packets filtering Core Netfilter Configuration ---> <M> IP virtual server support ---> IP: Netfilter Configuration ---> IPv6: Netfilter Configuration ---> <M> Ethernet Bridge tables (ebtables) support ---> # 上面的细项,除了必选外其他的都编成模块喔!原始没选的也请选为模块 ================================================================================ <M> Asynchronous Transfer Mode (ATM) <M> Classical IP over ATM [ ] Do NOT send ICMP if no neighbour <M> LAN Emulation (LANE) support < > Multi-Protocol Over ATM (MPOA) support <M> RFC1483/2684 Bridged protocols [ ] Per-VC IP filter kludge <M> 802.1d Ethernet Bridging <M> 802.1Q VLAN Support [ ] GVRP (GARP VLAN Registration Protocol) support <M> DECnet Support <M> ANSI/IEEE 802.2 LLC type 2 Support [ ] IPX: Full internal IPX network (NEW) <M> Appletalk protocol support < > Appletalk interfaces support <M> Phonet protocols family [*] QoS and/or fair queueing ---> <==内容同样全为模块! [ ] Data Center Bridging support Network testing ---> <==保留成模块默认值 ================================================================================ # 底下的则是一些特殊的网络设备,例如红外线啊、蓝芽啊! # 如果不清楚的话,就使用模块吧!除非你真的知道不要该项目! [ ] Amateur Radio support ---> < > CAN bus subsystem support ---> < > IrDA (infrared) subsystem support ---> <M> Bluetooth subsystem support ---> # 这个是蓝芽支持,同样的,里面除了必选之外,其他通通挑选成为模块! [*] Wireless ---> # 这个则是无线网络设备,里面保留默认值,但可编成模块的就选模块 <M> WiMAX Wireless Broadband support ---> # 新一代的无线网络,也请勾选成为模块! {M} RF switch subsystem support --->
进入『Device Drivers』这个是所有硬件设备的驱动程序库!哇!光是看到里面这么多内容,鸟哥头都昏了~ 不过,为了你自己的主机好,建议你还是得要一个项目一个项目的去挑选挑选才行~ 这里面的数据就与你主机的硬件有绝对的关系了!
在这里面真的很重要,因为很多数据都与你的硬件有关。内核推出时的默认值是比较符合一般状态的, 所以很多数据其实保留默认值就可以编的很不错了!不过,也因为较符合一般状态, 所以内核额外的编译进来很多跟你的主机系统不符合的数据,例如网络卡设备~ 你可以针对你的主板与相关硬件来进行编译。不过,还是要记得有『未来扩充性』的考量! 之前鸟哥不是谈过吗,我的网络卡由螃蟹卡换成 3Com 时,内核捉不到~ 因为...鸟哥并没有将 3Com 的网络卡编译成为模块啊! @_@
Generic Driver Options ---> <==与固件有关,保留默认值即可 <*> Connector - unified userspace <-> kernelspace linker ---> # 与用户/内核层级的信息沟通有关,务必要选择啊! <M> Memory Technology Device (MTD) support ---> # 例如闪存(拇指碟之类)之支持,通常与嵌入式系统有关! # 但由于我们也会用到U盘,所以里面的数据全编为模块! <M> Parallel port support ---> # 平行串口的支持,例如早期的 25 针打印机与 9 针鼠标等,细项全编为模块! -*- Plug and Play support ---> <==不啰唆!当然要选择这个项目! [*] Block devices ---> <==区块设备,就是一些保存媒体!细项内容请全编为模块 [*] Misc devices ---> <==一些较冷门的设备,建议还是全部编为模块! <*> ATA/ATAPI/MFM/RLL support ---> <==IDE 接口相关的芯片组! # 这个其实与主板的南桥芯片有关!由于鸟哥的主机为 ALi 的板子,所以: <*> ALI M15x3 chipset support # 除了可以保留默认值之外,你也可以将没用到的驱动程序取消选择。较重要的还有: [ ] Support for SATA (deprecated; conflicts with libata SATA driver) # 这个一定不能选!因为 SATA 的模块是在 SCSI 中! <*> Include IDE/ATAPI CDROM support # IDE 的 CDROM 最好直接编译进内核! # 其余的驱动程序鸟哥几乎都选择成为模块了!没用到的芯片也将 * 也改成 M 哩! ================================================================================ SCSI device support ---> # 这部份是 SCSI 保存媒体的驱动程序!请一定要选择!因为: # 1. 因为 USB 设备用的就是仿真 SCSI 啊! # 2. 因为 SATA 的设置项目就在这里面! <M> 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 <M> SCSI Enclosure 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 [*] Asynchronous SCSI scanning SCSI Transports ---> <==细项保留默认值 [*] SCSI low-level drivers ---> <==主要是磁盘数组卡,细项可全选为模块 <M> SCSI Device Handlers ---> <==细项全选为模块 < > OSD-Initiator library ================================================================================ <M> Serial ATA (prod) and Parallel ATA (experimental) drivers ---> # SATA 之类的磁盘驱动程序!这里的模块与 SCSI 模块是有相依属性的关系! # 底下的细项全部选择模块,尤其是 ALi 的这个项目,对鸟哥来说,是一定要勾选的 <M> ALi PATA support [*] Multiple devices driver support (RAID and LVM) ---> # RAID 与 LVM 怎可不选!我们第十五章才讲过这东西!细项均保留默认值即可 [ ] Fusion MPT device support ---> # 一种高端的 SCSI 控制器,可选可不选!因为鸟哥这里不会用到,所以不选! IEEE 1394 (FireWire) support ---> # 这个就是俗称的『火线』,许多外置式设备可能会用这个接口,因此, # 在此部分内的细项部分,请务必设置为模块喔!不要忘了! <M> I2O device support ---> <==细项亦全选为模块! [ ] Macintosh device drivers ---> <==我们是 PC ,所以不需支持麦金塔周边 [*] Network device support ---> <==网络设备的支持是必选! --- Network device support [*] Enable older network device API compatibility <M> Intermediate Functional Block 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> Virtual ethernet pair device <M> General Instruments Surfboard 1000 < > ARCnet support ---> <==较早期的网卡规格,可不选择! {M} PHY Device support and infrastructure ---> <==细项全为模块 [*] Ethernet (10 or 100Mbit) ---> [*] Ethernet (1000 Mbit) ---> [*] Ethernet (10000 Mbit) ---> # 上面三个以太网路网卡支持,不论是否用的到,细项请全编为模块来待命吧! < > Token Ring driver support ---> <==IBM 的 LAN ,可不选! Wireless LAN ---> WiMAX Wireless Broadband devices ---> USB Network Adapters ---> # 上面三个为现阶段很热门的无线网络设备,所以全部内容的细项全选择 # 为模块!免得未来你的主机加上新的无线设备时会找不到驱动程序! [ ] Wan interfaces support ---> <==WAN 的广域网络设备应该就不用选择了! [ ] ATM drivers ---> <==高端的 ATM 设备也不用选吧! <*> Xen network device frontend driver <*> FDDI driver support <M> Digital DEFTA/DEFEA/DEFPA adapter support [ ] Use MMIO instead of PIO (NEW) <M> SysKonnect FDDI PCI support <M> PLIP (parallel port) support <M> 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 <M> PPP BSD-Compress compression <M> PPP over ATM # 如果你有 ADSL 拨接的话,呵呵!PPP 的设备也要选择上喔! <M> SLIP (serial line) support [*] CSLIP compressed headers [*] Keepalive and linefill [ ] Six bit SLIP encapsulation [*] Fibre Channel driver support ================================================================================ [ ] ISDN support ---> < > Telephony support ---> # 这两个设备没用到,所以也可以不要选择! Input device support ---> # 这里面含有鼠标、键盘、摇杆、触摸版等输入设备,尽量全选为模块吧! Character devices ---> # 周边组件设备部分,也全选为模块吧! {M} I2C support ---> # 还记得我们去侦测主板的温度与压力吧?呵呵!那就是通过内核的这个 I2C # 的模块功能!ALi 缺省没有被编入内核,所以请进入选择成模块! [ ] SPI support ---> [ ] GPIO Support ---> < > Dallas's 1-wire support ---> -*- Power supply class support ---> # 绝大部分都没有用到的咚咚,所以保留默认值,不选择! <M> Hardware Monitoring support ---> # 硬件侦测器的支持,记得也要挑选,然后内容全为模块! -*- Generic Thermal sysfs driver ---> [*] Watchdog Timer Support ---> <==需搭配 watchdog 服务 # 若搭配 watchdog 服务,可以设置在某些特定状况下重新启动主机! Sonics Silicon Backplane ---> Multifunction device drivers ---> # 鸟哥没有这样的设备,所以也没有选择! [ ] Voltage and Current Regulator Support ---> Multimedia devices ---> # 一堆多媒体设备如图像截取卡、FM 广播声卡。但如果你的 Linux 是台式机, # 里面需要挑选成模块较佳!因为一大堆多媒体适配器! Graphics support ---> <==这就重要了!显卡选择! # 嘿嘿!重点之一,显卡的芯片组~刚刚前面提到的都是主板的对显卡的 # 总线支持 (PCI-E 与 AGP) ,这里则是针对显卡芯片!鸟哥的显卡是 NVidia # 的,所以将他选择即可!其他的可以编成模块! <M> Sound card support ---> # 声卡部分,也全部选择成为模块啦!反正编成模块又不用钱~ [*] HID Devices ---> <==人机接口设备,保留默认值即可(也可不选) [*] USB support ---> # 不能不选的 USB ,内容也全部是模块即可!尤其底下这三个: <M> EHCI HCD (USB 2.0) support <M> OHCI HCD support <M> UHCI HCD (most Intel and VIA) support <M> MMC/SD/SDIO card support ---> <==多媒体适配器,保留默认值 < > Sony MemoryStick card support (EXPERIMENTAL) ---> -*- LED Support ---> [ ] Accessibility support ---> <M> InfiniBand support ---> <==高端网络设备 [*] EDAC - error detection and reporting ---> <M> Real Time Clock ---> <==内容选为模块吧! [ ] DMA Engine support ---> [ ] Auxiliary Display support ---> < > Userspace I/O drivers ---> [*] Xen memory balloon driver [*] Scrub pages before returning them to system <*> Xen filesystem [*] Create compatibility mount point /proc/xen [ ] Staging drivers ---> [ ] X86 Platform Specific Device Drivers ---> # 一堆笔记本电脑的驱动,可以不选啦!
底下则与 Firmware Drivers 有关喔!基本上,都保留默认值就好了!
<M> BIOS Enhanced Disk Drive calls determine boot disk [ ] Sets default behavior for EDD detection to off (NEW) <M> BIOS update support for DELL systems via sysfs <M> Dell Systems Management Base Driver [*] Export DMI identification via sysfs to userspace [*] iSCSI Boot Firmware Table Attributes <M> iSCSI Boot Firmware Table Attributes module
文件系统的支持也是很重要的一项内核功能!因为如果不支持某个文件系统,那么我们的 Linux kernel 就无法认识,当然也就无法使用啦!例如 Quota, NTFS 等等特殊的 filesystem 。 这部份也是有够麻烦~因为涉及内核是否能够支持某些文件系统,以及某些操作系统支持的 partition table 项目。在进行选择时,也务必要特别的小心在意喔! 尤其是我们常常用到的网络操作系统 (NFS/Samba 等等),以及基础篇谈到的 Quota 等, 你都得要勾选啊!否则是无法被支持的。比较有趣的是 NTFS 在这一版的内核里面竟然有支持可写入的项目, 着实让鸟哥吓了一跳了!^_^
<*> 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 <==建议这里直接编进内核 [ ] Default to 'data=ordered' in ext3 (legacy option) [*] Ext3 extended attributes [*] Ext3 POSIX Access Control Lists [*] Ext3 Security Labels <M> The Extended 4 (ext4) filesystem [*] Enable ext4dev compatibility [*] Ext4 extended attributes (NEW) [*] Ext4 POSIX Access Control Lists [*] Ext4 Security Labels # 上面是传统的 EXT2/EXT3 及高端的 EXT4 支持!除了 EXT4 外,其他编入内核吧! ================================================================================ [ ] JBD (ext3) debugging support [ ] JBD2 (ext4) debugging support (NEW) <M> Reiserfs support [ ] Enable reiserfs debug mode (NEW) [ ] Stats in /proc/fs/reiserfs (NEW) [ ] ReiserFS extended attributes (NEW) < > JFS filesystem support <M> XFS filesystem support [*] XFS Quota support [*] XFS POSIX ACL support [*] XFS Realtime subvolume support < > OCFS2 file system support [*] Dnotify support [*] Inotify file change notification support [*] Inotify support for userspace [*] Quota support [ ] Report quota messages through netlink interface [*] Print quota warnings to console (OBSOLETE) < > Old quota format support <*> Quota format v2 support <M> Kernel automounter support <M> Kernel automounter version 4 support (also supports v3) < > FUSE (Filesystem in Userspace) support # XFS 以及 Reiserfs 与 Quota 建议也是选择起来放啦! ================================================================================ Caches ---> CD-ROM/DVD Filesystems ---> <==CD内的文件格式,默认值即可 DOS/FAT/NT Filesystems ---> <==有支持 NTFS ,要进入挑挑! <M> MSDOS fs support <M> VFAT (Windows-95) fs support (950) Default codepage for FAT <==支持繁体中文 (utf8) Default iocharset for FAT <==支持万国码 <M> NTFS file system support [ ] NTFS debugging support (NEW) [*] NTFS write support ================================================================================ Pseudo filesystems ---> <==类似 /proc ,保留默认值 [*] Miscellaneous filesystems ---> <==其他文件系统的支持,保留默认值 [*] Network File Systems ---> <==网络文件系统!很重要!也要挑挑! --- Network File Systems <M> NFS client support [*] NFS client support for NFS version 3 [*] NFS client support for the NFSv3 ACL protocol extension <M> NFS server support [*] NFS server support for NFS version 3 [*] NFS server support for the NFSv3 ACL protocol extension < > SMB file system support (OBSOLETE, please use CIFS) <M> CIFS support (advanced network filesystem, SMBFS successor) # 最重要就这几项,其他保留默认值即可! ================================================================================ Partition Types ---> <==分割类型,也是保持默认值即可! -*- Native language support ---> <==选择缺省的语系 --- Native language support (utf8) Default NLS Option <*> Traditional Chinese charset (Big5) # 除了上述这两个之外,其他的请选择成为模块即可!
再接下来有个『Kernel hacking』的项目,那是与内核开发者比较有关的部分,这部分建议保留默认值即可, 应该不需要去修改他!除非你想要进行内核方面的研究喔。然后底下有个『 Security Options 』,那是属于信息安全方面的设置, 包括 SELinux 这个细部权限强化模块也在这里编入内核的!这部分可以作一些额外的设置。 另外还有『 Cryptographic API 』这个密码应用程序接口工具选项,也是可以保留默认值啦! 我们来看看有什么比较特殊的地方吧!
Security options ---> [*] Enable access key retention support [*] Enable the /proc/keys file by which keys may be viewed [*] Enable different security models [ ] Enable the securityfs filesystem [*] Socket and Networking Security Hooks [*] XFRM (IPSec) Networking Security Hooks [ ] Security hooks for pathname based access control [ ] File POSIX Capabilities [ ] Root Plug Support [*] NSA SELinux Support [*] NSA SELinux boot parameter (1) NSA SELinux boot parameter default value [*] NSA SELinux runtime disable [*] NSA SELinux Development Support [*] NSA SELinux AVC Statistics (1) NSA SELinux checkreqprot default value [ ] NSA SELinux maximum supported policy format version [ ] Simplified Mandatory Access Control Kernel Support [ ] TOMOYO Linux Support [ ] Integrity Measurement Architecture(IMA) # 基本上,这部分保留默认值就对了!你也会发现 NSA 的数据都是直接编进内核! ================================================================================ Cryptographic API ---> # 基本上,除了底下这两个编译进内核之外,其他的通通选择成为模块吧! {*} MD5 digest algorithm {*} SHA1 digest algorithm
在密码应用程序接口方面,一般我们使用的帐号密码登录利用的就是 MD5 这个加密机制,要让内核有支持才行啊!几乎所有的项目都给他做成模块即可! 不过 MD5 与 SHA1 必须要直接由内核支持比较好!
虚拟化是近年来非常热门的一个议题,因为电脑的能力太强,所以时常闲置在那边, 此时,我们可以通过虚拟化技术在一部主机上面同时启动多个操作系统来运作,这就是所谓的虚拟化。 Linux 内核已经主动的纳入虚拟化功能喔!而 Linux 认可的虚拟化使用的机制为 KVM (Kernel base Virtual Machine)。 至于常用的内核函数库也可以全部编为模块啰!
[*] Virtualization ---> --- Virtualization <M> Kernel-based Virtual Machine (KVM) support <M> KVM for Intel processors support <M> KVM for AMD processors support [ ] KVM trace support (NEW) <M> Virtio balloon driver (EXPERIMENTAL) ================================================================================ Library routines ---> {M} CRC-CCITT functions {M} CRC16 functions {M} CRC calculation for the T10 Data Integrity Field {M} CRC ITU-T V.41 functions -*- CRC32 functions <M> CRC7 functions {*} CRC32c (Castagnoli, et al) Cyclic Redundancy-Check
最后,还有底下这两个项目,这两个项目与内核功能无关,但是与挑选时的设置文件有关:
Load an Alternate Configuration File Save an Alternate Configuration File
这两个项目分别是保存刚刚做好的所有项目的设置数据,另一个则是将来自其他人作的选择给他读入! 事实上,刚刚我们所做的设置只要在离开时选择 SAVE ,那么这些项目 通通会记录到目前这个目录下的 .config 文件内。 而我们也可以使用上面提到的 Save Configuration 这个项目来将刚刚做完的设置保存成另外的文件, 做成这个文件的好处是,你可以在下次在其他版本的内核作选择时,直接以 Load 来将这个文件的设置项目读入,这样可以减少你还要重新挑选一遍的困境啊!
要请你注意的是,上面的数据主要是适用在鸟哥的个人机器上面的, 目前鸟哥比较习惯使用原本 distributions 提供的缺省内核,因为他们也会主动的进行更新, 所以鸟哥就懒的自己重编内核了~ ^_^
此外,因为鸟哥重视的地方在于『网络服务器』上面,所以里头的设置少掉了相当多的个人桌面型 Linux 的硬件编译!所以,如果你想要编译出一个适合你的机器的内核, 那么可能还有相当多的地方需要来修正的!不论如何,请随时以 Help 那个选项来看一看内容吧!反正 Kernel 重编的几率不大!花多一点时间重新编译一次! 然后将该编译完成的参数文件保存下来,未来就可以直接将该文件叫出来读入了! 所以花多一点时间安装一次就好!那也是相当值得的!
将最复杂的内核功能选择完毕后,接下来就是进行这些内核、内核模块的编译了!而编译完成后,当然就是需要使用噜~ 那如何使用新内核呢?就得要考虑 grub 这个玩意儿啦!底下我们就来处理处理:
内核与内核模块需要先编译起来,而编译的过程其实非常简单,你可以先使用『 make help 』去查阅一下所有可用编译参数, 就会知道有底下这些基本功能:
[root@www linux-2.6.30.3]# make vmlinux <==未经压缩的内核 [root@www linux-2.6.30.3]# make modules <==仅内核模块 [root@www linux-2.6.30.3]# make bzImage <==经压缩过的内核(缺省) [root@www linux-2.6.30.3]# make all <==进行上述的三个动作
我们常见的在 /boot/ 底下的内核文件,都是经过压缩过的内核文件,因此,上述的动作中比较常用的是 modules 与 bzImage 这两个,其中 bzImage 第三个字母是英文大写的 I 喔!bzImage 可以制作出压缩过后的内核, 也就是一般我们拿来进行系统开机的信息啰!所以,基本上我们会进行的动作是:
[root@www linux-2.6.30.3]# make clean <==先清除暂存盘 [root@www linux-2.6.30.3]# make bzImage <==先编译内核 [root@www linux-2.6.30.3]# make modules <==再编译模块
上述的动作会花费非常长的时间,编译的动作依据你选择的项目以及你主机硬件的性能而不同。 最后制作出来的数据是被放置在 /usr/src/kernels/linux-2.6.30.3/ 这个目录下,还没有被放到系统的相关路径中喔!在上面的编译过程当中,如果有发生任何错误的话, 很可能是由于内核项目的挑选选择的不好,可能你需要重新以 make menuconfig 再次的检查一下你的相关设置喔! 如果还是无法成功的话,那么或许将原本的内核数据内的 .config 文件,拷贝到你的内核源文件目录下, 然后据以修改,应该就可以顺利的编译出你的内核了。最后注意到,下达了 make bzImage 后,最终的结果应该会像这样:
Root device is (8, 1) Setup is 12696 bytes (padded to 12800 bytes). System is 2207 kB CRC 7701ab0e Kernel: arch/x86/boot/bzImage is ready (#1) [root@www linux-2.6.30.3]# ll arch/x86/boot/bzImage -rw-r--r-- 1 root root 2272432 7月 30 13:35 arch/x86/boot/bzImage
可以发现你的内核已经编译好而且放置在 /usr/src/kernels/linux-2.6.30.3/arch/x86/boot/bzImage 里面啰~那个就是我们的内核文件!最重要就是他啦!我们等一下就会安装到这个文件哩! 然后就是编译模块的部分啰~ make modules 进行完毕后,就等着安装啦! ^_^
安装模块前有个地方得要特别强调喔!我们知道模块是放置到 /lib/modules/$(uname -r) 目录下的,那如果同一个版本的模块被反复编译后来安装时,会不会产生冲突呢?举例来说,鸟哥这个 2.6.30.3 的版本第一次编译完成且安装妥当后,发现有个小细节想要重新处理,因此又重新编译过一次,那两个版本一模一样时, 模块放置的目录会一样,此时就会产生冲突了!如何是好?有两个解决方法啦:
鸟哥建议使用第二个方式,因为如此一来,你的模块放置的目录名称就不会相同,这样也就能略过上述的目录同名问题啰! 好,那么如何安装模块到正确的目标目录呢?很简单,同样使用 make 的功能即可:
[root@www linux-2.6.30.3]# make modules_install [root@www linux-2.6.30.3]# ll /lib/modules/ drwxr-xr-x 3 root root 4096 7月 30 14:31 2.6.30.3vbird
看到否,最终会在 /lib/modules 底下创建起你这个内核的相关模块喔!不错吧!模块这样就已经处理妥当啰~ 接下来,就是准备要进行内核的安装了!哈哈!又跟 grub 有关啰~
现在我们知道内核文件放置在 /usr/src/kernels/linux-2.6.30.3/arch/x86/boot/bzImage ,但是其实系统内核理论上都是摆在 /boot 底下,且为 vmlinuz 开头的文件名。 此外,我们也晓得一部主机是可以做成多重开机系统的!这样说,应该知道鸟哥想要干嘛了吧? 对啦!我们将同时保留旧版的内核,并且添加新版的内核在我们的主机上面。
保留旧内核有什么好处呢?最大的好处是可以确保系统能够顺利开机啦!因为内核虽然被编译成功了, 但是并不保证我们刚刚挑选的内核项目完全适合于目前这部主机系统, 可能有某些地方我们忘记选择了,这将导致新内核无法顺利驱动整个主机系统,更差的情况是, 你的主机无法成功开机成功!此时,如果我们保留旧的内核,呵呵!若新内核测试不通过,就用旧内核来启动啊!嘿嘿! 保证比较不会有问题嘛!新内核通常可以这样作的:
[root@www ~]# cp /usr/src/kernels/linux-2.6.30.3/arch/x86/boot/bzImage \ > /boot/vmlinuz-2.6.30.3vbird <==实际内核 [root@www ~]# cp /usr/src/kernels/linux-2.6.30.3/.config \ > /boot/config-2.6.30.3vbird <==建议设置档也拷贝备份
还记得第二十章谈过的 initrd 这个玩意儿吧! 由于鸟哥的系统使用 SATA 磁盘,加上刚刚 SATA 磁盘支持的功能并没有直接编译到内核去,所以当然要使用 initrd 来加载才行! 使用如下的方法来创建 initrd 吧!记得搭配正确的内核版本喔!
[root@www ~]# mkinitrd -v /boot/initrd-2.6.30.3vbird.img 2.6.30.3vbird ....(前面省略).... Adding module ehci-hcd Adding module ohci-hcd Adding module uhci-hcd ....(后面省略)....
鸟哥这部测试机之前是使用 Xen 的内核来启动的,但因为 Xen 内核的制作比较复杂,本章并没有实作出 Xen 虚拟机的内核。 底下鸟哥使用的是刚刚编译成功的内核来进行开机菜单的设置,你会看到的设置档与你的环境可能会有不一样喔! 那就来看看吧!
[root@www ~]# vim /boot/grub/menu.lst default=0 timeout=10 splashimage=(hd0,0)/boot/grub/splash.xpm.gz #hiddenmenu title CentOS (2.6.18-128.2.1.el5xen) root (hd0,0) kernel /boot/xen.gz-2.6.18-128.2.1.el5 module /boot/vmlinuz-2.6.18-128.2.1.el5xen ro root=LABEL=/ rhgb quiet module /boot/initrd-2.6.18-128.2.1.el5xen.img title CentOS testing kernel from vbird root (hd0,0) kernel /boot/vmlinuz-2.6.30.3vbird ro root=LABEL=/ rhgb initrd /boot/initrd-2.6.30.3vbird.img
添加上述的特殊字体到你的设置档当中。另外,你会发现我上头的 default 并没有修改到最新的那个内核的菜单上, 因为我必须要测试一下新内核能否顺利开机!如果顺利开机且运作没有问题后,那么才来修订这个 default 的值吧!
如果上述的动作都成功后,接下来就是重新开机并选择新内核来启动系统啦!如果系统顺利启动之后,你使用 uname -a 会出现类似底下的数据:
[root@www ~]# uname -a Linux www.vbird.tsai 2.6.30.3vbird #1 SMP Thu Jul 30 13:34:31 CST 2009 x86_64 x86_64 x86_64 GNU/Linux
包括内核版本与支持的硬件平台都是 OK 的!嘿嘿!那你所编译的内核就是差不多成功的啦! 如果运作一阵子后,你的系统还是稳定的情况下,那就能够将 default 值使用这个新的内核来作为缺省开机啰! 这就是内核编译!那你也可以自己处理嵌入式系统的内核编译啰! ^_^
我们现在知道内核所支持的功能当中,有直接编译到内核内部的,也有使用插件模块的,插件模块可以简单的想成就是驱动程序 啦!那么也知道这些内核模块依据不同的版本,被分别放置到 /lib/modules/$(uname -r)/kernel/ 目录中,各个硬件的驱动程序则是放置到 /lib/modules/$(uname -r)/kernel/drivers/ 当中!换个角度再来思考一下,如果刚刚我自己编译的数据中,有些驱动程序忘记编译成为模块了,那是否需要重新进行上述的所有动作? 又如果我想要使用硬件厂商发布的新驱动程序,那该如何是好?
由于我们的内核原本就有提供很多的内核工具给硬件开发商来使用, 而硬件开发商也需要针对内核所提供的功能来设计他们的驱动程序模块,因此, 我们如果想要自行使用硬件开发商所提供的模块来进行编译时,就需要使用到内核所提供的源文件当中, 所谓的头文件 (header include file) 来取得驱动模块所需要的一些函数库或标头的定义啦! 也因此我们常常会发现到,如果想要自行编译内核模块时,就得要拥有内核原代码嘛!
那内核原代码我们知道他是可能放置在 /usr/src/ 底下,早期的内核原代码被要求一定要放置到 /usr/src/linux/ 目录下,不过,如果你有多个内核在一个 Linux 系统当中,而且使用的原代码并不相同时, 呵呵~问题可就大了!所以,在 2.6 版以后,内核使用比较有趣的方法来设计他的原代码放置目录, 那就是以 /lib/modules/$(uname -r)/build 及 /lib/modules/$(uname -r)/source 这两个链接档来指向正确的内核原代码放置目录。如果以我们刚刚由 kernel 2.6.30.3 创建的内核模块来说, 那么他的内核模块目录底下有什么咚咚?
[root@www ~]# ll -h /lib/modules/2.6.30.3vbird/ lrwxrwxrwx 1 root root 31 7月 30 14:29 build -> /usr/src/kernels/linux-2.6.30.3 drwxr-xr-x 10 root root 4.0K 7月 30 14:30 kernel -rw-r--r-- 1 root root 337K 7月 30 14:31 modules.alias -rw-r--r-- 1 root root 69 7月 30 14:31 modules.ccwmap -rw-r--r-- 1 root root 224K 7月 30 14:31 modules.dep ....(中间省略).... lrwxrwxrwx 1 root root 31 7月 30 14:29 source -> /usr/src/kernels/linux-2.6.30.3
比较有趣的除了那两个链接档之外,还有那个 modules.dep 文件也挺有趣的, 那个文件是记录了内核模块的相依属性的地方,依据该文件,我们可以简单的使用 modprobe 这个指令来加载模块呢!至于内核原代码提供的标头档,在上面的案例当中, 则是放置到 /usr/src/kernels/linux-2.6.30.3/include/ 目录中,当然就是借由 build/source 这两个链接文件来取得目录所在的啦!^_^
由于内核模块的编译其实与内核原本的原代码有点关系的,因此如果你需要重新编译模块时, 那除了 make, gcc 等主要的编译软件工具外,你还需要的就是 kernel-devel 这个软件!记得一定要安装喔!而如果你想要在缺省的内核底下添加模块的话,那么就得要找到 kernel 的 SRPM 文件了! 将该文件给他安装,并且取得 source code 后,才能够顺利的编译喔!
想像两个情况:
很有趣对吧!不过,在这样的情况下其实没有什么好说的,反正就是 『去取得原代码后,重新编译成为系统可以加载的模块』啊!很简单,对吧!^_^! 但是,上面那两种情况的模块编译行为是不太一样的,不过,都是需要 make, gcc 以及内核所提供的 include 标头档与函数库等等。
很多时候,可能由于内核缺省的内核驱动模块所提供的功能你不满意,或者是硬件开发商所提供的内核模块具有更强大的功能, 又或者该硬件是新的,所以缺省的内核并没有该硬件的驱动模块时,那你只好自行由硬件开发商处取得驱动模块, 然后自行编译啰!
如果你的硬件开发商有提供驱动程序的话,那么真的很好解决,直接下载该原代码,重新编译, 将他放置到内核模块该放置的地方后就能够使用了!举个例子来说,为了省电,鸟哥在 2009 年初买了集成型主板来架设家用的服务器,没想到 CentOS 5.1 以前的版本对鸟哥新买的主板内置网卡支持度不足, 使用的网卡驱动程序 r8169 有问题!搜索了 google 才发现大家都有这个问题。解决方法就是到 Realtek 官网下载网卡驱动程序来编译即可。
你可以利用各种方法将他下载后,假设这个文件放置到 /root ,那么直接将他解压缩吧! 之后就可以读一读 INSTALL/README ,然后找一下 Makefile ,就能够编译了。整体流程有点像这样:
# 1. 将文件解压缩: [root@www ~]# cd /usr/local/src [root@www src]# tar -jxvf /root/r8168-8.013.00.tar.bz2 [root@www src]# cd r8168-8.013.00/ # 2. 开始进行编译与安装: [root@www r8168-8.013.00]# vi readme <==注意查一下该文件内容 [root@www r8168-8.013.00]# make clean modules [root@www r8168-8.013.00]# ll src/*.ko <==创建底下的模块档! -rw-r--r-- 1 root root 112216 7月 31 01:11 src/r8168.ko [root@www r8168-8.013.00]# make install install -m 744 -c r8168.ko /lib/modules/2.6.30.3vbird/kernel/drivers/net/ # 重点在上面这行!会发现模块已经被移动到内核模块目录! 4. 更新模块相依属性! [root@www r8168-8.013.00]# depmod -a
有趣吧!通过这样的动作,我们就可以轻易的将模块编译起来,并且还可以将他直接放置到内核模块目录中, 同时以 depmod 将模块创建相关性,未来就能够利用 modprobe 来直接取用啦! 但是需要提醒你的是,当自行编译模块时, 若你的内核有更新 (例如利用自动更新机制进行在线更新) 时,则你必须要重新编译该模块一次, 重复上面的步骤才行!因为这个模块仅针对目前的内核来编译的啊!对吧!
如果你后来发现忘记加入某个模块功能了,那该如何是好?其实如果仅是重新编译模块的话, 那么整个过程就会变的非常简单!我们先到目前的内核原代码所在目录下达 make menuconfig , 然后将 NTFS 的选项设置成为模块,之后直接下达:
make fs/ntfs/
那么 ntfs 的模块 (ntfs.ko) 就会自动的被编译出来了! 然后将该模块拷贝到 /lib/modules/2.6.30.3vbird/kernel/fs/ntsf/ 目录下, 再运行 depmod -a ,呵呵~就可以在原来的内核底下添加某个想要加入的模块功能啰~ ^_^
内核与内核模块是分不开的,至于驱动程序模块在编译的时候,更与内核的原代码功能分不开~ 因此,你必须要先了解到:内核、内核模块、驱动程序模块、内核原代码与头文件的相关性, 然后才有办法了解到为何编译驱动程序的时候老是需要找到内核的原代码才能够顺利编译! 然后也才会知道,为何当内核更新之后,自己之前所编译的内核模块会失效~
此外,与内核模块有相关的,还有那个很常被使用的 modprobe 指令, 以及开机的时候会读取到的模块定义数据文件 /etc/modprobe.conf , 这些数据你也必须要了解才行~相关的指令说明我们已经在第二十章内谈过了, 你应该要自行前往了解喔! ^_^