电脑技术学习

linux内核的编译

dn001
1.;要怎麽进行核心的配置?
1.1.;取得原始程序码
你可以经由;ftp;从;ftp.funet.fi;或是;mirror;in;/pub/OS/Linux/PEOPLE/Linus;取
得原始程序码。也可以到这个节点的;mirror;或其他节点去拿。档案名称一般是以标记
成;linux-x.x.x.tar.gz;为代表,其中的;x.x.x;是版本编号。较新的(更好的?)版
本以及修补档一般是放在类似”v1.1;”以及”v1.2”这样的子目录下。
强烈建议你去找;mirror;的;ftp;节点,而不要直接到;ftp.funet.fi;去!底下是一些
mirrors;以及其他节点的简要列表
(;ftp.funet.fi;的;mirror;节点:)
Germany:ftp.Germany.EU.net
UK:;;;;;doc.ic.ac.uk
Australia:;;;;;;kirk.bu.oz.au
(;其它有摆放核心档案的节点:)
USA:;;;;tsx-11.mit.edu
USA:;;;;sunsite.unc.edu
Germany:ftp.dfv.rwth-aachen.de
如果你没有办法上;ftp;,有个存放;linux;的;BBS;系统列表会定期刊登在
comp.os.linux.announce;上,试著到那边去找点帮助。
1.2.;解开原始程序码的包装
确定你是以″;root;″的身份签入,然後;cd;到;/usr/src;。如果你的;linux;是从其
它任何可能的地方取得的,在这个目录底下应该已经存在一个叫做”;linux;”的子目
录。这是旧版的;linux;原始程序码。如果你还有磁碟空间而且想要玩得安全一点,那
麽你会想要保留这个子目录的。有个好主意是根据你目前使用的核心版本来修改这个子
目录的名称。″;uname;-r;″这个指令将会告诉你新的版本。
所以,如果″;uname;-r;″显示″;1.1.47,″你就可以把″;linux;″改名为
″;Linux-1.1.47;。″如果你是个鲁莽型的人,那就直接把这个子目录清除掉。无论是
哪一种情况,反正只要确定在解开全部的原始程序码之前,;/usr/src;目录下没有
”linux;”这个子目录就对了。
在;/usr/src;目录下,用″zcat;linux.x.x.tar.gz;|;tar;xvf-;″来解开原始程序码
的包装(你也可以用更简单的″;tar;zxvf;linux.x.x.x.tar.gz″;如果你拿到的是
..tar;的档案(後面没有加上;;gz;),那就用”;tar;xvf;linux.x.x.x.tar;”)。你
将会看到原始程序的内容飞逝而过。当它完成以後,将会出现一个新的″;linux;”子
目录。
″;cd;″到;linux;目录下然後查看;README;档,里面应该会有一段标题为
″INSTALLING;the;kernel″;或类似的文字。如果适当的话,先执行说明里的指示;—
建立该有的符号链结,移除过时的;.o;档案等等等诸如此类的工作。
1.3.;配置核心
注意:这部份内容有些是重覆;Linus;的;README;档案中的相应章节或加以修订。
在;/usr/src/linux;下执行″;make;config;″;这个命令将会启始一个指令稿,而这个
指令稿会问你各种问题。它需要;bash;,所以要确定;bash;是;/bin/bash,/bin/sh;或
$BASH;。
你现在该准备好回答这些问题,通常用″;y;″或″;n;″就可以了。有一些很明显或是
不重要的选项将不会在此加以说明。
1.3.1.;Kernel;math;emulation;(核心的浮点运算模拟)
如果你没有数学辅助运算处理机(ie,你只有一台单纯的;386;或;486SX;),那麽你在
这里要回答″;y;″。如果你已经有数学辅助运算处理机却还回答″;y;″,那也不必太
担心;—;linux;还是会去使用它而忽略掉核心的模拟程序。唯一的影响是编译出来的核
心变大了。
1.3.2.;Normal;harddisk;support;(标准硬碟支援)
你在这里差不多都得回答″;y;″。它代表的意思是核心将会支援标准的;PC;磁碟,例
如大多数人使用的;IDE;界面硬碟。这不包括;SCSI;设备的支援。
1.3.3.;Networking;support;(网络支援)
如果你有连接网络,譬如说,你与;internet;有连线,或是你将使用;SLIP,PPP,term
或其它方式拨接到;internet;上的话,回答″;y;。″
1.3.4.;Limit;memory;to;low;16MB;(限制记忆体在;16;MB)
如果你的记忆体不到;16;MB,几乎一定要回答″;y;″;那麽当你使用这个核心的时候
将会节省一点记忆体。但是,当然罗,如果你有;16;MB;以上的记忆体而不回答″;n;″
的话,这个新的核心将只使用其中的;16;MB;,即使你有;34;billion;megs;也一样。
也可能会有一些不良的;386;DMA;controllers(或是一些与硬件有关的东西)无法正确
地定址到;16;megs;以上的记忆体位址;你的机器刚好有这种情况时(罕见),那麽你
也就只好回答″;y;″了。
1.3.5.;Use;-m486;flag;for;486-specific;optimizations
(使用;-m486;旗标指定对;486;做最佳化)
这将会为核心做;486;最佳化处理。新的核心将会变得稍微大一些,如果你担心的话的
话,其实它还是可以在;386;上执行。只是会比较慢,不过你感觉不出来的。
1.3.6.;SCSI;support;(SCSI;的支援)
如果你有;SCSI;设备,那麽就回答”;y;。”接著会有提示要求更进一步的资讯,像是
你是否要支援光碟机,磁碟机,还有你使用的是那一种;SCSI;介面卡。这部份请参阅
SCSI-HOWTO;,有更详细的说明。
1.3.7.;Network;device;support;(网络设备支援)
如果你有以太网络卡,或者你想要使用;SLIP,PPP,或是并列埠界面卡,那就回答
″;y;″,接著会有提示问你使用的是那一种网络卡,或要使用那一种串列通讯协定。
1.3.8.;Filesystems;(文件系统)
这将会有提示要你回答所要支援的文件系统种类,计有:
Standard(;minix;)—;新的套件不再建立;minix;文件系统,而且很多人不使用它,
但是把它配置在核心里仍然是个好主意。某些″;rescue-disk;″;程序会用到它,而且
仍然有许多磁片可能用;minix;文件系统,因为;minix;文件系统对於处理磁片方面是最
好的。
Extended;fs;—;这是扩充文件系统的第一版,现在已经不再使用。使用的时机是,如
果你有需要,你就会知道的。
Second;extented;—;这是现在新发行的套件所广泛采用的文件系统,你可能会有其中
一种。
xiafs;filesystem;—;这个文件系统曾经一度很普遍,但是在写这份文件时,我已经不
知道有任何人在使用它了。
msdos;—;嗯,你猜对了;如果你想要在;linux;下使用你硬碟中的;MS-DOS;分割区,或
是想将用;MS-DOS;格式化的磁片挂进来的话,回答″;y;″。
ums-dos;—;这是一个相当;slick;的文件系统,它能使;MS-DOS;文件系统拥有更多的特
性,像是长档名等等。这对那些不使用;MS-DOS;的人(像我)并不是很有用。
/proc;—;这是最;slick;的文件系统之一(我猜这个概念是无耻地从贝尔实验室里偷过
来的)。它不是你硬碟分割区里的任何东西,而是核心与程序之间的文件系统介面。许
多程序工具(像″;ps;″)都会用到它。
如果你已经将它安装好了,有空不妨试试看″;cat;/proc/meminfo;″或者是
″;cat;/proc/devices;″。有些;shells;,像是;rc;,会用;/proc/self/fd(在其它
系统上为;/dev/fd;)来处理输出入。几乎可以确定你在这里得要回答″;y;″,有许多
重要的;Linux;标准工具是靠它来运作的。
NFS;—;如果你在网络环境下而且想要分享档案,回答″;y;。″
ISO9660;—;绝大部分的光碟都使用这个文件系统。
OS/2;HPFS;—;在编写这份文件的时候,这个文件系统还只支援到;OS/2;HPFS;的读取。
System;V;and;Coherent;—;这是为;System;V;以及;Coherent;的分割区而设的。
1.3.8.1.;但是我不知道我需要那些文件系统!
好吧,键入″;mount;。″它看起来会像这样:
blah%;mount
/dev/hda1;on;/;type;ext2;(defaults)
/dev/hda3;on;/usr;type;ext2;(defaults)
none;on;/proc;type;proc;(defaults)
/dev/fd0;on;/mnt;type;msdos;(defaults)
仔细看看每一行;在”;type;”後面的那个字就是文件系统的格式。在这个例子中,我
的;/;和;/usr;分割区是;second;extended;格式,我有使用;/proc;,而且挂有一张以
msdos;(bleah);为文件系统格式的磁片。
如果你有使用;/proc;,可以试试″;cat;/proc/filesystems;″。它会给你一份目前使
用的核心所支援的文件系统列表。
1.3.9.;Character;devices;(字元设备)
在这里,你将会发现许多设备名称,用来设定你的印表机,汇流排滑鼠,PS/2;滑鼠(
大部分笔记型电脑使用内建的;PS/2;滑鼠),以及一些磁带机驱动程序,selection;。
当有合适的选项时,回答”;y;”。
注意:”;Selection;”让你能够执行一个程序,这个程序使你可以在;X-windows;之外
使用滑鼠在各个虚拟控制台间做剪贴的动作。如果你有串列滑鼠的话,这真的很棒,因
为它与;X-windows;之间的沟通良好,然而在编写这份文件的时候,它跟;PS/2;滑鼠还
是处不来(它会锁住滑鼠所使用的埠,使得你在杀掉这个;selection;程序之前都不可
能执行;X-windows;。)。
1.3.10.;Sound;card;(声卡)
如果你对於让隔壁的人保持清醒有兴趣的话,回答″;y;,″然後等一下会有一个配置
程序编译并详细询问你所有关於你的声卡的问题。
1.3.11.;kernel;hacking
>这是从;Linus;的;README;里摘录的:
″;kernel;hacking;″配置的细节通常会产生一个更大或是更慢的核心(或者是又大又
慢),而且可能因为将一些常式配置成很活跃地去尝试中断一些不良的程序码以便找出
核心里的问题(;kmalloc();),而使得核心变得比较不稳定。所以要产生一个核心″
产品;″的话,你在这里应该回答″;n;″。
1.4.;现在呢?(;The;Makefile;)
现在应该会有一个讯息告诉你核心已经配置好了,以及要你去″;check;the
top-level;Makefile;for;additional;configuration,”等等。
所以查看一下;Makefile。你应该不必改变它,但是看看无妨。一旦新核心完成,
你也可以用″;rdev;″指令来改变其中的选项。
2.;编译核心
2.1.;清除与确认
当用来进行配置的指令稿执行完成时,它会告诉你去做″;dep;″跟″;clean;。”所以
要执行″;make;dep;。″除非你的电脑真的很慢,否则它不会花太久时间的。Making
depend;确定你已经具备所有必需的要件,像是含入档以及诸如此类的东西。当它完成
後(你也可以在″;make;dep;″之前执行它),执行″;make;clean;。″这会清除核心
编译的所有目的档以及其它东西。不要忘记这个步骤。
2.2.;编译时期
在执行清除与确认工作之後,你现在可以执行″;make;″或是″;make;zdisk;。″
″;make;″将会编译核心,并且留给你一个叫做″;zImage;″的档案(这一类的东西)
。这就是新的核心。″;make;zdisk;″做的事也一样,但是它会把核心放到你所希望的
磁片去,只要把这张磁片放在;a:。”;zdisk;”对於测试新核心很方便;如果它完全
不行,只要把磁片拿掉再用旧的核心启动即可。
如果你意外地删除了核心或是什麽的,它也是个方便的启动办法。当你把一台磁碟的内
容倾倒到另外一台去时,你也可以用它来安装新的系统(除了这些之外还有更多用途!
NOW;how;much;would;you;pay;?)。
所有近来的核心都是压缩过的,所以有个”;z;″在名字前面。核心是压缩过的,当它
执行的时候会自动将自己解压缩(一个节省磁碟空间的好方法)。
2.3.;其他可以″;make;″的东西
″;make;mrproper;″将会做更广泛的″清除″。这个动作有时候是必须的,所以你可
能会希望在每次修补的时候执行它。″;make;zlilo;″将会安装核心,然後对它执行
LILO;,使你完成所有开机的准备,但是这只有在;lilo;已经以下列这种方式配置好的
时候才可以:核心为;/vmlinuz;,;lilo;在;/sbin;下,而且与你的;lilo;配置一致。
2.4.;安装核心
在你已经获得一个看起来能够照你希望运作的新核心之後,现在是安装它的时候了。大
大部份的人使用;LILO(;Linux;Loader;)来做这件事。这是一个相当容易安装的软体
,然而,它会因为配置档而困扰人们。如果你没有最新的版本,查看配置档(不是旧版
的;/etc/lilo/config;就是新版的;/etc/lilo.conf;),看看里面有些什麽,它会告诉
你像这样子的东西:
image;=;/vmlinux
label;=;Linux
root;=;/dev/hda1
...
首先,″;image;=;″是设定为已经安装的核心。大部份的人似乎都用;/vmlinuz;,但
是我用;/vmlinux;。″;lable;″;则是由;lilo;用来告诉你现在要启动的是那个核心或
作业系统,而″;root;″则是这个特别的作业系统的根目录;/;。备份一份旧的核心(
无论什麽档名),然後将你做的;zImage;拷贝进去,(例如,如果你用”;/vmlinuz;″
的话,就像这样″;cp;zImage;/vmlinuz;”)。
接著重新执行;lilo;—;在较新的系统上,你可以只执行″;lilo;,″但是在较旧的系
统上,你可能必须执行;/etc/lilo/install;或甚至是
/ect/lilo/lilo;-C;/etc/lilo/config;。
如果你想知道更多有关於;lilo;的配置,或是你并没有;lilo;但是你想要安装的话,从
你喜欢的;ftp;节点拿最新的版本然後依说明行事。
要能够从硬碟启动你的旧核心其中之一的话(这是另一个在新核心出状况的情况下保护
你自己的方法),把;lilo;配置档中所有的(包括一行)″;image;=;xxx;″;拷贝到档
案的最底端,然後把″;image;=;xxx;″改成″;image;=;yyy;,″其中的″;yyy;″是
你备份旧核心所存档的名字。接著,把″;lable;=;xXx;″改成像是”;lable;=;linux-
backup。”然後重新执行;lilo;。
你可能得要加上一行″;delay;=;x;,″其中的;x;是以十分之一秒为单位的时间,这是
用来使;lilo;在启动前先等一下,所以你可以中断它的执行(例如用;shift;键)。然
後键入所备份的启动映像之;lable;(在发生了某些令人不愉快的事情的情况下)。
3.;修补核心
3.1.;使用修补档
核心的小幅更新是以修补档的方式发行。例如,如果你的版本是;1.1.45;,而且你注意
到出现了一个″;patch46.gz;″可以用来升级它,这代表你可以藉由使用这个修补档将
版本升级到;1.1.46;。你也许会想要先备份;source;tree(″make;clean;″然後″;cd
/usr/src;;tar;cvf;linux;|;gzip;-c;>;old-tree.tar.gz″将会为你造出一份;tar;压
缩档,里面就是整个原始程序码与其档案架构。)。
现在接著继续上面的例子,假设你已经取得了″;patch46.gz;″并放在;/usr/src;下。
cd;到;/usr/src;然後执行″;zcat;patch46.gz;|;patch;-p0;″(如果并不是压缩过的
修补档,那麽就执行″;patch;-p0;<;patch46″)你将会看到许多东西飞逝而过(也许
它们会慢慢跳过,如果你的电脑真的很慢的话)告诉你它正试著应用;hunks;,以及是
否成功。
通常,这个过程快得无法仔细看清楚它的动作,所以你会无法确定它到底有没有成功地
执行。那麽就得找找看一些可能不是那麽顺利的事。cd;到;/usr/src/linux;并找寻档
名有;.reg;的档案。某些版本的修补档(比较旧的版本,它们可能是在比较早期的档案
系统上编译的)会把这些没有成功的操作记录在档名有;#;的档案里。你可以用
″;find;″来替你找;″;find;.;;-name;'*.reg';-print;″会处理这个工作。
如果一切正确无误的话,执行第二节跟第三节所讨论的″;make;clean;,″″;config
,″以及″;dep;″。
关於;patch;指令另外还有一些选项。patch;-s;将会抑制除了错误以外的所有其他讯息
。如果你把核心原始程序码放在;/usr/src/linux;以外的地方,在该目录下用
patch;-p1;也可以乾净俐落的执行修补任务。其它的;patch;选项在;manual;pages;里
都有很详细的描述。
3.2.;如果有错误发生
通常最常发生的问题是当;patch;修改一个叫做″;config.in;″;的档案时,这个档案
看起来不怎麽对劲,因为你修改了一些选项来配合你的机器。这个问题已经小心的注意
过了,但还是可能有人会在较旧的版本上遭遇这个问题。
要修正这个问题的话,查看;config.in.rej;这个档案里留下些什麽讯息。有修改过的
部份正常来说会在每一行开始的地方标上″;+;″和″;-;″。查看有标记的附近几行,
然後记得它们是设成″;y;″或是″;n;。″现在编辑;config.in;档,然後在适当的地
方把″;y;″改成″;n;″以及″;n″改成″y″。
执行″;patch;-p0;<;config.in.rej;,″如果成功的话(没有错误),那麽你就完成
了。这个;config.in.rej;档还是会留在那里,但是你可以砍掉它。
如果你仍然遭遇其它问题,那麽可能是你安装了一份损坏的修补档。如果;patch;显示
″;previously;applied;patch;detected:;Assume;-R?;,″你可能使用了一些比你目
前的版本编号还低的修补档(并不建议这样做)。
要还原一个修补档的话,在原先的修补档上执行″;patch;-R;″。
当修补档真的失败的时候,最好的办法是从一个乾净的,out-of-the-box;source;tree
(例如从;linux-x.x.x.tar.gz;档案其中之一)开始,再重新执行。
3.3.;砍掉;.orig;档案
只要做过几次修补以後,那些;.orig;的档案将会开始堆积。例如,我的一个;1.1.51
版的;tree;最後一次做清扫是在;1.1.48;版(我想是吧)。删除这些;.orig;档案会节
省许多的磁碟空间。″;find;.;-name;'*.orig';-exec;rm;-f;{};';';″将会替你照料
这件事。某些版本的修补档会用;tilde;来代替;.orig;。
有其它(更好的?)的办法可砍掉这些;.orig;档。用的最多的是以″;xargs;″来代替
″;-exec:;″″find;.;-name;'*.orig;|;xargs;rm;″或是″;find;.;-name;'*.orig'
-print0;|;xargs;--null;rm;--;″(後面这个比较安全。)。
3.4.;其它的修补档
总是会有一些并不是由;Linus;发行的其它修补档出现(我将称之为″非标准的″;)。
如果你使用了它们,;Linus;的修补档可能会而无法正确地执行,那麽你不是得将它们
还原就是得因此而去修改原始程序码或是修补档。这个工作对初学者通常是很讨厌,所
以,如果你对原始程序码没什麽研究,在使用;Linus;的修补档之前先还原这些非标准
的修补档。
然後你可以看看这些非标准的修补档是否仍然可以执行。如果不行的话,那麽你要不就
继续用旧的核心来修补以执行它们,要不就等别人发表能在你修补後的新核心上用的新
版非标准修补档。
非标准的修补档有多普遍?你有可能曾经听过它们。我使用;Bill;Paul;的不闪烁修补
档来;make;我虚拟控制台上的游标,因为我讨厌会闪烁的游标。就我所知,到目前为止
这个特别的修补档的最新版本是给;1.0;版的核心使用的,但是我仍然在;1.1.51;版下
使用它;—;我已经修改了它好几次,因为它通常会搞乱;Linus;修补档的;driver/char/
console.c;。
4.;附加的套件
你的;Linux;核心有许多在核心的原始程序码本身里面并没有说明的特性;这些特性一
般是经由外来的软体来利用,在这里列出一部分最普遍的:
4.1.;kbd
Linux;的控制台有著比你所能吃惊更多的特色。这包括切换字型,重新对映你的键盘,
切换显示模式(比较新的核心)的能力等等。kbd;这套软体里有能够让使用者做这些动
作的支援程序,还加上一大堆的字型以及几乎足以适用任何键盘的一些键盘对映表。
4.2.;hdparm
像很多软体一样,这曾经是一个核心修补档及其支援程序。这些修补档被公认为核心的
一部分,而用来最佳化以及调适你硬碟的支援程序一般是分开发行的。
5.;一些陷阱
5.1.;清除
如果你的新核心会做一些真的很奇怪的事(这曾经发生在我身上),有可能是因为你忘
了做清除(;make;clean;)。症状从你的核心不正常地崩溃到奇怪的输出入问题,一直
到可怜的执行效率等等不一而足,可以是任何事。最好也要确定你有做确认(;make
dep;)。
5.2.;巨大或缓慢的核心
如果你的核心占用了大量的记忆体,或者它真的是很大很大,也或者是即使用你全新的
486DX6/440;来编译却都还像是永远编译不完的话,那麽有可能是因为你配置了太多不
必要的东西(设备驱动程序,文件系统等等)。如果你不会用到某些东西,那就不要配
置它,因为它真的会占用记忆体。
如果你的记忆体少於;16;Megs;,确定你在″;limit;memory;to;low;then;16MB;″这个
问题上回答的是″;y;″。这会造成很大的不同(尤其是只有在;4;MB;的系统上)最明
显的症状是记忆体与磁碟之间异常大量的资料交换。如果你的磁碟发出很多噪音,检查
一下你的核心配置。
你可以找出你机器上全部记忆体的数量,然後减掉;/proc/meminfo;里面的″;total
mem;″或″;free;″指令所得的记忆体数量来得知核心使用了多少记忆体。你也可以执
行”;dmesg;”(或者也可以查看核心的记录档,它一定在会你的系统里)。看起来就
像这一行:
Memory:;15124k/16384k;available;(552k;kernel;code,;384k;reserved,;324k
data)
我的;386(配置很少垃圾)显示如下:
Memory:;7000k/8192k;available;(496k;kernel;code,;384k;reserved,;312k
data)
5.3.;核心没有编译
如果它没有被编译,那麽可能是有个修补档失败了,或者是你从某个地方拿到的原始程
式码有问题。也有可能是因为你的;gcc;版本不正确或坏掉了。确定;Linus;在;README
里所描述的符号链结都有正确建立。一般说来,如果核心没能编译,这表示在某些地方
有严重的错误。
5.4.;新版的核心似乎不能启动
没有执行;LILO;,或是没有正确的配置它。有一次我曾经碰到的问题是出在配置档里,
我用了″;root;=;/dev/hda;″而不是″;;root;=;/dev/hda1″(这在刚开始时真的是
很讨厌,但是一旦你有了一个可以用的配置档,应该不需要去再去改变它)
5.5.;你忘了执行;lilo;,或系统根本不能启动
噢!现在最好的办法是用磁片启动,并且准备另一张可以启动的磁片(像是”;make
zdisk;”时做的磁片)。你得知道你的根目录(;/;)所在的分割区以及它的格式(
second;extended,;minix;等等)在下面的例子中,你也得知道你的;/usr/src/linux
source;tree;在那个分割区,它的格式,以及它一般会挂在那儿。
在这个例子中,;根目录;/;是;/dev/hda1;,而持有;/usr/src/linux;的分割区是
/dev/hda3;,;一般会挂在;/usr;下。它们都是;second;extended;文件系统。可以运作
的核心映像叫做;zImage;,放在;/usr/src/linux;底下。
这个主意是这样的,假若有一个可以运作的核心映像叫做;zImage;在;/usr/src/linux
下,可能可以把它用在新的磁片上。另外一个不一定会更好的变通办法(这跟你的系统
怎麽组成的有关)在说明这个例子之後会讨论到。
首先,从;boot/root;磁片或者是;rescue;磁片开机,然後将持有可运作核心的分割区
挂上来:
mkdir;/mnt
mount;-t;ext2;/dev/hda3;/mnt
如果;mkdir;指令显示该目录已经存在,忽略掉不必理会它。现在,cd;到持有可运作核
心的地方(注意:;/mnt;+;/usr/src/linux;-;/usr;=;/mnt/src/inux;)。把一张格式
化过的磁片放进;a:;磁碟机,(确定不是你的;boot/root;磁片!),把映像档倾倒到
磁片里去,然後配置你的根目录分割区。
cd;/mnt/src/linux
dd;if=zImage;of=/dev/fd0
rdev;/dev/fd0;/dev/hda1
cd;到根目录;/;并且卸下标准;/usr;分割区:
cd;/
umount;/mnt
你现在应该可以从这张磁片正常的开机了。在这次开机後不要忘记执行;lilo;(或是其
它无论你曾经做错的什麽事)!
如同前面曾经提过的,还有另外一种很普遍的变通方式。如果情况是你有一个可以运作
的核心在放在;/;(例如;/vmlinuz;),你也可以使用它。假定所有的条件都跟上面的
例子一样,而我的核心映像是;/vmlinuz;,只要对上面的例子做这些改变:
把;/dev/hda3;改成;/dev/hda1(;/;分割区),把;/mnt/src/linux;改成;/mnt;,并且
把;if=zImage;改成;if=vmlinuz;。至於前面有关注意如何推导出;/mnt/src/linx;的那
个部分可以忽略。
5.6.;系统表示”;Warning:;bdflush;not;running”
这可以算是一个相当严重的问题。从;1.0;版以後的核心开始(我记不清楚确实的版本
了,但大概是在;1994;年;4;月,;20;日左右),有个会周期性地更新文件系统缓冲区的
程序叫做″;update;”被升级或取代掉了。
取得″;bdflush;″的原始程序码(你应该可以从你取得核心的地方找到),然後编译
它(你可能会希望在旧版的核心下执行编译及安装)。它会以″;update;″为名安装它
自己,而在此之後你的新核心应该会运作良好。
5.7.;系统显示关於;obsolete;routing;requests;的奇怪讯息
取得新版的;route;程序,并且重新编译旧的要件。;/usr/src/linux/route.h;(这是
/usr/src/linux;下的一个档案)已经做了修改。
6.;□诀和技巧
6.1.;重导;make;或是;patch;指令的输出
如果你想要记录这些″;make;″或是″;patch;″;指令到底做了些什麽,你可以把萤幕
的输出重导到一个档案去。首先,要知道你用的是是那一种;shell:″;grep;root
/etc/passwd″;然後寻找看起来像″;/bin/csh;″一类的东西。
如果你使用的是;sh;或是;bash;,″;(command);2>&1;|;tee;(output;file);。″将会
把一份;make;的输出放到″;(output;file);″这个档案去。
如果是;csh;或;bash,你应该使用″;(command);|&;tee;(output;file);″这个语法。
如果是;rc(注意:你应该不会是用;rc;),语法是″;(command);>[2=1]
|;tee;(output;file);。"
7.;;Misc
7.1.;;Author
The;original;revision;was;-0.1;on;3;October;1994;by;Brian;Ward
(ward@blah.tu-graz.ac.at).;;Please;send;me;any;comments,;additions,
corrections,;or;computers.;;Corrections;are,;in;particular,;the;most
important;to;me!
Even;though;I;try;to;be;attentive;as;possible;with;mail,;please
remember;that;I;get;a;lot;of;mail;per;day,;so;it;may;take;a;little
time;to;get;back;to;you.;Especially;when;emailing;me;with;a;question,
please;try;extra;hard;to;be;clear;and;detailed;in;your;message.;I'd
like;to;thank;everyone;who's;given;me;feedback.
7.2.;;History;and;other;forms;of;this;document
I;originally;wrote;this;in;ASCII,;then;I;put;some;TeX;around;it,;and
then;horrified;the;TeX;so;that;I;could;convert;the;TeX;into;SGML;with
a;perl;script.;Because;of;the;original;in;TeX,;the;first;version;of
this;document;that;appeared;on;sunsite;had;two;section;numbers;with
each;section;(It;wouldn't;have;looked;that;bad;if;they;weren't
different.).;;I;also;realize;that;it's;kind;of;nonstandard;to;make
revision;numbers;negative,;but;oh;well.;And;if;any;of;the;above;sounds
kind;of;stupid,;I;don't;blame;you.
7.3.;;To;do
The;``Tricks;and;tips'';section;is;a;little;small.;I;hope;to;expand;on
it;with;suggestions;from;others.
So;is;``Additional;packages.''
More;debugging/crash;recovery;info;needed.
7.4.;;Contributions
A;small;part;of;Linus';README;(Re:;kernel;hacking;options);is
inclusive.;;(Thanks,;Linus!)
uc@brian.lunetix.de;(Ulrich;Callmeier):;patch;-s;and;xargs.

quinlan@yggdrasil.com;(Daniel;Quinlan):;corrections;and;additions;in
many;sections.
nat@nataa.frmug.fr.net;(Nat;MAKAREVITCH):;mrproper
The;people;who;have;sent;me;mail;with;questions;and;problems;have;been
helpful,;too!

7.5.;;Copyright;notice;and;copying
Copyright;(c);Brian;Ward,;1994,;1995.
This;document;may;be;distributed;in;any;medium;as;long;as;it;and;this
notice;remain;unaltered.;Permission;is;granted;for;translation;into
any;language,;so;long;as;the;translator's;name;is;added;to;the
document.;There;is;no;warranty;on;this;document;and;its;contents;;no
one;may;be;held;liable;for;any;unfortunate;outcome;of;its;content.
Commercial;redistribution;is;allowed;and;encouraged;;however,;it;is
strongly;recommended;that;the;redistributor;contact;the;author;before
the;redistribution,;in;the;interest;of;keeping;things;up-to-date.;The
same;is;true;for;translations.

---------------------------------------------------------------------------

Linux;2.0;Kernel;Changes
---------------------------------------------------------------------------
[;简介;];;;[;目前版本;];;;[;升级须知;];;;[;如何得知目前程序的版本;]
[;该到哪里去抓这些更新档案;];;;[;其他;];;;[;後记;]
---------------------------------------------------------------------------
简介
******
这份文件包括一些;Linux;下重要;package;的最新版的资讯,希望能帮助初次
接触、升级为;kernel;1.3.xx;的使用者能成功无误的使用新的;kernel。希望
(虽;然我知道一定会希望落空的...);以後不会再看到有人问:『为什麽我的
make;不;能用了?』『怎麽;ps;aux;每次都出错?』.....
这份文件理论上应该是;Linux;kernel;Documentation/Changes
的翻译,不过能力有限,如果你发现有看不懂的
地方,建议还是翻翻原文吧....;:)
----------------------------------------------------------------------
目前版本
**********
-;Kernel;modules稳定版:;1.3.57,;测试版:;1.3.69k
-;PPP;daemon;;;;稳定版:;2.2.0f
-;Dynamic;linker;(ld.so)1.7.14
-;GNU;CC2.7.2
-;Binutils;;;;;;2.6.0.14
-;Linux;C;Library;;;;;;;稳定版:;5.2.18,;Beta;测试版:;5.3.12
-;Linux;C++;Library;;;;;2.7.1.4
-;Termcap;;;;;;;2.0.8
-;Procps0.99a
-;Gpm;;;1.09
-;SysVinit;;;;;;2.62
-;Util-linux;;;;2.5
----------------------------------------------------------------------
升级须知
**********
Network;errors
================
许多网络的;script;的初始设定会在启动的时候加个;route;到;localhost
(127.0.0.1),但是他们的方法错误。要解决这个问题,从你的网络设定档里面
找出;"route;add;-net;127.0.0.1";并改成;"route;add;-net;127.0.0.0";即
可。
这个问题出现在;Red;Hat;以及从其延伸出去的系统;(Ex:;Caldera)。如果
你正是使用这些系统,修改你的;/etc/sysconfig/network-scripts/ifup-lo,
将;"route;add-net;$(IPADDR)";这一行改成;"route;add;-net;127.0.0.0";即
可。
Booting;Changes
=================
kernel;1.3.xx;的;boot;程序做了些改善,现在你可以载入较大的;kernel
(bzImage),另外也可以直接由;loader;来启动;ramdisk;(initrd)。有关
initrd;的部份请参阅;Documentation/initrd.txt。如果想编译较大的
kernel,请使用;下列的;make;参数:bzImage,;bzlilo,;bzdisk;(各相当於
zImage,;zlilo;和;zdisk)。如果你想使用这项新功能,你必须升级你的
bootloader。LILO;请升级;为;0.19;(lilo.19.tar.gz),loadlin;请升级到;1.6
(lodlin16.tgz)。如果你使;用的是罕见的;SysLinux;或是
etherboot,最新版本分别为;1.3;和;2.0。
C;Library
===========
Linux;最新的稳定版;C;library;是;5.2.18,如果你从;5.0.9;之前版本升级
为这个版本,请一定务必必须阅读;release.libc-5.2.18,因为;make;及一些重
要工具可能因升级而无法正常工作。
目前正在;beta;的版本则是;5.3.12。这版本有些重大改变,一些有□的程序
可能会遭遇麻烦;(以前的版本用;free();来处理不是由;malloc()
传回的指标没有;问题,但是新版的;library;就有麻烦了),因此请先仔细阅读
release.libc-5.3.9!;新版的;library;更正了;dirent;的;bug;--;如果有
define;USE_GNU;的话,将会错将;d->reclen;定义为;d->namlen,但是有些;GNU
package;却是以错为正,例如;GNU;make;3.xx。要更正这项错误你必须;path
後重新;compile。(release.libc-5.3.9;中有;make;的;patch
以及何处可取得编译好的;binary)
另外,libc-5.3.x;有保全的漏洞,而;libc-5.3.12;已经补好这个洞。因此如果
你要使用测试版的;library,请记得使用;5.3.12;版。
如果你遇到以下的错误讯息:
`fcntl_setlk();called;by;process;123;with;broken;flock();emulation'
你也必须升级到;5.2.18;版。1.3.x;版;kernel;增加了;BSD;形式的;flock;系
统呼叫,如果你使用旧版的;library
就会有这个错误讯息。不过这讯息一点影响
也没有,因此你可以忽略不管。如果你觉得这个讯息很烦,那就升级你的
library;吧。如果你又烦又懒,那直接把;kernel;fs/locks.c;里面的
printk(KERN_WARNING;"fcntl_setlk();called;by;process;%d;with;broken
flock()
emulationn",;current->pid);
去掉然後重新;compile。如果你是使用;aout;格式,你可以升级成;libc-4.7.6
来解决这个问题。
Termcap;Library
=================
目前;Termcap;的版本是;2.0.8。如果你升级成这个版本,请阅读;README,
取得有关;tegtent;函式更改的重要讯息。
Procps;Utility
================
kernel;1.3.x;的;/proc;结构已经改了,因此你必须将;proc;升级为;0.99a;版
而在最新的;kernel;中,档案结构又再次更改,但是;procps
还没有个正式升级版;反应这个改变,所以还是使用;0.99a
吧。你也可以找找流传在外解决让;0.99a;可以;和;kernel;1.3.94;相容的
patch。
Kernel;Modules
================
kernel;1.3.x;版几乎已经全部模组化了,也加入了;kerneld。想使用个功能,
你必须更新到最新版的;modules。目前最新的稳定版;modules;是;1.3.57
(注),;beta;版则到了;1.3.69k。这些都可以在你抓;kernel
的同一地点取得,或是到;它的
Homepage:http://www.pi.se/blox/modules/index.html。注意:如果你载入
modules;会出现以下的讯息:
gcc2_compiled,;undefined;Failed;to;load;module!
The;symbols;fromkernel;1.3.foo;don't;match;1.3.foo
那就是该换到;1.3.69;的时候了。会出现这个错误是因为你使用最新版的
binutil,因此大部份的人还是停留在;1.3.57;即可。
另外一点要注意的,你不能同时把;a.out;和;ELF;支援编译成;modules,否则
当你为了能够使用;insmod;而用;insmod;来载入;a.out/ELF;modules;时会有
Catch/22;状况发生;(这是啥啊?)如果你的系统主要是;ELF;而你偶尔会需要用到
a.out,你可以把;a.out;支援编译为;modules,否则你最好把它直接放入
kernel;之中。如果你还没进入;ELF;的世纪;(不会吧..),在;compiler;kernel
时可以;直接把;ELF;支援去掉。另外的另外,在开机就会;mount;上来的
partition;的;FS;、device;driver;记得要;compiler;进
kernel,不能把它弄成;modules。请不要;夸张到为了完全模组化而忘了把
ext2fs;和;IDE;dirver;compiler;进;kernel;里...
*注:在;kernel;目录下已经可以看到;2.0.0;版的;modules;了
PPP;driver
============
你的;pppd;必须是;2.2.0;版或更新。最新的稳定版本是;2.2.0f;可以在
ftp://sunsite.unc.edu/pub/Linux/system/Network/serial/ppp/ppp-2.2.0f.tar.gz
取得。
Named;pipes;(SysVinit)
========================
Linux;处理;named;pipes;的方式改变了;(从;SunOS;方式变成;"正确";的方式)
,这使得某些程序因此而失效了,最值得注意的就是;SysVinit。如果你的
SysVinit;是;2.59;或更早的版本,在;shutdown
时虽然可以正常工作,但是你会看到这样;的错误讯息:INIT:;error;reading
initrequest;或是这些字不停的在卷动...
如果你使用;NCSA;的;httpd,你必须把;daemon;的;pre-spawn;设为;0,不过我
建议你直接换成;Apache;的;httpd。
新的;named;pipes;方式也让;Hylafax;发生问题,如果你有;Hylafax;daemon,
它会不断用掉;CPU;time;直到系统没有;idle;time
为止。要修正这个错误,修改;Hylafax;的;port.h,把
CONFIG_OPENFIFO="O_RDONLY"
改成
CONFIG_OPENFIFO="O_RDWR"
类似的处理方式;(把;named;pipe;开启方式从;read;only;改成;read/write)
可以解决因这个改变引起的问题。
File;Locking;(Sendmail)
=========================
从;pre2.0.6;(1.99.6);以後,file;locking;方式不能够混用,例如:你不能
同时使用;flock;和;fcntl;来锁住档案。请参阅;Documentation/lock.txt
取得更;详细资料。这个对较旧版的;sendmail;造成影响;(注)。如果你发现
sendmail;抱怨;无法;lock;aliases.dir;(或其他档案),你必须更新;sendmail
到;8.7.x;版。最;新版的;sendmail;可以在
ftp://ftp.cs.berkeley.edu/ucb/src/sendmail/sendmail.8.7.5.tar.gz
取得。
*注:这个问题在;elm;2.4;pl;25;之中也会发生。
Uugetty
=========
旧版的;uugettys;在新;kernel;里会有问题,请更新之。
ftp://sunsite.unc.edu/pub/Linux/system/Serial/getty_ps-2.0.7h.tar.gz
Kbd
=====
使用非;ASCII;的字元/字型的人,应该升级成:
ftp.funet.fi:/pub/OS/Linux/PEOPLE/Linus/kbd-0.91.tar.gz
*注:这个我也不太了解,不过我没升级好像也没事....
Console
=========
Linux;的;console;type;(虽然知道是什麽东西可是不会翻);改变了。如果
你的版本太旧了,使用上发生问题;(像说;joe;不能用啦...),该是升级
termcap;的时候了。要修正这个问题,把;linux;加入;/etc/termcap
之中,或是到
http://www.ccil.org/~esr/ncurses.html
逛逛。另外你也需要更新;terminfo。以;root;来做下面的动作:
ln;-s;/usr/lib/terminfo/l/linux;/usr/lib/terminfo/c/console
当然,最好的解决办法,就是去抓最新的;termcap;回来安装:
ftp://sunsite.unc.edu/pub/Linux/GCC/termcap-2.0.8.tar.gz
Also,;the;console;driver;is;now;responsible;for;keeping;track;of
correspondence;between;character;codes;and;glyph;bitmaps.;If;you
encounter;problems,;try;`loadunimap;def';to;get;back;the;default
correspondence.;(不太会翻,大概是说如果你的萤幕本来应该显示文字的确
变成一堆乱码的话,可以用;loadunimap;def;来解决)
Hdparm
========
Hdparm;为了利用到新版;kernel;的新功能而作了更新,最新版可以在:
ftp://sunsite.unc.edu/pub/Linux/kernel/patches/diskdrives/hdparm-2.7.tar.gz
抓到。(目前已经有看到;2.9;版了)
IP;Accounting
=============
All;IP;packets;coming;in;or;going;out;via;one;of;the;network
interfaces;are;now;passing;the;accounting;chain.;So,;packets;being
forwarded;are;passing;this;chain;twice.;Since;pre2.0.7;(aka;1.99.7),
accounting;rules;can;be;defined;so;that;they;will;only;match;in;one
direction;(either;incoming;or;outgoing).
There;also;exists;a;possibility;to;match;on;device;names;and/or;device
addresses,;so;that;only;packets;coming;in/going;out;via;that;device
(network;interface);match;with;a;rule.;You'll;need;to;get;ipfwadm;from
ftp://ftp.xos.nl/pub/linux/ipfwadm/ipfwadm-2.1.tar.gz;to;use;this.
IP;Firewalls
============
The;IP;firewall;code;has;been;changed;drastically;during;1.3.x.;There
are;now;3;categories;of;firewall;rules:;one;for;incoming;packets,;one
for;outgoing;packets,;and;one;for;packets;being;forwarded.;There;also
exists;a;possibility;to;match;on;device;names;and/or;device;addresses,
so;that;only;packets;coming;in/going;out;via;that;device;(network
interface);match;with;a;rule.;This;is;especially;useful;to;prevent
spoofing.;You'll;need;to;get
ftp://ftp.xos.nl/pub/linux/ipfwadm/ipfwadm-2.1.tar.gz;to;use;this.
IP;Masquerading
===============
IP;masquerading;is;now;part;of;the;standard;kernel.;However,;you
always;need;to;load;separate;modules;(ip_masq_ftp.o;and/or
ip_masq_irc.o);if;you;are;going;to;use;FTP;or;IRC;in;combination;with
masquerading.;You'll;need;to;get
ftp://ftp.xos.nl/pub/linux/ipfwadm/ipfwadm-2.1.tar.gz;to;use;this.
(不清楚、不了解、不会用,还是不要乱翻...;不过看起来都跟
ipfwadm-2.1.tar.gz;有关...)
ISDN;support
==============
新版的;kernel;支援;ISDN,要使用;ISDN;你必须有:
ftp://ftp.franken.de/pub/isdn4linux/isdn4k-utils-1.3.97.tar.gz
Term;is;broken
================
Term;(一个功能类似;slirp;的东西);在;kernel;1.3.60;以後就无法使用
了,偏偏作者现在正在渡假中,因此没有解决的方法。我建议你学著改用
slirp。
Networking
============
/proc/net;里有些栏位在新;kernel;里改变了,你必须升级你的;net-tools。
目前最新的稳定版是;net-tools-1.2.0.tar.gz,而最新的;beta;则是
net-tools-1.32-alpha.tar.gz。如果你要升级,或许升级为最新的;beta
版会比;较好。
Xntpd
=======
旧版的;Xntpd;和新版的;kernel;合不来,请升级为;xntp3.5f.tar.Z
Sound;driver
==============
1.3.x;版;kernel;里的;sound;driver;会让;vplay;无法使用。要解决这个
问题请抓新版的;sndkit:
ftp://ftp.best.com/pub/front/tasd/snd-util-3.5.tar.gz
有些使用者回报说许多音效工具程序;(Ex:;cdd2wav-sbpcd);必须重新;compile
才能在新版的;kernel;下使用。
Tcsh
======
如果你的;tcsh;在新的;kernel;下举止怪异,请从
ftp://anise.ee.cornell.edu/pub/tcsh
抓新版的;tsch;source,并修改;config_f.h;加入一行:#define;SYSMALLOC
你可以在
ftp://sunsite.unc.edu/pub/Linux/system/Shells/
抓到新版的;binary,这应该会更正这个问题。
Make
======
如果更新之後;make;却罢工了,请仔细阅读你更新的;libc;的;release;note。
这并不是;kernel;的错,不过很多却误以为是。当你更新;libc;到;5.3.9;时你
也要更新;make;它才会正常工作。升级;libc;也可能让;xterm
罢工,如果这不幸;是个事实,请重新;compile;xterm。
Loop;device
=============
1.3.x;的;kernel;有个;loop;device,让你可以把一个档案;mount;成一个;file
system,然後你可以作些有趣的事情,像是加密的文件系统(encrypted;file
systems)...;如果你想使用这个功能,你必须更新你的;mount:
ftp://ftp.win.tue.nl/pub/linux/util/mount-2.5X.tar.gz
加密的文件系统可以抓:
ftp.funet.fi:/pub/OS/Linux/BETA/loop/des.1.tar.gz
Multiple;device
=================
新的;kernel;有支援;Multiple;device;(让你可以把好几个;partition;结合成
一个;logic;device)。要使用这个功能请抓:
ftp://sweet-smoke.ufr-info-p7.ibp.fr/pub/Linux/md034.tar.gz
Arp
=====
Arp;daemon;也加入新的;kernel;之中,请到:
http://www.loran.com/~layes/arpd/index.html
取得更多资讯以及;arpd。
Quota
=======
新的;kernel;之中也支援;quota。请抓:
ftp://ftp.funet.fi/pub/Linux/PEOPLE/Linus/subsystems/quota/all.tar.gz
然後把里面的;mntent.h;盖过;/usr/include/mntent.h,如此就可以快乐的
compile;出;quota;来啦。
Process;Accounting
====================
Process;accounting;的功能也包含在新版的;kernel;之中。要使用这个
功能请抓:
ftp://iguana.hut.fi/pub/linux/Kernel/process_accounting/acct_1.3.73.tar.gz
Bdflush
=========
bdflush;功能已经加入新;kernel;之中,你不需要再去;patch;就可以
直接拥有这个功能。
AMP
=====
新的;kernel;之中直接支援;AMP;(Advanced;Power;Management)。AMP;主要
使用在膝上型电脑,让你监视目前电池的使用状况,也可以帮你节省电池的电力
。要发挥这项功能请抓:
ftp://tsx-11.mit.edu/pub/linux/packages/laptops/apm/apmd-2.4.tar.gz
iBCS;and;DOSEMU
=================
要支援;1.3.x;的;iBCS,请抓:
ftp://tsx-11.mit.edu/pub/linux/BETA/ibcs2/ibcs-1.3-960404-ALPHA.tar.gz
至於可在新;kernel;中使用的;DOSEMU,请抓:
ftp://tsx-11.mit.edu/pub/linux/ALPHA/dosemu/Development/dosemu-0.63.1.19.tgz
记得照;README.newkernel;里面所说的更新你的;/usr/include/sys/vm86.h,
否则将无法;compile。
Mtools;and;Fdutils
====================
在;1.3.x;kernel;之中,软碟的控制程序已经改变,但是为了向前相容,在;2.0
之前的;kernel;旧的程序还是可用,不过会显示警告讯息,但是到;2.1.x;时
旧程序将完全消失。
为了避免问题;(或说是免除那恼人的讯息),你必须重新编译所有会用到软碟
控制的程序,像是;mtool;及;fdutil。请抓:
ftp://sunsite.unc.edu/pub/Linux/utils/disk-management/mtools-3.0.src.tar.gz
ftp://sunsite.unc.edu/pub/Linux/system/Misc/fdutils-4.3.src.tar.gz
在将来,fdformat;将会完全消失,所以请仅早学会;superformat;的使用方法。
----------------------------------------------------------------------
如何得知目前程序的版本
************************
GNU;CC:;;gcc;-v;and;gcc;--version
PPP:;;;;;pppd;-h;(wrong;but;it;show;the;version)
Libc:;;;;ls;-l;/lib/libc.so.5
Libc++:;;ls;-l;/usr/lib/libg++.so
Binutils:ld;-v
ldd:;;;;;ldd;-v;and;ldd;-V
termcap:;ls;-l;/lib/libtermcap.so.*
modules:;insmod;-V
procps:;;ps;--version
----------------------------------------------------------------------
该到哪里去抓这些更新档案
**************************
请爱用;CCCA;ftp;及;ARCHIE.....
----------------------------------------------------------------------
其他
******
以上提到的这些档案在台湾的;ftp;server;上面都找得到,请自行用;archie
搜寻。珍惜有限的频宽,尽量避免出国.....;如果你的系统是;Red
Hat,大部份的更新都有;RPM;可用。安装之前先到;Red;Hat;的;mirror;site
看看。注意,你可能要用;-force;参数才能完成这些;升级。
如果你发现有软体在;kernel;1.3.x;上面无法正常工作的,或是那些;kernel
的功能需要另外抓别的套件来使用的,请;mail;给;Chris;Ricker
(gt1355b@prism.gatech.edu)。;如果你发现翻译上有任何误谬,请;mail;给
Dinosaur.bbs@bbs.ee.nthu.edu.tw

标签: linux