当前位置:Linux教程 - Linux文化 - 内核的编译

内核的编译


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 ([email protected]). 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!)

[email protected] (Ulrich Callmeier): patch -s and xargs.

[email protected] (Daniel Quinlan): corrections and additions in many sections.

[email protected] (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 CC 2.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 - Procps 0.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() emulation\n", 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 ([email protected])。 如果你发现翻译上有任何误谬,请 mail 给 [email protected]