荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (Welcome to InstallBBS,Linux!), 信区: Linux
标  题: Kernel Howto
发信站: 荔园晨风BBS站 (Wed Dec 19 20:19:14 2001), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjk.bbs@bbs.nju.edu.cn 所发表 】
发信人: altmayer (alt), 信区: LinuxUnix
标  题: Kernel Howto
发信站: 南京大学小百合站 (Wed Dec 19 08:33:30 2001), 站内信件

【 以下文字转载自 altmayer 的信箱 】
来  源: 202.112.17.137

寄信人: guest.bbs@hgluo.hust.edu.cn

发信人: asdchen.bbs@cis.nctu.edu.tw (Victor), 信区: Linux
标  题: Kernel Howto


原始文件:The Linux Kernel HOWTO
          by Brian Ward, ward@blah.tu-graz.ac.at
          version 0.2, 3 Jan 1995
档案叙述:如何编译核心
文件编号:LRG.LDTP.HOWTO.001
翻译日期:1995/08/20
翻译维护:asdchen@pc2.hinet.net                                  O
---------------------------------------------------------------X---
                                                                 O
这是一份关於如何配置、编译以及升级核心的详细指引

1. 简介

这是 Kernel-HOWTO 的第 0.2 版,这份文件是否是你所需要的?如果你有下列任何症
状之一的话,是的:

。″哎呀!这套 wizzo-46.5.6 软体说它需要 1.1.193 版的核心,而我却仍然只有
  1.0 版!″

。比较新的核心之一□面有你正好需要的一个设备驱动程式。

。你对於如何编译核心真的一无所知。

。″在 README 档案里面的就是全部的资料了吗?″

。你来,你试,它征服你。

。你知道如何编译以及安装核心,而其它人似乎也知道,但是他们还是一直哀求你帮忙

  安装他们的核心。

1.1. 假设

这份文件中的某些□例假设你有 GNU tar,find 以及 xargs 。这些是 Linux 套件□
的标准工具。文件中也假设你知道你所用的档案系统架构,如果你并不知道,最好赶快

写下一份 mount 指令在系统正常运作下,所显示的结果作为参考(或者是一份
/etc/fstab 的列表,如果你能够看得懂)。这些资讯很重要,而且,除非你重新分割
或加入新的磁碟,重新安装你的系统以及做诸如此类的操作,否则它们不会变动。

2. 一些经常比其它东西更早出现的问题

2.1. 不管怎麽样,核心到底是做什麽的?

在 Unix 系统中,核心处理许多事情。首先,它为所有执行中的程式(程序)做记忆体

管理,并且确保它们都能够平均(或不平均,可以视情况而定)的分享处理机的运算资

源。此外,它还提供了一个良好的介面让刚刚提到的程式能透过它与你的硬体沟通。

就是这样吗?其实核心所处理的工作比这还要更复杂一些,不过将不会在这里做更进一

步的讨论。

2.2. 我为什麽更新核心?

比较新的核心一般来说会提供更强的能力来与更多种奇奇怪怪的硬体沟通(ie. 它们拥

有更多的设备驱动程式),它们能够有更好的程序管理,它们能够执行的比旧的版本更

有效率,它们可能比旧的版本来的更稳定,而且它们修正了旧版□的一些错误。大部分

的人是因为他们需要那些新的设备驱动程式以及错误修正的部份而更新核心。

2.3. 较新的核心支援那些硬体?

请看 Hardware-HOWTO 文件。另一个方法是,你可以查看 linux 原始程式码中的
″ config.in ″档,或者就在当你试著去″ make config″ 时找出来。″ make
 config ″将会让你看到标准的核心原始程式码支援的所有硬体,但这并不是 linux
所支援的全部硬体;许多普遍的设备驱动程式(像是 PCMCIA 驱动程式以及某些磁带机

的驱动程式)是个别维护及发行的可载入模组。

2.4. 我需要那个版本的 gcc 或是 libc ?

Linus 对这个问题的建议放在 linux 原始程式的 README 档案□头。如果你没有该版
本或是更新的版本,新版的 gcc 应该会告诉你是否需要更新 libc 的版本。这两个操
作都不会有什麽问题,只要照著说明做就可以了。

2.5. 什麽是可载入模组?

它们是核心的一部分(通常是设备驱动程式),但是并没有编译到核心里面去。它们被

分别编译,然後几乎可以在任何时候插入运作中的核心或从中取出。这已经成为一种增

加东西到核心里去的较好方式,因为明显地更为模组化。许多常用的设备驱动程式,例

如 PCMCIA 驱动程式以及 QIC-80/40 磁带机的驱动程式就是可载入模组。

2.6. 我需要多大的磁碟空间?

这跟几件事有关。首先,压缩过後的 linux 原始程式码在 1.1.45 版时约占 1.66
megs 。你将会常常想要在手边保留一份。解压缩以後这将占掉约 8 megs 。但这还不
是全部 — 你将会需要更多的磁碟空间来实际编译这些东西。这与你配置多少垃圾到你

的核心里头去有关。例如,在我的 386 上,我有网路,the 3Com 3C503 的驱动程式,

并且配置了 5 种档案系统,而这全部共需要 16.2 megs。

加上压缩过的 linux  原始程式码以後,这个配置大概需要用掉你 18 megs 。在另外
一个系统上,这次不需要支援网路设备(但仍然需要支援网路),加上音效卡,共需要

12 megs 左右。所以,一般来说,如果你有许多种硬体设备的话,确定你有足够的硬碟

空间来容纳这个配置。

2.7. 这需要多久的时间?

对大部份的人而言,答案是″ 很久 ″。你的处理机速度有多快,以及你拥有的记忆体

数量有多少将是决定所需时间的主要因素,但是,在把多少东西配置到核心里头去这方

面还是可以做点努力。在一台有 16 megs 记忆体的 486DX4-100 笔记型电脑上,一个

有 5 种档案系统、支援网路、以及音效卡驱动程式的核心可以在 20 分钟以内完成。

类似的配置,在一台 386DX/40( 8 MB 记忆体)上大约需要要 1.5 个小时。(题外话

:我知道有人用 386SX/16 以及 4 MB 的记忆体来编译他的核心,花了一整个晚上,通

常还会更久,是的,我已经劝他去换一台真正的电脑。)

3. 要怎麽进行核心的配置?

3.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 上,试著到那边去找点帮助。

3.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 档案等等等诸如此类的工作。

3.3. 配置核心

注意:这部份内容有些是重覆 Linus 的 README 档案中的相应章节或加以修订。

在 /usr/src/linux 下执行″ make config ″ 这个命令将会启始一个指令稿,而这个

指令稿会问你各种问题。它需要 bash ,所以要确定 bash 是 /bin/bash,/bin/sh 或

$BASH 。

你现在该准备好回答这些问题,通常用″ y ″或″ n ″就可以了。有一些很明显或是

不重要的选项将不会在此加以说明。

3.3.1. Kernel math emulation (核心的浮点运算模拟)

如果你没有数学辅助运算处理机(ie,你只有一台单纯的 386 或 486SX ),那麽你在

这里要回答″ y ″。如果你已经有数学辅助运算处理机却还回答″ y ″,那也不必太

担心 — linux 还是会去使用它而忽略掉核心的模拟程式。唯一的影响是编译出来的核

心变大了。

3.3.2. Normal harddisk support (标准硬碟支援)

你在这里差不多都得回答″ y ″。它代表的意思是核心将会支援标准的 PC 磁碟,例
如大多数人使用的 IDE 界面硬碟。这不包括 SCSI 设备的支援。

3.3.3. Networking support (网路支援)

如果你有连接网路,譬如说,你与 internet 有连线,或是你将使用 SLIP,PPP,term

或其它方式拨接到 internet 上的话,回答″ y 。″

3.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 ″了。

3.3.5. Use -m486 flag for 486-specific optimizations
       (使用 -m486 旗标指定对 486 做最佳化)

这将会为核心做 486 最佳化处理。新的核心将会变得稍微大一些,如果你担心的话的
话,其实它还是可以在 386 上执行。只是会比较慢,不过你感觉不出来的。

3.3.6. SCSI support (SCSI 的支援)

如果你有 SCSI 设备,那麽就回答” y 。”接著会有提示要求更进一步的资讯,像是
你是否要支援光碟机,磁碟机,还有你使用的是那一种 SCSI 介面卡。这部份请参阅
 SCSI-HOWTO ,有更详细的说明。

3.3.7. Network device support (网路设备支援)

如果你有乙太网路卡,或者你想要使用 SLIP,PPP,或是并列埠界面卡,那就回答
″ y ″,接著会有提示问你使用的是那一种网路卡,或要使用那一种串列通讯协定。

3.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 的分割区而设的。

3.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 ″。它会给你一份目前使

用的核心所支援的档案系统列表。

3.3.9. Character devices (字元设备)

在这里,你将会发现许多设备名称,用来设定你的印表机,汇流排滑鼠,PS/2 滑鼠(
大部分笔记型电脑使用内建的 PS/2 滑鼠),以及一些磁带机驱动程式,selection 。

当有合适的选项时,回答” y ”。

注意:” Selection ”让你能够执行一个程式,这个程式使你可以在 X-windows 之外

使用滑鼠在各个虚拟控制台间做剪贴的动作。如果你有串列滑鼠的话,这真的很棒,因

为它与 X-windows 之间的沟通良好,然而在编写这份文件的时候,它跟 PS/2 滑鼠还
是处不来(它会锁住滑鼠所使用的埠,使得你在杀掉这个 selection 程序之前都不可
能执行 X-windows 。)。

3.3.10. Sound card (音效卡)

如果你对於让隔壁的人保持清醒有兴趣的话,回答″ y ,″然後等一下会有一个配置
程式编译并详细询问你所有关於你的音效卡的问题。

3.3.11. kernel hacking

>这是从 Linus 的 README 里摘录的:

″ kernel hacking ″配置的细节通常会产生一个更大或是更慢的核心(或者是又大又

慢),而且可能因为将一些常式配置成很活跃地去尝试中断一些不良的程式码以便找出

核心里的问题( kmalloc() ),而使得核心变得比较不稳定。所以要产生一个核心″
产品 ″的话,你在这里应该回答″ n ″。

3.4. 现在呢?( The Makefile )

    现在应该会有一个讯息告诉你核心已经配置好了,以及要你去″ check the
    top-level Makefile for additional configuration,”等等。

    所以查看一下 Makefile。你应该不必改变它,但是看看无妨。一旦新核心完成,
    你也可以用″ rdev ″指令来改变其中的选项。

4. 编译核心

4.1. 清除与确认

当用来进行配置的指令稿执行完成时,它会告诉你去做″ dep ″跟″ clean 。”所以

要执行″ make dep 。″除非你的电脑真的很慢,否则它不会花太久时间的。Making
depend 确定你已经具备所有必需的要件,像是含入档以及诸如此类的东西。当它完成
後(你也可以在″ make dep ″之前执行它),执行″ make clean 。″这会清除核心

编译的所有目的档以及其它东西。不要忘记这个步骤。

4.2. 编译时期

在执行清除与确认工作之後,你现在可以执行″ make ″或是″ make zdisk 。″
″ make ″将会编译核心,并且留给你一个叫做″ zImage ″的档案(这一类的东西)

。这就是新的核心。″ make zdisk ″做的事也一样,但是它会把核心放到你所希望的

磁片去,只要把这张磁片放在 a:。” zdisk ”对於测试新核心很方便;如果它完全
不行,只要把磁片拿掉再用旧的核心启动即可。

如果你意外地删除了核心或是什麽的,它也是个方便的启动办法。当你把一台磁碟的内

容倾倒到另外一台去时,你也可以用它来安装新的系统(除了这些之外还有更多用途!

NOW how much would you pay ?)。

所有近来的核心都是压缩过的,所以有个” z ″在名字前面。核心是压缩过的,当它
执行的时候会自动将自己解压缩(一个节省磁碟空间的好方法)。

4.3. 其他可以″ make ″的东西

″ make mrproper ″将会做更广泛的″清除″。这个动作有时候是必须的,所以你可
能会希望在每次修补的时候执行它。″ make zlilo ″将会安装核心,然後对它执行
LILO ,使你完成所有开机的准备,但是这只有在 lilo 已经以下列这种方式配置好的
时候才可以:核心为 /vmlinuz , lilo 在 /sbin 下,而且与你的 lilo 配置一致。

4.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 (在发生了某些令人不愉快的事情的情况下)。

5. 修补核心

5.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 里
都有很详细的描述。

5.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 档案其中之一)开始,再重新执行。

5.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 -- ″(後面这个比较安全。)。

5.4. 其它的修补档

总是会有一些并不是由 Linus 发行的其它修补档出现(我将称之为″非标准的″ )。

如果你使用了它们, Linus 的修补档可能会而无法正确地执行,那麽你不是得将它们
还原就是得因此而去修改原始程式码或是修补档。这个工作对初学者通常是很讨厌,所

以,如果你对原始程式码没什麽研究,在使用 Linus 的修补档之前先还原这些非标准
的修补档。

然後你可以看看这些非标准的修补档是否仍然可以执行。如果不行的话,那麽你要不就

继续用旧的核心来修补以执行它们,要不就等别人发表能在你修补後的新核心上用的新

版非标准修补档。

非标准的修补档有多普遍?你有可能曾经听过它们。我使用 Bill Paul 的不闪烁修补
档来 make 我虚拟控制台上的游标,因为我讨厌会闪烁的游标。就我所知,到目前为止

这个特别的修补档的最新版本是给 1.0 版的核心使用的,但是我仍然在 1.1.51 版下
使用它 — 我已经修改了它好几次,因为它通常会搞乱 Linus 修补档的 driver/char/

console.c 。

6. 附加的套件

你的 Linux 核心有许多在核心的原始程式码本身里面并没有说明的特性;这些特性一
般是经由外来的软体来利用,在这里列出一部分最普遍的:

6.1. kbd

Linux 的控制台有著比你所能吃惊更多的特色。这包括切换字型,重新对映你的键盘,

切换显示模式(比较新的核心)的能力等等。kbd 这套软体里有能够让使用者做这些动

作的支援程式,还加上一大堆的字型以及几乎足以适用任何键盘的一些键盘对映表。

6.2. hdparm

像很多软体一样,这曾经是一个核心修补档及其支援程式。这些修补档被公认为核心的

一部分,而用来最佳化以及调适你硬碟的支援程式一般是分开发行的。

7. 一些陷阱

7.1. 清除

如果你的新核心会做一些真的很奇怪的事(这曾经发生在我身上),有可能是因为你忘

了做清除( make clean )。症状从你的核心不正常地崩溃到奇怪的输出入问题,一直

到可怜的执行效率等等不一而足,可以是任何事。最好也要确定你有做确认( make
dep )。

7.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)

7.3. 核心没有编译

如果它没有被编译,那麽可能是有个修补档失败了,或者是你从某个地方拿到的原始程

式码有问题。也有可能是因为你的 gcc 版本不正确或坏掉了。确定 Linus 在 README
里所描述的符号链结都有正确建立。一般说来,如果核心没能编译,这表示在某些地方

有严重的错误。

7.4. 新版的核心似乎不能启动

没有执行 LILO ,或是没有正确的配置它。有一次我曾经碰到的问题是出在配置档里,

我用了″ root = /dev/hda ″而不是″  root = /dev/hda1″(这在刚开始时真的是
很讨厌,但是一旦你有了一个可以用的配置档,应该不需要去再去改变它)

7.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 的那

个部分可以忽略。

7.6. 系统表示” Warning: bdflush not running”

这可以算是一个相当严重的问题。从 1.0 版以後的核心开始(我记不清楚确实的版本
了,但大概是在 1994 年 4 月, 20 日左右),有个会周期性地更新档案系统缓冲区的

程式叫做″ update ”被升级或取代掉了。

取得″ bdflush ″的原始程式码(你应该可以从你取得核心的地方找到),然後编译
它(你可能会希望在旧版的核心下执行编译及安装)。它会以″ update ″为名安装它

自己,而在此之後你的新核心应该会运作良好。

7.7. 系统显示关於 obsolete routing requests 的奇怪讯息

取得新版的 route 程式,并且重新编译旧的要件。 /usr/src/linux/route.h (这是
/usr/src/linux 下的一个档案)已经做了修改。

8. □诀和技巧

8.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) 。"

9.  Misc

9.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.

9.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.

9.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.

9.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!


9.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

--
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 211.80.41.106]

--


※ 来源:.南京大学小百合站 bbs.nju.edu.cn [FROM: 202.112.17.137]
--
※ 转载:.南京大学小百合站 bbs.nju.edu.cn.[FROM: 211.80.41.106]
--
※ 转寄:.南京大学小百合站 bbs.nju.edu.cn.[FROM: 深圳大学BBS]
--
※ 修改:·jjksam 於 Dec 19 20:22:18 修改本文·[FROM: 192.168.0.146]
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店