核心的版本号

    所有的Linux核心包含由点隔开的三个数字第一个数是核心的版本我们现在是第三版()一些人可能使用版本号为的核心并且我知道至少还有人在用版本核心

    第二个号码是核心的主号主号也是数字(包括)表示稳定性这样这些核心将没有一些BUGS他们经过相当大量的测试当某个版本含有一些小BUGS它们将被升级以使硬件兼容或加强核心对付***如核心避开对报表BUG的支持它包含几个补丁包括保护SYN避免服务器受***核心带有零主号是发展中的核心这些可能未经测试可能但不经常中断你正运行的软件包有时候为了更好的工作用户需要采用在下一个稳定的核心发表之前的最新的最好的支持核心这就向对真理一样没有异议这对系统有本质上的改变

    最后一个号码是次号它因每一次改动而增加如果你看到核心版本你知道它是核心稳定的核心它已经是第九次发表了(我们从零开始记数)   

    获得/升级源程序

    Linxu核心源程序可以从大量的FTP站点和几乎每一张Linux销售CD上得到新手可到ftpfunetfi最主要的站点上找Linux核心你可以从该站点上一系列镜象站点上下栽Linux核心选择一个最近的站点有助于减少internet整体通信量

    一旦你获得源程序拷入/usr/src目录创建一个目录放置你用tar解压的源文件我建议目录以版本号命名如linux或kernel用以下命令为目录建立一个叫linux连接

    lnsflinuxlinux

    我在连接命令中使用了f因为你已经在/usr/src中有了一个核心源连接(一些版本的ln(如)强制选项(f)将不起作用你不得不必须首先解除连接再建立连接在版本中运行正确)现在你仅仅有一个问题就是如果linux是一个目录不是连接如果你有这个问题你不得不在继续前更改目录的名字

    mvlinuxlinux

   现在执行下列命令

    tarxzvflinuxkernelsourcetargz

    我有一习惯总是在tar参数中包括w(等待确认)下来让我们看着targz或tgz文件解压到自己的目录用ctrlC中断再去掉w继续命令这样一来我能阻止解压到当前目录

    一旦你解开了核心这正是你执行修补程序的最佳时机如果你需要的话假如你不希望运行核心但你希望使用tcpsycookies把该补丁(tcpsyncookiespathc)拷贝到/usr/src目录执行以下命令:

    patch<tcpsyncookeispatch

    该命令实现修补核心在/usr/src目录中寻找以扩展名为rej的文件这些文件严格的说不是修补文件它们也许并补重要但需要细心的阅读如果你安装了RedHat系统并装了一些并不是全部的核心源程序(SPARCPowerPCetc)你将看到一些文件如果这不是你所需要的哪就行了

    准备工作

    给你一个忠告在我们转到核心源程目录和开始编译前让我们检查所需的连接在你的/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现在你也许想停下细读一下文档文件实际上如果你有些特别的硬件或几种光驱驱动程需要自己动手设置他们通常这样做当引导时这些驱动程序将给出警告这并不碍事他们照常工作少阅读扩展名为txthc的文件通常我发现他们具有共性且易于配置如果你不想冒险你没必要做记住你照样可以解开tar文件(或再次安装rpm文件)恢复前的文件

    开始编译

    我建议首先执行以下命令:

    makemrproper

    当核心源程序在以前条件下这条命令不是必需的但这培养一个好习惯这命令保证旧的文件不在使用

    配置核心

    现在你可以配置核心首先你要了解一点关于模块的知识楔块就像你特意插入核心中的某些东西如果你家中一个小网络并且有时想用一下(但并不经常)也许你想把网卡编译成一个模块使用这个模块机器必运行和存取/libs下的模块意思是驱动程序(IDESCSI等但必须是NFS支持的网卡)文件系统(通常是ext但也可以是nfs)和核心类型(最好是elf)必须编译在内并且不能是模块模块只有核心引导时才起作用驱动程序(来网络)的存取和文件系统安装这些文件必须编译在核心内否则将能安装启动分区如果安装启动分区和网络你需要网络系统文件和己经编译的网卡

    为什么要使用模块?模块化使核心变的更简捷它减少核心释放大量的受保护的空间模块的安装和卸载使用的空间是可重复分配利用的如果你打开机器有%以上的时间用到一个模块编译它运用这类模块是浪费内存的原因是一旦你编译了楔块它们同样将占用大量的内存核心需要一些代码来挂上模块记住核心在保护空间运行但模块并不是这么说我并不经常使用我的设备我把它编译成只支持extide和elf而我一直使用网卡我把其它的编译成模块如outjavafloppyisomsdosminixvfatsmbnfssmcultra(ethernetcard)serialprintersoundppp等等它们许多只是在这或那用上那么几分钟

    下一步是配置核心这而我们有三种选择目的相同我建议使用一种图形方法以前是简单的输入makeconfig开始一系列提问而且如果你答错了你只有按ctrlc从新再来一遍你甚至不能按一定顺序重复一些问题与以前的提问有关如果你有绝对的理由不能使用任何一种图形方式那碰到麻烦你一定会找我的

    我建议使用makemenuconfig或makexconfig中的一种假如使用menuconfig你必须安装ncursesdev和tkdev库如果你没有装入上面的库而且你又不想用下一种方法我建议现在就你安装上面的库在稍后你仍然可以卸载它们

    要运行xconfig你必须安装配置X因为X需要大量内存我安装配置X仅仅在一部分时间运行X当编译核心时我回到以前的控制台因为编译需要内存我的观点是xconfig菜单是最好最简单的途径来配置核心在menuconfg如果你去掉一个选项它的从选项将不会显示在xconfig如果你去掉所有选项从选项依旧显示它们成灰色显示我喜欢它的原因是使我能知道新加了什么我可以打开一个选项得到一个新的从选项来试用一下

    我将花一点文字描述一下核心配置的一些部分告诉你一些我(艰难的)发现的事

    第一节是codematuritylevel选项仅有的一个问题是你是否想使用开发的驱动程序和代码如果你有令你出血的硬件你可能不得不作出一个选择如果你选择no试验代码将成灰色或不显示如果你核心寻求通讯产品支持你可能选择no

    第二节涉及模块如果你想模块化在问题和选择yes如果你想使用所有得模块比如Caldera&#;sOpenLinux的Netwar支持第二个问题回答yes&#;这样不需要从新编译模块

    第三节是一般的设置编译模块成ELF和编译支持ELF二进制不编译适当的支持gotcha是明智的如果你的机器结构是Pentium或你将得到高效的代码但一个的核心将运行在bitcompatibleclone一个Pentium核心将不为大多机器制作一张紧急启动盘(就象销售商的安装盘)最好在下编译而并不能运行在Pentium下编译的核心

    下一个是块设备这儿并不要特别说明什么如果你的启动设备是IDE硬盘确定编译它就行

    下来是网络对于一些没有连接网络的用户你不必要在这停留除非你计划使用计算机拨号连接其它用户在这儿你需要读懂并照建议的指导使用

    紧接着是SCSI至于为什么不直接跟在块设备后面我也不知道如果你的启动分区是SCSI设备不要选择SCSI模块支持

    在一般的SCSI后是SCSI低级设备驱动程序再次重申模块仅仅是用在不在启动分区的设备

    下一节令我们回到再次回到网络我想你会再这找你特殊的网卡象其它一样支持pppslip等等如果你使用nfs安装你的启动设备把网卡编译在内

    对于那些需要ISDN支持的幸运的人ISDN从选项就需要编译

    在下一节支持更早的CDROM如果你使用SCSI或IDECDROM你可以跳过这里

    下面是文件系统同样编译你所需要的通常是ext而让其余的使用模块

    字符设备是下一个选项非串行的鼠标支持象PS/看一看你鼠标的键许多双键鼠标是PS/即使它们的连接看起来象串行的你当然期望最低限度支持串行列表中支持普通的打印机    

    保存你的配置并退出

    编译核心

    现在我们准备编译核心这儿有几个选项来进行该工作

    makezImage

    制作基础的压缩的核心它将留在/usr/src/linux/arch/i/boot目录名为zImage

    makezlilo

    拷贝zImage到根目录(除非你编辑上层的Makefile)运行LILO如果你用了这项你不得不确信/etc/liloconf是先配置

    makezdisk

    写zImage到软盘在/dev/fd(就是DOS中第一软驱A)在开始之前你必须有张盘在软驱中你可以同样用makezImage然后把它拷贝到软盘cp/usr/src/linux/arch/i/boot/zImage/dev/fd记住是高密度的底密度的k磁盘将不能启动核心(嘿都这时候了谁还用这玩艺儿不要告诉我你有)

    makeboot

    和zImage一样

    makebzImage

    使用和zImage一样的大核心你要知道使用这项通常提示映象文件太大而失败

    makebzdisk

    使用和zdisk一样的大核心你要知道使用这项通常提示映象文件太大而失败

    其它make选项也是可用的但是特殊的并且不在这儿出现当然如果你需要特别支持就象RAMdiskSMP阅读适当的文档编辑在/usr/src/linux下相应的Makefile(也叫作toplevelMakefile)上面我讨论的选项和zImage选项一样基础剩下部分是处理makezImage重建核心最容易的方法

    对于那些想加快进程速度的人将不做其它事情(如配置其它应用程序)建议你查看man手册使用j选项(也许有限制比如)和l选项

    如果配置过程中选择了模块你可执行以下命令

    makemodules

    makemodules_install

    把模块放入默认查找路径/lib/modules/x/x是核心的次号如果你已经有了这个子目录并且它有blocknetscsicdrom等等子目录除非你安装所有的模块那么你可以删掉x和下面所有的东西其实也不必删掉当模块装入时子目录被创建覆盖

    你可以简单的结合使用三条命令

    makezImagemakemodulesmakemodules_install

    磁盘插入完成后在回到这分号使在同一行上的命令分开并执行每一条命令这样你在下一条命令执行前就不必等了

    一旦你的核心重建并且安装了模块有几点必须小心首先把你的核心拷贝到root(或/boot/或/etc/随你想)

    cp/usr/src/linux/arch/i/boot/zImage

    同样你需要把/usr/src/linux/Systemmap拷贝到同意目录用作核心的镜象改变路径(cd)到/etc目录配置LILO这一步很重要如果我们在新核心中不安装pointer它将不启动通常核心安装叫做vmlinuz过去Unix使用者共同起了这名字"z"表示压缩"v"和"m"意思是"virtual"(虚拟)和"sticky(粘性的)"各自属于内存和磁盘管理我建议保留vmlinuz核心直到知道它工作

    编辑/etc/liloconf文件并加入新核心使用从p_w_picpath=/vmlinuz到下一个或最后的p_w_picpath=的行把看到的记录下来把第一行改成p_w_picpath=/zImage(假设你的核心在根目录)为label=选一个不同的名字第一个p_w_picpath是默认的启动它们有特定的顺序保存执行命令lilo

    你将看到核心标签第一个是星号如果你没有看到新核心的标签或LILO出现错误你需要重新对/etc/liloconf工作(看LILO帮助页)

    我们已经准备重新引导这时如果你知道你的系统仅要求一次启动作准备你可以执行

    depmodax

    x是正是你重建的核心的次号这条命令创建一些模块所需的文件你当然想确信启动时不是直接进入xdm对于RedHat系统它的意思是保证文件/etc/inittab不在第层运行或者你记住在启动时运行对于Debian系统你可以输入

    mv/etc/initd/xdm/eetc/initd/xdmorig

    现在把它移回去

    重新启动新核心

    重新启动机器

    shutdownrnow

    我不建议使用热启动或ctrl+alt+del键在一些情况下文件系统不完全卸栽会损坏打开的文件在LILO提示时如果你需要启动旧的核心或使用一些参数启动如果你没看见启动提示你可以试用shift或ctrl键这样启动提示就出现了一旦出现按tab看核心标签输入标签和可选参数启动通常在/etc/liloconf文件指定的时间后自动启动核心启动时你可能看见一些出错信息就象SIOCADDR这常常显示模块(一般是网络模块)没有引导处理这事很简单如果有此一错"VFScannotmountroot"你就不要在核心中编译适当的磁盘或文件系统支持

    发现并修理故障

    由于从/etc/initab启动时有多种分配的方法很难在本章覆盖所有可能的原因如你不能正常启动和它的原因

    首先运行depmoda确信你有uptodate模块从属文件(它被创建在特定的目录)如果你决定从属时遇到一串错误如果你没有在配置核心时打开"ModuleVersions"这并不完全错误你编译安装的模块是好的检查/etc/confmodules文件中的每行指向/lib/modules都很完全:

    /lib/modules/`unamer`/xx

    (注意:unamer二边的~符号它位于US键盘左边的TAB键和SHIFT键的上面)

    确信kerneld运行且在启动进行时早被引导如果是这样系统不需要明确引导模块核心会处理的在第一个rc脚本调用核心时要小心核心会中止启动进程热启动或用reset键或关电源如果它是在系统知道主机名之前如果这事发生在你生上你可以重新启动在LILO时使用b参数阻止任何rc脚本使用init然后rc的/etc/rcd/rcsysinit和rcmodules文件有许多方法可以指出一个目录如/etc/modules/~unamer~/~unamev~列出检索到的启动模块你可以把旧的目录去覆盖新的

    mkdir/etc/modules/`unamer`;cp/etc/modules/xx/g#ThuSep\default/etc/modules/`unamer`/\`unamev`default""

    你的系统将含有不同日期的模块可能或不使用默认的扩展在上例特别注意使用~和成对的~在适当的地方它们是需要一起出现的一旦你发现了系统的这一关键你就可以启动一个有特殊功能的系统了如果你经历更进一步的问题最好最直接的地方是在一个mailinglist上面有专家详细的建议他们成功的运行着一个特殊的区域通常很高新援助新手当遇到问题是可以问他们为什么这样因为他们是一个整体在许多问题上注意并提供帮助祝你在list上好运如果你的问题还没有其它人提到那就自己问吧首先检查是否有maillistarchives这些档案提供常见的问题答案