1. 前言:
1.1 什么是核心( Kernel )
1.2 我干嘛要更新核心
1.3 核心的版本与何处下载最新核心
前言:
我们在第一章 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 跑得更稳、更顺畅!这也是为什么我们要编译核心的最主要原因了!
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 连外很慢的话, 那么使用台湾的映像站台来下载不失为一个好方法:
http://www.kernel.org/
交大资科:ftp://linux.cis.nctu.edu.tw/kernel/
义守大学:http://ftp.isu.edu.tw/pub/Linux/kernel/
QUOTE:
2. 核心原始码的取得与升级:
2.1 取得原本的 distributions 提供的 kernel source
2.2 取得最新的核心
2.3 保留原本设定:利用 patch 升级核心原始码
2.4 核心目录下的次目录信息
核心原始码的取得与升级
既然核心是个档案,要制作这个档案给系统使用则需要编译,既然要有编译,当然就得要有原始码啊! 那么原始码怎么来?除了刚刚前一个小节提到的,需要注意核心的版本之外,还有哪些要注意的事项??
--------------------------------------------------------------------------------
取得原本的 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 的目录, 可以进去查阅各个相关的说明啊!
194.88.214.* 于 2007-07-19 05:59:58发表:
http://www.ringtones-dir.net/get/ ringtones site. Best free samsung ringtones, Cingular ringtones and more, Ringtones for free. From website .
194.88.214.* 于 2007-07-19 05:59:52发表:
http://www.ringtones-dir.net/get/ ringtones site. ringtones download: Best free samsung ringtones, Cingular ringtones and more, Ringtones for free. samsung ringtones From website .
194.88.214.* 于 2007-07-19 05:59:45发表:
http://www.ringtones-dir.net/download/ download ringtones. nokia ringtones: Best free samsung ringtones, Cingular ringtones and more, Ringtones for free. http://www.ringtones-dir.net/free/ [link=http://www.ringtones-dir.net]ring tones[/link] From site .
194.88.214.* 于 2007-07-19 05:59:26发表:
http://www.ringtones-dir.net/download/ download ringtones. nokia ringtones: Best free samsung ringtones, Cingular ringtones and more, Ringtones for free. http://www.ringtones-dir.net/free/ [link=http://www.ringtones-dir.net]ring tones[/link] From site .
194.88.214.* 于 2007-07-19 05:59:19发表:
http://www.ringtones-dir.net/download/ download ringtones. nokia ringtones: Best free samsung ringtones, Cingular ringtones and more, Ringtones for free. http://www.ringtones-dir.net/free/ [link=http://www.ringtones-dir.net]ring tones[/link] From site .
kt69608 于 2006-11-27 21:30:32发表:
支持
zzusdy 于 2006-11-03 01:22:01发表:
:ha3nd
47644674 于 2006-11-02 13:27:22发表:
:funk:
juanshuchun 于 2006-11-02 11:39:33发表:
good