Linux 核心编译与管理<1>
时间:2007-06-17 来源:wolfman55
最近更新日期:2005/12/05
我们在前面的几个章节介绍了 Linux 其实指的就是核心而已,而整个 Linux 的世界当中, 最重要的也就是核心了!他控制了您的服务器的所有硬件,也控制了所有的您想要的功能, 例如软件磁盘阵列(RAID)、各种适配卡的驱动模块、防火墙的新增功能等等。透过管理您的 Linux 核心,将可让您的服务器跑得更加的顺畅,也更稳定您的服务器所提供的相关服务呢! 此外,为了让硬件驱动程序与相关的核心功能修订容易,所以 Linux 核心是支持『模块化』的,也就是说,您核心所想要的功能可以『后来才加挂上去』喔! 那么如何加挂上去呢?这就需要了解一下所谓的『模块』了!当然,连同模块的相关指令就得也要会用啰!^_^ |
1. 前言:
1.1 什么是核心( Kernel )
1.2 我干嘛要更新核心
1.3 核心的版本与何处下载最新核心
2. 核心原始码的取得与升级:
2.1 取得原本的 distributions 提供的 kernel source
2.2 取得最新的核心
2.3 保留原本设定:利用 patch 升级核心原始码
2.4 核心目录下的次目录信息
3. 设定核心的编译设定 (Makefile)
3.1 如何编辑核心的 Makefile
3.2 核心的内容与模块设定:
a. CPU 的类型选择: 双 CPU 的选择项目, 高内存支持
b. 电源管理: CPU 自动降频功能选项
c. PCI 总线与 PCI Express 支持:
d. 核心的网络功能: IPv4, IPv6, 防火墙功能, 特殊网络功能
e. 硬件驱动程序: 主机 IDE 芯片选择, SCSI 支援, SATA 支援, RAID 与 LVM 支援,
网络卡支持, 拨接必须之 PPP, AGP 显示卡芯片组, 显示卡芯片组, USB 芯片组
f. 档案系统(filesystem): EXT2/EXT3, Quota, MSDOS/NTFS, NFS/Samba...
4. 核心的编译与安装
4.1 编译的流程
4.2 模块安装时的注意事项:
4.3 安装旧版与新版的核心成多重开机系统
5. 额外(单一)模块编译:
5.1 单一模块编译: depmod
5.2 核心模块管理: lsmod, modinfo, modprobe, insmod, rmmod...
6. 本章习题练习:
7. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23899
前言:
我们在第一章 Linux 是什么里面就谈过 Linux 其实指的是核心! 这个『核心 (kernel)』是整个操作系统的最底层,他负责了整个硬件的驱动,以及各个核心工具的提供,包括防火墙机制、是否支持 LVM 或 Quota 等档案系统等等,这些都是核心所负责与提供的!也就因为如此,所以开机过程当中,除了 MBR 之外, 第一个读入系统内存当中的,就是核心档案。
如果你还记得开机流程里面提到的相关信息的话, 那么就知道,基本上,核心就是用来控制您的硬件系统的,您想要硬件帮您达成的任何工作,都得要透过『核心』来帮您达成啊!换句话说,如果您的『核心』并没有支持您的某项硬设备, 也就是核心无法『认识』您的某项硬件,呵呵!那么该硬件也就无法在这样的核心底下工作了!
什么是核心( Kernel )
这已经是整个 Linux 基础的最后一篇了,所以,底下这些数据您应该都要『很有概念』才行~ 不能只是『好像有印象』~~好了,那就复习一下几个名词吧!
· Kernel:
还记得我们在前面的 BASH shell 部分提到过:计算机真正在工作的东西其实是『硬件』,例如数值运算要使用到 CPU、数据储存要使用到硬盘、图形显示会用到显示卡、 音乐发声要有音效芯片、连接 Internet 可能需要网络卡等等。那么如何控制这些硬件呢? 那就是核心的工作了!也就是说,你所希望计算机帮你达成的各项工作,都需要透过『核心』的帮助才行! 当然啰,如果你想要达成的工作是核心所没有提供的, 那么你自然就没有办法透过核心来控制计算机使他工作啰!
举例来说,如果你想要有某个网络功能 ( 例如核心防火墙机制 ) , 但是你的核心偏偏忘记加进去这项功能,那么不论你如何『卖力』的设定该网络套件,很抱歉! 不来电?换句话说,你想要让计算机进行的工作,都必须要『核心有支持』才可以!!这个标准不论在 Windows 或 Linux 这几个操作系统上都相同!如果有一个人开发出来一个『全新的硬件』,目前的核心不论 Windows 或 Linux 都不支持,呵呵!那么不论你用什么系统,哈哈! 这个硬件都是英雄无用武之地啦!那么是否了解了『核心』的重要了呢?没错! 所以我们才需要来了解一下如何编译我们的核心啦!
那么核心到底是什么啊?讲了这么多??其实核心就是系统上面的一个档案而已, 这个档案包含了驱动主机各项硬件的侦测程序与驱动模块,在 开机流程分析 章节当中,我们也提到这个档案被读入主存储器的时机是:
- BIOS
- MBR 载入 Loader ( Linux 中的 Lilo 或 Grub 或 SPFdisk等等 )
- 藉由 Loader 的辅助,加载核心档案到主存储器当中,此时核心档案解压缩后, 会开始侦测硬件的各项配备,并加载适当的驱动模块来让硬件生效;
- 在硬件准备妥当后,加载第一支程序 init ,并藉由 /etc/inittab 的设定来确认预设 run level;
- 经由 /etc/inittab 及 run level 来决定执行的各项启动的 scripts ;
- 开始执行 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 跑得更稳、更顺畅!这也是为什么我们要编译核心的最主要原因了!
|
|
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 主机已经达到这个目的了,何必再编译核心?不过,就如同前面提到的, 由于预设的核心不见得适合您的需要,加上预设的核心可能并无法与您的硬件配备相配合,此时才开始考虑重新编译核心吧!