出处:ChinaITlab
阅读提示:Linux对于许多用户的介绍是十分强大的、可配置的操作系统。在过去,一套类似于Unix的操作系统对大多数人来说是不可能实现的。不是该操作系统4位数的标价
Linux对于许多用户的介绍是十分强大的、可配置的操作系统。在过去,一套类似于Unix的操作系统对大多数人来说是不可能实现的。不是该操作系统4位数的标价,而是它的硬件,即使是现在使用个人免费的SCO Unixware它还需要SCSI设备,我们中的许多人为减少花费而使用IDE设备。随着Linux的日益强大有件工作不得不在这简单的操作系统上完成:根据你的硬件和操作配置你的核心。
当前安装的核心是1.2.x或更早的建议更新;不管怎样,用新的2.0.x核心,更新是必要的。核心可以从安装包中取得,如Red Hat、Caldera、Debian 等等,这是一样的(几乎包含一切)核心。当更新核心看起来是一件让人气馁的事时,使用已经安装的核心也不坏,更新对于你的系统来说是好的。
为什么自找麻烦?
标准的核心安装是一种尝试工作(就象许多系统一样),尽可能安装一套可用的Linux系统,就这一点而论,核心很膨胀它包含对于一般机器所不需要的代码。标准安装也可能没有一些用户所需的代码。
当然,当你购置了新的硬件等你就需要升级你的核心了。在同一个系列中升级通常相当直观,当你升级时,比如说从1.2.x到2.0.x,这工作正是本文章的范围,需要有点悟性(哈哈)。最好找一张最新销售的CD开始——这对于更新到试用的2.1.x核心一样实用。
核心的版本号
所有的Linux核心包含由点隔开的三个数字。第一个数是核心的版本。我们现在是第三版(2.),一些人可能使用版本号为1的核心,并且我知道至少还有人在用版本0核心。
第二个号码是核心的主号,主号也是数字(包括0)表示稳定性。这样,这些核心将没有一些BUGS,他们经过相当大量的测试。当某个版本含有一些小 BUGS,它们将被升级,以使硬件兼容或加强核心对付黑客。如,核心2.0.30,避开对2.0.29报表BUG的支持,它包含几个补丁包括保护SYN避免服务器受攻击。核心带有零主号是发展中的核心。这些可能未经测试,可能但不经常中断你正运行的软件包,有时候,为了更好的工作,用户需要采用在下一个稳定的核心发表之前的最新的、最好的支持核心。这就向对真理一样没有异议,这对系统有本质上的改变。
最后一个号码是次号它因每一次改动而增加。如果你看到核心版本2.0.8,你知道它是核心2.0,稳定的核心,它已经是第九次发表了(我们从零开始记数)。
假设
我憎恨作任何假设,它们通常令我心痛。所以我需要提到一些事情那样我们不会在同样的遭遇下工作。为了编译一个核心,你需要一些东西,首先,我假设你已经安装了2.0.x核心,所有的基础包也许更多,你还需要安装gcc 2.7和所有支持gcc的库。你还需要libc库和binutils、bin86包(通常是标准销售版安装的一部分)。如果你是下栽的或从CD上拷的,你还需要tar和gunzip包,当然你还需要磁盘空间,建议7MB下栽,20MB解压,更多一些用来编译。
无须多说,我们研究的许多事情需要以root登录。如果以非特权用户下载了核心并且你有/usr/src目录的写权力,你仍能在成为root之前做许多事。对于Linux新手,我非常建议尽可能以非特权用户(type:su -face)使用仅当一些工作必须使用root。总有一天,你将高兴有此习惯。谨记,有二种系统管理员,当以root登录时能不经意的使安装失事,这样谁愿意做呢。
获得/升级源程序
Linxu核心源程序可以从大量的FTP站点和几乎每一张Linux销售CD上得到。新手可到最主要的站点上找Linux核心,你可以从该站点上一系列镜象站点上下栽Linux核心。选择一个最近的站点有助于减少internet整体通信量。
一旦你获得源程序,拷入/usr/src目录。创建一个目录放置你用tar解压的源文件。我建议目录以版本号命名如 linux-2.0.30 或kernel-2.0.30,用以下命令为目录建立一个叫linux连接
ln -sf linux-2.0.30 linux
我在连接命令中使用了-f因为你已经在/usr/src中有了一个核心源连接,(一些版本的ln(如3.13),强制选项(-f)将不起作用,你不得不必须首先解除连接再建立连接。在版本3.16中运行正确)现在你仅仅有一个问题就是如果linux是一个目录,不是连接,如果你有这个问题,你不得不在继续前更改目录的名字:
mv linux linux-2.0.8
现在执行下列命令:
tar xzvf linux-kernel-source.tar.gz
我有一习惯总是在tar参数中包括w(等待确认)。下来让我们看着.tar.gz 或.tgz文件解压到自己的目录,用ctrl-C中断再去掉w继续命令。这样一来我能阻止解压到当前目录。
一旦你解开了核心,这正是你执行修补程序的最佳时机如果你需要的话。假如你不希望运行2.0.30核心,但你希望使用tcp-sy-cookies.把该补丁(tcp-syn-cookies-pathc-1)拷贝到/usr/src目录执行以下命令:
patch < tcp-syn-cookeis-patch-1
该命令实现修补核心。在/usr/src目录中寻找以扩展名为.rej的文件。这些文件严格的说不是修补文件。它们也许并补重要,但需要细心的阅读。如果你安装了Red Hat系统并装了一些并不是全部的核心源程序,(SPARC,PowerPC,etc.),你将看到一些文件,如果这不是你所需要的,哪就行了。
准备工作
给你一个忠告,在我们转到核心源程目录和开始编译前,让我们检查所需的连接,在你的/usr/include子了目录有以下连接:
asm - /usr/src/linux/include/asm
linux - /usr/src/linux/include/linux
scsi - /usr/src/linux/include/scsi
现在,你要知到为什么要标准的文件检索路径。如果你不把最新的核心放入/usr/src/linux(通过连接),上面的连接将不会找到目标文件核心编译将会失败。
怎样进行下一步
一旦万事俱备,转到/usr/src/linux。现在你也许想停下细读一下文档文件,实际上如果你有些特别的硬件,或几种光驱驱动程需要自己动手设置,他们通常这样做,当引导时这些驱动程序将给出警告,这并不碍事他们照常工作少,阅读扩展名为.txt .h .c的文件。通常我发现他们具有共性且易于配置。如果你不想冒险,你没必要做。记住你照样可以解开tar文件(或再次安装.rpm文件)恢复前的文件。
开始编译
我建议首先执行以下命令:
make mrproper
当核心源程序在以前条件下这条命令不是必需的,但这培养一个好习惯。这命令保证旧的文件不在使用。
配置核心
现在,你可以配置核心,首先,你要了解一点关于模块的知识。楔块就像你特意插入核心中的某些东西,如果你家中一个小网络并且有时想用一下(但并不经常),也许你想把网卡编译成一个模块。使用这个模块,机器必运行和存取/libs下的模块,意思是驱动程序(IDE,SCSI等但必须是NFS支持的网卡),文件系统(通常是ext2但也可以是nfs)和核心类型(最好是elf)必须编译在内并且不能是模块,模块只有核心引导时才起作用,驱动程序(来网络)的存取,和文件系统安装。这些文件必须编译在核心内否则将能安装启动分区。如果安装启动分区和网络,你需要网络系统文件,和己经编译的网卡。
为什么要使用模块?模块化使核心变的更简捷,它减少核心释放大量的受保护的空间。模块的安装和卸载使用的空间是可重复分配利用的。如果你打开机器有90% 以上的时间用到一个模块,编译它。运用这类模块是浪费内存的,原因是一旦你编译了楔块它们同样将占用大量的内存,核心需要一些代码来挂上模块。记住,核心在保护空间运行,但模块并不是。这么说,我并不经常使用我的设备。我把它编译成只支持ext2,ide和elf。而我一直使用网卡,我把其它的编译成模块:如out,java,floppy,iso9960,msdos,minix,vfat,smb,nfs,smc-ultra(ethernet card),serial,printer,sound,ppp,等等。它们许多只是在这或那用上那么几分钟。
下一步是配置核心。这而我们有三种选择--目的相同,我建议使用一种图形方法。以前是简单的输入:make config。开始一系列提问。而且,如果你答错了,你只有按ctrl-c从新再来一遍。你甚至不能按一定顺序重复,一些问题与以前的提问有关。如果你有绝对的理由不能使用任何一种图形方式,那碰到麻烦你一定会找我的。
我建议使用make menuconfig 或make xconfig中的一种。假如使用menuconfig,你必须安装ncurses-dev和tk4-dev库。如果你没有装入上面的库,而且你又不想用下一种方法,我建议现在就你安装上面的库。在稍后你仍然可以卸载它们。
要运行xconfig,你必须安装配置X,因为X需要大量内存,我安装,配置X仅仅在一部分时间运行X,当编译核心时我回到以前的控制台,因为编译需要内存。我的观点是xconfig菜单是最好最简单的途径来配置核心。在menuconfg,如果你去掉一个选项,它的从选项将不会显示。在xconfig,如果你去掉所有选项,从选项依旧显示,它们成灰色显示。我喜欢它的原因是使我能知道新加了什么。我可以打开一个选项得到一个新的从选项来试用一下。
我将花一点文字描述一下核心配置的一些部分,告诉你一些我(艰难的)发现的事。
第一节是code-maturity-level选项。仅有的一个问题是你是否想使用开发的驱动程序和代码。如果你有令你出血的硬件,你可能不得不作出一个选择。如果你选择“no”,试验代码将成灰色或不显示。如果你核心寻求通讯产品支持,你可能选择“no”。
第二节涉及模块,如果你想模块化,在问题1和3选择“yes”。如果你想使用所有得模块,比如Caldera's OpenLinux的Netwar支持,第二个问题回答“yes'这样不需要从新编译模块。
第三节是一般的设置。编译模块成ELF和编译支持ELF二进制。不编译适当的支持”gotcha“是明智的,如果你的机器结构是Pentium或486你将得到高效的代码,但一个386的核心将运行在32-bit compatible clone;一个Pentium核心将不。为大多机器制作一张紧急启动盘(就象销售商的安装盘)最好在386下编译,而386并不能运行在Pentium 下编译的核心。
下一个是块设备--这儿并不要特别说明什么。如果你的启动设备是IDE硬盘,确定编译它就行。
下来是网络。对于一些没有连接网络的用户,你不必要在这停留,除非你计划使用计算机拨号连接其它用户。在这儿,你需要读懂并照建议的指导使用。
紧接着是SCSI,至于为什么不直接跟在块设备后面我也不知道。如果你的启动分区是SCSI设备,不要选择SCSI模块支持。
在一般的SCSI后是SCSI低级设备驱动程序。再次重申,模块仅仅是用在不在启动分区的设备。
下一节令我们回到再次回到网络,我想你会再这找你特殊的网卡,象其它一样支持ppp,slip,等等,如果你使用nfs安装你的启动设备,把网卡编译在内。
对于那些需要ISDN支持的幸运的人,ISDN从选项就需要编译。
在下一节支持更早的CD-ROM,如果你使用SCSI或IDE CD-ROM,你可以跳过这里。
下面是文件系统。同样,编译你所需要的,通常是ext2而让其余的使用模块。
字符设备是下一个选项。非串行的鼠标,支持象PS/2。看一看你鼠标的键。许多双键鼠标是PS/2,即使它们的连接看起来象串行的。你当然期望最低限度支持串行。列表中支持普通的打印机。
最后第二节经常制造麻烦:它就是声卡。阅读帮助文件从列表中小心的选取。确信为你声卡真确的选择了I/O和IRQ。声卡的MPU I/O是0选项。一般是330,如果不对不必担心。模块的好处就是在核心编译以后你还能重新编译、安装模块并挂上核心。(模块是不是很伟大?)
最后一节的一个问题必须这样回答“no,kernel hacking"。
保存你的配置并退出。
译者:以上只是作者使用的核心编译情况,如果不同请查看你的HOWTO。
我在menuconfig或xconfig的几个地方修改数字遇到了麻烦,但我确信它是对的。无论如何,我不能改变数字或配置不接受数字,并告诉我非法。列如,把声卡的默认IRQ从7改变到5,MPU I/O从0到300。如果经历过这问题,但一切仍很好,不要失望。你刚才存盘退出的文件是一个可以编辑的文本文件。你可以用你的文本编辑器如: Emacs,vi,CrispLite,joe,等等。配置文件在/usr/src/linux目录名字是.config。前面的点使普通的(ls)无法显示,加上-a选项就能看见。编辑文件中在配置时遇到麻烦的数字。然后,make dep 把你的配置信息从.config传送到特定的子目录完成安装。最后,make clean 准备最后的核心编译。
编译核心
现在我们准备编译核心。这儿有几个选项来进行该工作:
make zImage
制作基础的,压缩的核心它将留在/usr/src/linux/arch/i386/boot目录名为zImage。
make zlilo
拷贝zImage到根目录 (除非你编辑上层的Makefile) 运行LILO。如果你用了这项,你不得不确信/etc/lilo.conf是先配置
make zdisk
写zImage到软盘在/dev/fd0 (就是DOS中第一软驱A:)。在开始之前你必须有张盘在软驱中。你可以同样用make zImage 然后把它拷贝到软盘cp /usr/src/linux/arch/i386/boot/zImage /dev/fd0 记住是高密度的,底密度的720k磁盘将不能启动核心(嘿都这时候了谁还用这玩艺儿,不要告诉我你有)
make boot
和zImage一样。
make bzImage
使用和zImage一样的大核心,你要知道使用这项通常提示映象文件太大而失败
make bzdisk
使用和zdisk一样的大核心,你要知道使用这项通常提示映象文件太大而失败
其它make选项也是可用的,但是特殊的,并且不在这儿出现。当然如果你需要特别支持,就象RAM disk ,SMP,阅读适当的文档,编辑在/usr/src/linux下相应的Makefile(也叫作top-level Makefile)。上面我讨论的选项和zImage选项一样基础,剩下部分是处理make zImage--重建核心最容易的方法。
对于那些想加快进程速度的人将不做其它事情(如配置其它应用程序),建议你查看man手册使用-j选项(也许有限制比如5)和-l选项。
如果配置过程中选择了模块,你可执行以下命令:
make modules
make modules_install
把模块放入默认查找路径/lib/modules/2.0.x/,x是核心的次号。如果你已经有了这个子目录并且它有block,net,scsi, cdrom,等等子目录。除非你安装所有的模块,那么你可以删掉2.0.x和下面所有的东西,其实也不必删掉。当模块装入时,子目录被创建覆盖。
你可以简单的结合使用三条命令:
make zImage:make modules:make modules_install
磁盘插入完成后在回到这,分号使在同一行上的命令分开,并执行每一条命令,这样你在下一条命令执行前就不必等了。
一旦你的核心重建并且安装了模块,有几点必须小心。首先,把你的核心拷贝到root(或/boot/或/etc/,随你想);
cp /usr/src/linux/arch/i386/boot/zImage
同样你需要把/usr/src/linux/System.map拷贝到同意目录用作核心的镜象。改变路径(cd)到/etc目录配置LILO。这一步很重要。如果我们在新核心中不安装pointer,它将不启动。通常,核心安装叫做vmlinuz。过去Unix使用者共同起了这名字。"z"表示压缩, "v"和"m"意思是"virtual"(虚拟)和"sticky(粘性的)",各自属于内存和磁盘管理。我建议保留vmlinuz核心,直到知道它工作。
编辑/etc/lilo.conf文件并加入新核心。使用从image=/vmlinuz到下一个或最后的image= 的行。把看到的记录下来,把第一行改成image=/zImage(假设你的核心在根目录)为label=.选一个不同的名字,第一个image是默认的。启动它们有特定的顺序。保存执行命令: lilo
你将看到核心标签,第一个是星号。如果你没有看到新核心的标签或LILO出现错误,你需要重新对/etc/lilo.conf工作(看LILO帮助页)。
我们已经准备重新引导。这时如果你知道你的系统仅要求一次启动作准备,你可以执行:
depmod -a 2.0.x
x是正是你重建的核心的次号。这条命令创建一些模块所需的文件。你当然想确信启动时不是直接进入xdm.对于Red Hat系统,它的意思是保证文件/etc/inittab不在第5层运行,或者你记住在启动时运行。对于Debian系统,你可以输入:
mv /etc/init.d/xdm /eetc/init.d/xdm.orig
现在把它移回去。
重新启动新核心
重新启动机器:
shutdown -r now
我不建议使用热启动或ctrl+alt+del键。在一些情况下,文件系统不完全卸栽会损坏打开的文件。在LILO提示时,如果你需要启动旧的核心或使用一些参数启动,如果你没看见启动提示,你可以试用shift或ctrl键,这样启动提示就出现了。一旦出现,按tab看核心标签。输入标签和可选参数启动。通常,在/etc/lilo.conf文件指定的时间后自动启动核心。启动时,你可能看见一些出错信息就象SIOCADDR。这常常显示模块(一般是网络模块)没有引导。处理这事很简单,如果有此一错,"VFS,cannot mount root",你就不要在核心中编译适当的磁盘或文件系统支持。
发现并修理故障
由于从/etc/initab启动时有多种分配的方法,很难在本章覆盖所有可能的原因如你不能正常启动和它的原因.
首先,运行 depmod -a 确信你有up-to-date,模块从属文件(它被创建在特定的目录).如果你决定从属时遇到一串错误,如果你没有在配置核心时打开"Module Versions".这并不完全错误,你编译安装的模块是好的.检查/etc/conf.modules文件中的每行指向/lib/modules都很完全:
/lib/modules/`uname -r`/xx
(注意:uname -r 二边的~符号,它位于U.S键盘左边的TAB键和SHIFT键的上面.)
确信kerneld运行,且在启动进行时早被引导.如果是这样,系统不需要明确引导模块,核心会处理的.在第一个rc脚本调用核心时要小心.核心会中止启动进程,热启动或用reset键或关电源,如果它是在系统知道主机名之前.如果这事发生在你生上,你可以重新启动在LILO时使用-b参数阻止任何rc脚本使用init.然后,rc的/etc/rc.d/,rc.sysinit和rc.modules文件.有许多方法可以指出一个目录如 /etc/modules/~uname -r~ /~uname -v~列出检索到的启动模块.你可以把旧的目录去覆盖新的.
mkdir /etc/modules/`uname -r` ;cp /etc/modules/2.0.xx/g#1 Thu 3 Sep 1997.\ default /etc/modules/`uname -r`/\ `uname -v`.default""
你的系统将含有不同日期的模块,可能或不使用默认的扩展.在上例特别注意使用~和成对的~,在适当的地方它们是需要一起出现的.一旦你发现了系统的这一关键,你就可以启动一个有特殊功能的系统了.如果你经历更进一步的问题,最好最直接的地方是,在一个mailing list上面有专家详细的建议。他们成功的运行着一个特殊的区域通常很高新援助新手,当遇到问题是可以问他们。为什么这样,因为他们是一个整体在许多问题上注意并提供帮助。祝你在list上好运,如果你的问题还没有其它人提到,那就自己问吧。首先检查是否有mail-list archives,这些档案提供常见的问题答案。
结论
当为你系统编译定制的核心,对于管理员中的新手来说是一个使人畏缩的挑战,但花些时间是值得的。你的系统运行将更高效,更重要的是,你会对自己的编译更满意。
在一些地方你会遇到麻烦,记住安装核心后回到LILO,不要覆盖你的旧核心,这样你能从LILO提示恢复到其中的一个。在第一次重新启动时遇到的销售商明确的问题通常早被解决了。销售商通常仅使用E-mailt提供帮助但他不是技术支持。