好了,当我们已经可以基本操控这台 Linux 机器之後,不妨帮它动点手术,让它更适合自己的环境。就像喜欢飙车的朋友,总免不了要对心爱的座架改装改装一样。
要改车,除了要改弹簧、轮胎、煞车、排气、裙边、尾翼等,要想车子真正能发挥性能,当然免不了改引擎啦。下面我们进行的核心编译,就是为 Linux 改引擎了。日後,我们还要装 KDE、GNOME 等等这些 X Window,那是雾灯、座椅、方向盘、表板等这些‘装饰’改装了。这些修改,都一一显示了使用者的个人风格,而且也有许多产品可供选择,就如改?*?擞谩绊omo”之外,还可以选择“无限”。
何谓核心?
前面介绍 shell 的时候,已经略略提到过核心这个东西,如果您有看过“电脑基础”中关於作业系统部分的文章,相信不用我再多做解释了。而且,我也不想再重复了,假如您不知道核心是做什麽的,可以到“电脑基础”去看看。
我们通常挂在嘴边的 Linux ,其灵魂所在,就是它稳定而强大的核心。而事实上,Linux 的定义,也只是这个核心,只是大家目前使用的系统,是经过包装的,在核心之外,还有各种各样的套件( 包括不同的 shell )整合一起。如果您有时间,而且愿意上网路去抓,那些套件都可以自己找得到。有些人,帮您把核心编好,套件也设定好并加以整合,同时将安装程式写好,还提供套件管理工具,以及将环境设定妥当,然後烧成 CD,那就是我们常见的 Linux 套装系统了。我们称这些 Linux 套装系统的发行版本为 Distribution ,例如大家闻名的 RedHat,Slackware,OpenLinux,TurboLinux,SuSE,Debian,等等,都是 distrobutions 。不管它们如何包装,但骨子里头的东西,也就是使用的核心,都一样:都是 Linux !
那核心究竟如何定义呢?说简单些,就是作业系统 (Operating System),它负责处理所有系统的东西,包括硬碟的控制、记忆体管理、行程管理、档案系统、网路功能、等等。我们可以将核心看成是一个架於程式和硬体之间的界面操作系统,离开来核心,什麽东西都用不了。而核心的编译好坏,也会影响到系统的效能,甚至,一些系统功能(如 tcp/ip),就必须要编进核心才行。
不过,在动手编译核心之前,请先问问自己是否真的有这个必要?因为,现在的 Linux Distro,其预装的核心力都尽可能的将所有东西以模组的方式进行编译,而这些模组都是可以插入和移除的。这是一个非常灵活的设计:当您需要模组的时候,就载入到核心里面;鸟尽弓藏的时候,可以将模组从核心中移除:呼之则来、挥之则去,怎一个方便了得!要知道,作业系统的效能好坏、稳定与否,其中一个很关键的因素是核心的体积短小精悍。一个臃肿的核心,没错,能提供样样俱到的功能,但也牺牲掉系统效能和稳定性。所以在编译核心的时候,‘将核心编得尽量的小’,是最高原则。
就像改车一样:车身越轻,其可控性越佳,如果您完全是一个 100% 飙车发烧友,很可能,您的车箱里面,除了改良後的前坐位和防翻侧支架外,其它能拿掉的都拿掉,连仪 都是裸露的。呵~~ 如果您的车子里面还有一大堆 Kitty 、Snoppy,以及上十组喇叭和 CD 音响,那我只能说您是“爱车一族”,而绝对不够资格称得上“飙车一族”!如果您能将所有的汽车周边都设计成模组,那就最好不过了:需要泡马子的时候,将所有耍 cool 玩意都弄上;需要午夜狂奔的时候,全部拿掉,一件不留。
同样的,如果您真的是一个 100% 的 Linux 发烧友,假如发现核心里面竟然载有您不想要的东西,是绝对不能容忍的。不过,对於初入门的朋友,倒不必急於以 Linux 发烧友来自居,先摸熟核心的功能之後,才真正打造适合自己的精确核心吧。说实在,若不是赶时髦,一般用 Distro 预装的核心已经非常足够了。而且预装核心都带有非常充足的模组,随时应付您的需求。除非您千真万确的知道您要的硬体只有在新核心里面才能支援,或是从 kernel.org 上面得知旧核心有严重的漏洞,否则,不需要如此劳师动众。
好了,现在,就假设您有十万零一个理由需要进行核心的编译,那就不妨一起共赴一趟核心的编译之旅吧!
选择版本
不管您的核心是从网路上抓的,还是从 CDROM 里面 copy 出来的,首先要确定的事情是:这个版本是否适合您?
事实上,Linux 核心的版本号码上面,就隐含著一些重要的资讯。先让我们看看您目前使用的核心版本吧: # uname -r
2.4.2-2
不知道您对这这些数字有何认识呢?不知道不要紧,让我告诉您吧:
<主版本>.<次版本>.<修订版本>-<副版本>
然後,再让我们看看核心版本的维护流程:
kernel
2.2.0
|
V
2.2.1
:
|
V Kernel
2.2.8 ---> 2.3.0
| |
V V
2.2.9 2.3.1
: :
| |
V V Kernel
2.2.60 ... ---> 2.4.0
|
V Kernel
: ---> 2.5.0
| |
V V
: :
事实上,在众多的核心版本中,我们需要特别留意的是第二个数字,也就是次版本的号码:
如果它是一个奇数,那这个版本是实验性的版本,或许有些新的设备和功能能够在这个种版本找到,但因为尚处於开发期,不能保证其稳定性和安全性。无论如何,不建议在真正用来工作的系统上面安装实验性的核心版本。例如:2.1.1、2.3.2、2.3.3、2.5.0 ....
如果它是一个偶数,基本上,该版本已经获得一定程度的测试和肯定,已趋於稳定和可靠的状态。如果您的系统是真正用来工作的,只建议安装稳定的核心版本。例如:2.2.1、2.2.17、2.4.2、2.4.9 ....
无论如何,当新核心推出之後,都不建议立即在真正工作的系统上面应用,尤其是在商业机构中,不要拿营运中的系统来做白老鼠。就算您获得一个被认为是稳定的版本,也应该经过反复的测试,以及随时留意核心团体所公布的最新资讯。只有经过一段时期和广泛的应用与回报,再加上自己的严格测试之後,才能决定是否要应用在工作的环境中。
事实上,更新核心不是为了干时髦,您必须很清楚您的需要是什麽,假如当前核心已经能应付您的需要,那就继续保留它就是了。下面这篇文章,是小州兄的建言,非常有代表性,希望大家能深切领会其中的要旨:
"小州" 撰写於邮件
news:3iFIVR$84V@bbs.cynix.com.tw...
※ 引述《asho (阿信)》之铭言∶
这样是否因为没有最佳化
cpu以及周边的关系ㄋ
我想...如果编译核心的时候
不选duron而选x86系列ㄉ话
效能应该会打折扣吧
我会去 compile kernel,一般来说只因为:
1. 你抓取新版 kernel source,当然你就需要自己编译。
2. 虽然目前 kernel 在 linux dist 出厂时都尽可能编入需要的项目
到核心内,其他项目都选择编译成为 module 可以事後挂入。若是
很巧你用的周边装置该好很冷僻,预先编译好的 kernel 既没把你
需要的项目编入核心,也没有编译成为 module,这时候才需要
自己重新编译核心。
3. 特殊环境使用....
重新编译 kernel 并不会提升效能,recompile kernel 最多只是调选
自己需要的项目编译核心或者是编译成为模组来使用。也许在选择
编译核心项目时,把 cpu 等级选好一点,那编译出来的 kernel 是针对
该 cpu 最佳化编译,但是整体增加效能百分比却是很低,比方可能增加了
1 ~ 3 %,这对於目前的 cpu 来说,其实也没有大幅度增快多少。
若是你用 mandrake,他全部 package 都是针对 pentium 的系统
编译程式,那整体效率上的确才会比一般 linux dist 的 package 都是用
i386 指令集的程式套件快上许多。
至於编译核心时,留下这台机器需要的,其他根本不用的不编入。像是
一般 linux dist 可能预先编译好的 kernel 是支援 qos 机制,若是
不需要该机制,拿掉也许能够减少一些编出来的 kernel image 大小,
但是这并不会增加系统效能..... 不过对於以前古老环境来说,当时
记忆体不多,而且那时候模组化还不成熟的年代,让 kernel image 变小
一点,是可以减少一些记忆体耗费,但是对於目前其实都是不需要去担心。
另外,还有一个地方要留意的:就是您目前使用的应用程式和新版核心之间的兼容性如何?其中最头痛的地方莫过於 Library 的更新。因为 Library 是核心和程式之间的主要沟通界面,实在有太多的程式需要使用到 Library 提供的函式库。如果单纯为了升级某一个套件,而需要更新 Library 版本的话,在很大程度上也会牵涉到核心版本的升级;但其它应用程式是否能使用新版的 Library 却是个非常棘手的难题。调过来说,如果您单纯为了某一核心功能而升级核心,而导致所有 Library 和应用程式都必须更新,您必须有足够的 study 和风险评估,否则当您发现牵一发动全身的时候,再临急抱佛脚,恐为时已晚了。况且,许多隐藏性的问题,可能要等到积压了某一时期之後才能浮现出来,这个恐怕更是让人吃不了兜著走。
无论如何,如果您觉得要升级核心的话,三思而後行!
取得 source
Linux核心的发展,可以说是相当迅速的,其版本更新反而有时候让人觉得受不了呢。
如果您使用的我们这里用来作范例的 RedHat 7.1 套件,那您应该看到和我一模一样的版本:2.4.2-2。想要获得最新的核心版本资讯,不妨到
http://www.kernel.org/ 走走,说不定会满载(指频宽)而归呢!上面有 http 和 ftp 的下载选择,如果您是用网页浏览器的话,建议用 http 模式;如果您习惯了 ftp 界面,那就用 ftp 好了。
以小弟经验看,最好是在系统安装完毕之後,马上就进行核心编译工作,免得以後每次装一些特定功能的时候又要花一大轮时间编译。当然了,我是假设您如我在“安装 Linux”文章中所说的:已经明确知道自己的系统要用来做什麽的。例如,您打算架设 NAT 和 QoS,并且阅读过文件,明确知道要将什麽东西编译进核心里面。当然,如果您不怕花时间,每装一次服务就重新编译一次核心,也未尝不可。只是,当您真的有过几次核心编译经验之後,我相信您巴不得一次过就将核心编好,最好还是别人已经编好,然後送一个现成的过来!呵呵~~ 我常会在编核心的是许这样的愿望哦~~ ^_^
如果您不是到网路上抓最新的核心,但当初安装的时候又不是选择 everything,而且也没选择 Development Tools (kernel source) ,那您也可以使用安装光碟带来的核心版本 (RH7.1 是在 Disk2 上面)。当您将光碟 mount 好之後,然後转到这个目录去:: cd /mnt/cdrom/RedHat/RMPS
然後将 kernel-source 的 rpm 装上。别说您不会使用 rpm 哦,果真的话,请往前面翻看看程式管理 (RPM)再回来: rpm -Uvh kernel-source-2.4.2-2.i386.rpm
(如果您看到错误信息显示您还需要其他程式,一一装好它们的 rpm 後再来安装 kernel-source 的rpm。)
完成之後,您应该会在 /usr/src/ 目录里面看到一个 linux-2.4.2 的子目录。这就是刚才的 rpm 程式干的好事了!
如果您的核心是从 internet 上面下载回来的,通常会是‘.tar.gz’或‘.tar.bz2’这样的压缩档。目前,我在
http://www.kernel.org/pub/linux/kernel/v2.4/ 所找到的最新版本是 2.4.9 ,请先将 linux-2.4.9.tar.bz2 这个档案抄进 /usr/src 再进行解压: tar Ixvf linux-2.4.9.tar.bz2
(因为这是 bz2 的压缩,所以用 I 参数,如果您抓的是 gz 格式,就用 z 参数吧。)
这样您就会产生一个‘linux’的目录!注意哦:这个和您用 rpm 从 RH7.1 Disk2 的 CD 装的目录不一样哦,如果您是用 CD 来装的话,建议您建立一个 link: ln -sf linux-2.4.2 linux
无论您是用光碟的 rmp,还是下载回来的核心,最终我们都应该有一个‘/usr/src/linux’的目录:如果原来已经有这样一个目录存在,而不是 link 的话,那就先用 mv 将它改一个名字吧。
当我们的目录准备好之後,就是我们进行编译的步骤了:
进行编译
不过,编译核心一点都不轻松,而且是相当费神费时的事情。幸好现在的机器越来越快,而且核心的编译程式也好用多了。
首先确定您在安装 Linux 时候准备的开机片可以工作,用它boot 一下就知道了,要确定您的 BIOS 里面的开机顺序是以“A”(即软碟)为先。如您当初忘记了制作开机片,或磁片坏掉了,先在这里自行做一张: mkbootdisk --device /dev/fd0 `uname -r`
(用 uname -r 命令是找出您当前的核心版本,如果您确定是 2.4.2-2 , 那可以直接用版本号码来代替。)
重新启动机器,确定是用 bookdisk 开机的。然後用 root 身份进行登录,并取出开机磁碟,贴好标签,然後换一张新的磁碟进去。
然後,让我们转换到 /us/src/linux/Documentation/ 目录里面,看看里面您认为需要了解的资讯,例如 Changes,modules.txt、Configure.help 和其它 .txt 档。
当您阅读完新 kernel 的重要资讯之後,然後回到 /usr/src/linux 目录,并输入: make menuconfig
如果在Xwindows里面,可以输入:make xconfig。不过,我们这里使用 menuconfig 就好。在这个界面里面,不如先学习一下如何操作键盘吧:
界面是以层级形式显示选项,您首先进入的顶层选单。然後您可以用‘向上’和‘向下’方向键来选择选项。
如果您发现所选择的选项的最右边有一个向右的箭头,那就表示其下还有更进一层的子选单。
在选单的底部,分别有:Select、Exit、和 Help 的按钮,只要按‘tab’键就可以循环选择。
当您用上下方向键选择好有子选单的选项,以及确定底部按钮为 Select 之後,敲‘Enter’就可以进入下一层选单。
如果按 tab 键选择 Exit 的话,就会退回上一级选单 (也可以按‘Esc’,但要非常小心,因为不留神多按两下的话可能会退出程式,然後您又不确定是保存还是放弃好!所以不鼓励用‘Esc’)。
当您选择到最底部的选项的时候,也就是选项的右边没有箭头了,那麽在选项的左边应该是一个 [ ] 或 < > 的符号。分别是:前者只能选择为内建或不选择;後者则可以让您选择为内建、或模组、或不选择。您可以按空白键来循环您的选择:[ * ] 和 < * > 为内建、[ ] 和 < > 是不选择、 < M > 则为模组。(我的建议是:能够编成模组的就尽量编成模组,除非某些特别的效能考虑或没有模组选择的,才编成内建。)
当您退回顶级目录的时候,如果按 Exit 或 Esc 就会退出所有选单,同时系统会问您是否保存设定。您只有 ‘Yes’ 或 ‘No’的选择,如果不确定,请用 no ,然後重新进行选择。不过,您在任何时候,在顶级目录那里可以选择:Save Configuration to an Alternate File ,将当前设定保存在 /usr/src/linux 目录下,档案名称您自定则可;您也可以选择:Load an Alternate Configuration File ,从设定档载入以前的设定。我强烈建议您在进行任何改动之前,先为目前的设定保存起来,请选择 Save Configuration 那个选项,然後输入 origin,那您就可以随时用 Load Configuration 还原核心的原始设定了。(如果对核心的选项够了解,可以复制一份设定档,然後直接修改里面的设定,是最快的方法!)
接下来,应该是最伤神的时候了,这里,我们要面对一大堆的选择。如果您不确定哪些需要,可以接受预设值,或是一股脑做成模组。当您不知道某应该项目是什麽意思,可以按‘help’看看您是否需要,如没需要的话可以不要编进核心里面,否则核心编得太大,会影响系统效能。
Code maturity level options --->
Prompt for development and/or incomplete code/drivers
# 如果您想用核心进行研发工作,如测试新硬体,可以考虑,
# 否则不用理会,
# 不过,有些尚处於 alpha 阶段的新功能必须选择後才用。
Loadable module support --->
Enable loadable module support
Set version information on all module symbols
Kernel module loader
# 如果您要采用其它版本(或旧版本)编译过来的模组,
# 那就要打开第二项,但可能不那麽安全。
# 然则,您也要确定装有 genksyms 程式,
# 否则可能会编译失败。
Processor type and features --->
(Pentium-III/Celeron(Coppermine)) Processor family
( ) 486
( ) 586/K5/5x86/6x86/6x86MX
( ) Pentium-Classic
( ) Pentium-MMX
( ) Pentium-Pro/Celeron/Pentium-II
(X) Pentium-III/Celeron(Coppermine)
# 如果第一项的 CPU 型号不是您目前机器的,
#可以 Enter 进行选择。
Toshiba Laptop support
/dev/cpu/microcode - Intel IA32 CPU microcode support
/dev/cpu/*/msr - Model-specific register support
/dev/cpu/*/cpuid - CPU information support
# 上面这些因为是模组的关系,所以才选。
(off) High Memory Support
(X) off
( ) 4GB
( ) 64GB
# 如果您的实体记忆体少於 1G 的话,用预设的 off 就行;
# 如果您的记忆体介於 1G 到 4G 之间,选择 4GB;
# 如果您的记忆体超过 4G ,那可以选择 64GB。
[ ] Math emulation
# 除非您的 CPU 是 intel 386,否则不用选择。
MTRR (Memory Type Range Register) support
# 如果您有打算跑 X window,不妨将之加上。
[ ] Symmetric multi-processing support
# 如果您的机器是双 CPU 的,可以选择上面这个。
[ ] APIC and IO-APIC support on uniprocessors (NEW)
General setup --->
Networking support
[ ] SGI Visual Workstation support
PCI support
(Any) PCI access mode
( ) BIOS
( ) Direct
(X) Any
PCI device name database
[ ] EISA support
[ ] MCA support
Support for hot-pluggable devices
PCMCIA/CardBus support --->
<*> PCMCIA/CardBus support
CardBus support
i82365 compatible bridge support
[ ] Databook TCIC host bridge support
# 如果您使用 notebook,或许会有 PCMCIA 装置,
# 不妨将 i82365 加进来,除非您确定不使用 PCMCIA。
# 我实际上是没有选择的,这里仅作示范而已。
# 如果您没选择这个,後面许多 PCMCIA 的选择就看不到了,
# 参考的时候请留意这点!
System V IPC
BSD Process Accounting
# 是是非常好用的东西,可以将您的行程资料记录下来,
# 强烈建议选择,要不然开机可能会看到错误信息。
Sysctl support
# 这个不能不选,否则 /proc/sys 就没作用了。
(ELF) Kernel core (/proc/kcore) format
(X) ELF
( ) A.OUT
<*> Kernel support for a.out binaries
<*> Kernel support for ELF binaries
<*> Kernel support for MISC binaries
Power Management support
<*> Advanced Power Management BIOS support
# 上面这行要编成模组或内建,然後才看得到下面的哦:
[ ] Ignore USER SUSPEND (NEW)
[ ] Enable PM at boot time (NEW)
[ ] Make CPU Idle calls when idle (NEW)
[ ] Enable console blanking using APM (NEW)
[ ] RTC stores time in GMT (NEW)
# 如果您的硬体时钟是使用世界标准时间,可以选择,
# 如果是本地时则不选。
[ ] Allow interrupts during APM BIOS calls (NEW)
[ ] Use real mode APM BIOS call to power off (NEW)
# 如果您的系统不能自己切断电源,就选这个吧。
# 不过,对某些 BIOS 而言,选了这个反而不能关机!
# 这样的话,您自己试试看棉~~
# 我这里没选啦,因为我用的是华硕的旧板 P2L97。
# 另外,我还发现如果您是单 CPU 的机器,
# 前面却将 SMP 选择起来的话,那也不能关机哦~~
Memory Technology Devices (MTD) --->
< > Memory Technology Device (MTD) support
# 如果您要做 embedded 系统,
# 使用到 FDM 和 DOM/DOC 的话,可选。
# 不过选择之後,还有很多选项,请尽量用模组来编译就是了。
# 如果不知道是什麽,请看 Help 的说明!
# 我这里没选。
Parallel port support --->
Parallel port support
# 如果您有使用平行埠,如接印表机,那就选吧。
PC-style hardware (NEW)
Multi-IO cards (parallel and serial) (NEW)
[ ] Support foreign hardware (NEW)
IEEE 1284 transfer modes (NEW)
# 假如您的印表机有状态回报功能的话,可以考虑。
Plug and Play configuration --->
<*> Plug and Play support
<*> ISA Plug and Play support
# 哇:PnP 耶~~ 这麽好的事情为什麽不用?