当前位置:Linux教程 - Linux - Kernel HOWTO

Kernel HOWTO



        

    作者: Brian Ward [1][email protected]
    译者: [2]C.W.Huang & [3]Asd L. Chen

    v0.80, 26 May 1997. 翻译日期: 25-29 August 1997
    _________________________________________________________________

    这是一份关於如何配置、编译、升级核心以及排难解纷的详细指引.
    _________________________________________________________________

    1. 简介

    * 1.1 请先看此!
    * 1.2 文章风格说明

    2. 重要问题与解答

    * 2.1 不管怎麽样,核心到底是做什麽的?
    * 2.2 我为什麽要更新核心?
    * 2.3 较新的核心支援那些硬体?
    * 2.4 我需要那个版本的 gcc 或是 libc ?
    * 2.5 什麽是可载入模组?
    * 2.6 我需要多大的磁碟空间?
    * 2.7 这需要多久的时间?

    3. 如何真正进行核心的配置?

    * 3.1 取得原始程式码
    * 3.2 解开原始程式码的包装
    * 3.3 配置核心
    * 3.4 现在呢? (The Makefile)

    4. 编译核心

    * 4.1 清除与确认
    * 4.2 编译时期
    * 4.3 其他可以``make\\的东西
    * 4.4 安装核心

    5. 修补核心

    * 5.1 使用修补档
    * 5.2 如果有错误发生
    * 5.3 砍掉 .orig 档案
    * 5.4 其它的修补档

    6. 附加的套件

    * 6.1 kbd
    * 6.2 util-linux
    * 6.3 hdparm
    * 6.4 gpm

    7. 一些陷阱

    * 7.1 make clean
    * 7.2 巨大或缓慢的核心
    * 7.3 核心无法编译
    * 7.4 新版的核心似乎不能启动
    * 7.5 你忘了执行 LILO,或系统根本不能启动
    * 7.6 系统表示 `warning: bdflush not running\
    * 7.7 系统说 undefined symbols 而且无法编译
    * 7.8 无法让我的 IDE/ATAPI CD-ROM 正常工作
    * 7.9 系统显示关於 obsolete routing requests 的奇怪讯息
    * 7.10 防火墙功能无法在 1.2.0 上工作
    * 7.11 ``Not a compressed kernel Image file\\ (非压缩核心映像档)
    * 7.12 升级至 1.3.x 後在控制台终端机上的问题
    * 7.13 核心升级後似乎无法编译东西
    * 7.14 增加上限

    8. 升级至 2.0.x 的注意事项

    9. 可载入模组

    * 9.1 安装模组工具
    * 9.2 与核心发行的模组

    10. 其它配置选项

    * 10.1 General setup (一般设定)
    * 10.2 Networking options (网路选项)

    11. □诀和技巧

    * 11.1 重导 make 或是 patch 指令的输出
    * 11.2 条件式的核心安装
    * 11.3 核心更新

    12. 其它可能相关有用的 HOWTOs

    13. 杂项

    * 13.1 作者
    * 13.2 预定目标
    * 13.3 贡献者
    * 13.4 版权声明,许可,诸如此类的
    _________________________________________________________________

    1. 简介

    你是否需要阅读这份文件? 如果你有下列任何症状之一的话,是的:

    * ``哎呀!这套 wizzo-46.5.6 软体说它需要 1.8.193 版的核心,而我却仍然
    只有 1.0.9 版!\\
    * 比较新的核心之一□面有你正好需要的一个设备驱动程式.
    * 你对於如何编译核心真的一无所知.
    * ``在 README 档案里面真的就是全部的资料了吗?\\
    * 你来,你试,它还是不动.
    * 你需要某事给予一直要求你为他们安装核心的人们.

    1.1 请先看此!

    这份文件中的某些□例假设你有 GNU tar,find 以及 xargs. 这些是 Linux 套
    件里的标准工具,应该不是问题. 文件中也假设你知道你系统的档案系统架构,
    如果你并不知道,最好赶快写下一份 mount 指令在系统正常运作下,所显示的结
    果作为参考(或者是一份 /etc/fstab 的列表,如果你能够看得懂). 这些资讯很
    重要,而且,除非你重新分割或加入新的磁碟,重新安装你的系统以及做诸如此
    类的操作,否则它们不会变动.

    本文写作时最新``产品\\的核心版本号码是 2.0.30,也就是说本文的参考及例子
    是对应於该版本的. 虽然我尝试让这篇文章尽量跟版本无关,核心却不断地在发
    展中. 因此如果你取得一新的版本,它不可避免地会有一些不同. 当然,这应
    该不会造成大问题,但它可能会制造一些混淆.

    有两种版本的 Linux 核心原始码,``产品\\ 与 ``发展中\\ 的. 产品版本从
    1.0.x 开始而且目前是以偶数编号发表的; 1.0.x 是产品,1.2.x 是产品,
    2.0.x 也是.这些版本应该比较稳定,在发表时是没有臭□(bug)的版本. 发展
    中的核心 (1.1.x, 1.3.x 等等) 是作为测试用的,给那些想要测试最新而且可能
    有许多臭□的人用的. 已经警告过你了.

    1.2 文章风格说明

    看起来像这样 text 的文字或者是某样将出现你的萤幕上的东西,一个档名, 或
    是某样可被直接键入的东西,像是命令,或命令的选项(如果你看的是纯文字档案
    ,它看起来没什麽不同). 命令与其它的输入经常被框起来(用` \),这经常引起
    典型的标点符号问题: 如果这样的项目出现在句子的最後面,人们时常会在命令
    後面加上一句号 `.\, 因为美国人的引号习惯将句号放入引号里面. 即使用常
    识(而不幸的是,这假设了拥有此``常识\\的人是习惯於美国式的引号)想也知道
    应先将这标点去掉,但很多人总是忘记. 所以在此情形下我将句号放在引号外头
    .换句话说,当我叫你要打 ``make config\\ 时, 我会写 `make config\,而
    不是 `make config.\.

    2. 重要问题与解答

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

    在 Unix 系统中,像是你的程式与硬体的一个仲裁者. 首先,它为所有执行中的
    程式(程序)做记忆体管理, 并且确保它们都能够平均(或不平均,如果你愿意)的
    分享处理机的运算资源. 此外,它还提供了一个良好的介面让刚刚提到的程式能
    透过它与你的硬体沟通.

    其实核心所处理的工作比这还要更复杂一些,不过这些基本的功能是最必要知道
    的.

    2.2 我为什麽要更新核心?

    比较新的核心一般来说会提供更强的能力来与更多种奇奇怪怪的硬体沟通(也就是
    说,它们拥有更多的设备驱动程式), 它们能够有更好的行程管理,它们能够执
    行的比旧的版本更有效率,它们可能比旧的版本来的更稳定,而且它们修正了旧
    版里的一些错误. 大部分的人是因为他们需要那些新的设备驱动程式以及错误修
    正的部份而更新核心.

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

    请看 [4]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 原始程式码在 2.0.10 版
    时约占 6 MB. 许多站台在解压缩後仍会保留一份.解压缩以後这将占掉约 24
    MB. 但这还不是全部 — 你将会需要更多的磁碟空间来实际编译这些东西. 这
    与你配置多少东西到你的核心里头去有关.例如,在某部机器上,我有网路
    ,3Com 3C503 的驱动程式, 并且配置了三种档案系统,而这全部共需要 30 MB
    .加上压缩过的 linux 原始程式码,这个配置大概需要用掉你 36MB . 在另外
    一个系统上,不需要支援网路设备(但仍然需要支援网路),加上音效卡,结果吃
    掉更多空间. 还有,一个新版本的核心几乎总是比旧版本的占更大的空间. 所
    以,一般来说,如果你有许多种硬体设备的话,确定你有足够的硬碟空间来容纳
    这个配置. (以今日的价格来说,对於储存空间的问题我不能不建议你再买一台
    磁碟机.)

    2.7 这需要多久的时间?

    对大部份的人而言,答案是``很久\\.你的处理机速度有多快,以及你拥有的记
    忆体数量有多少将是决定所需时间的主要因素, 但是,在把多少东西配置到核心
    里头去这方面还是可以做点努力. 在一台有 16 MB 记忆体的 486DX4-100 电脑
    上,一个有五种档案系统、支援网路、以及音效卡驱动程式的 1.2 版核心可以在
    二十分钟以内完成. 类似的配置,在一台 386DX/40(8 MB 记忆体)上大约需要要
    1.5 个小时. 在编译核心时通常一些好的建议是去喝一点咖啡,看点电视,织些
    毛线,或任何你喜欢的事. 如果你的机器真的很慢的话你也该换台较快的机器.

    3. 如何真正进行核心的配置?

    3.1 取得原始程式码

    你可以经由匿名 ftp 站从 ftp.funet.fi 的 [5]/pub/Linux/PEOPLE/Linus, 或
    是其它 MIRROR 站取得.([译注] 台湾可从 [6]ftp.edu.tw 取得.) 档案名称一
    般是以标记成 linux-x.y.z.tar.gz 为代表,其中的 x.y.z 是版本编号. 较新
    的(更好的?)版本以及修补档一般是放在类似 `v1.1\ 以及 `v1.2\ 这样的子目录
    下. 数字最大的是最新的版本,而且通常是``测试版\\,也就是说如果你对
    beta 或 alpha 版感到不安的话,你应该停留在主要的发行版本上.

    强烈建议你去找 mirror 的 ftp 节点,而不要直接到 ftp.funet.fi 去! 底下是
    一些 mirrors 以及其他节点的简要列表:

    USA: sunsite.unc.edu:/pub/Linux/kernel
    USA: tsx-11.mit.edu:/pub/linux/sources/system
    UK: sunsite.doc.ic.ac.uk:/pub/unix/Linux/sunsite.unc-mirror/kernel
    Austria: ftp.univie.ac.at:/systems/linux/sunsite/kernel
    Germany: ftp.Germany.EU.net:/pub/os/Linux/Local.EUnet/Kernel/Linus
    Germany: sunsite.informatik.rwth-aachen.de:/pub/Linux/PEOPLE/Linus
    France: ftp.ibp.fr:/pub/linux/sources/system/patches
    Australia: sunsite.anu.edu.au:/pub/linux/kernel

    一般来说,sunsite.unc.edu 的 mirror 站是很好找的. 档案
    /pub/Linux/MIRRORS 包含了已知的 mirror 节点. 如果你没有办法上 ftp ,有
    个存放 linux 的 BBS 系统列表会定期刊登在 comp.os.linux.announce 上,试
    著到那边去找一下.

    如果你想寻找一般的 Linux 资讯与套件,去 [7]http://www.linux.org/.

    3.2 解开原始程式码的包装

    确定你是以`root\的身份签入,然後 cd 到 /usr/src. 如果你安装 Linux 时已
    经安装了核心原始程式码,在这个目录底下应该已经存在一个叫做 `linux\ 的子
    目录. 这是旧版的 linux 原始程式码.如果你还有磁碟空间而且想要玩得安全
    一点,那麽你会想要保留这个子目录的. 有个好主意是根据你目前使用的核心版
    本来修改这个子目录的名称. `uname -r\ 这个指令将会告诉你目前的核心版本
    . 所以,如果 `uname -r\ 显示 `1.0.9\,你就可以把 `linux\ 改名(用
    `mv\)为 `linux-1.0.9\. 如果你是个鲁莽型的人,那就直接把这个子目录清除
    掉. 无论是哪一种情况,反正只要确定在解开全部的原始程式码之前
    ,/usr/src 目录下没有 `linux\ 这个子目录就对了.

    在 /usr/src 目录下,用 `tar zxpvf linux-x.y.z.tar.gz\ 来解开原始程式码
    的包装 (如果你拿到的是 .tar 的档案,後面没有加上 .gz,那就用 `tar xpvf
    linux-x.y.z.tar\). 你将会看到原始程式的内容飞逝而过.当它完成以後,在
    /usr/src 将会出现一个新的 `linux\ 子目录. cd 到 linux 目录下然後查看
    README 档, 里面应该会有一段标题为 `INSTALLING the kernel\ 或类似的文字
    . 如果适当的话,先依照说明里的指示 — 建立该有的符号链结,移除过时的
    .o 档案等等等诸如此类的工作.

    3.3 配置核心

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

    在 /usr/src/linux 下执行 `make config\ 这个命令将会启始一个指令稿, 而
    这个指令稿会问你各种问题.它需要 bash ,所以要确定 bash 是 /bin/bash
    ,/bin/sh 或 $BASH.

    还有其它种 `make config\ 的方式你可能会觉得更容易使用. 对那些执行 X
    Window 的人你如果有装 Tk 的话可以试著用 `make xconfig\. `make
    menuconfig\ 是给那些有装 (n)curses 而且喜欢文字模式选单的人用的. 这些
    界面有个明显的好处: 如果在配置过程中你不小心犯了错,可以简单地回去修正


    你现在该准备好回答这些问题,通常用 `y\ 或 `n\ 就可以了. 设备驱动程式通
    常会有一个 `m\ 选项. 这表示``模组(module)\\,表示说系统将会编译它,但
    不会直接放进核心里,而是做为一可载入模组. 一个有趣的说法是表
    示``maybe\\.有一些很明显或是不重要的选项将不会在此加以说明. 请见``
    [8]其它配置选项\\一节对其中的简短说明.

    在 2.0.x 或以後的版本中有一个 `?\ 选项,提供了这个配置参数的简短描述.
    这些资讯应该都是最新的.

    Kernel math emulation (核心的数学运算模拟)

    如果你没有数学辅助运算处理机(你只有一台单纯的 386 或 486SX),那麽你在
    这里要回答 `y\.如果你已经有数学辅助运算处理机却还回答 `y\, 那也不必太
    担心 — linux 还是会去使用它而忽略掉核心的模拟程式. 唯一的影响是编译出
    来的核心变大了(用掉更多的记忆体). 我听说数学运简模拟很慢; 虽然和本节无
    太大关系,还是应该注意这对 X Window 系统的效率会有很大影响.

    Normal (MFM/RLL) disk and IDE disk/cdrom support (标准硬碟支援)

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

    然後你会被问到关於 ``old disk-only\\ 与 ``new IDE\\ 驱动程式的事. 你应
    该两者选一; 主要的差别是旧的驱动程式只支援单一界面两部磁碟机, 而新的驱
    动程式支援第二界面及 IDE/ATAPI 光碟机.新的驱动程式比旧的大约多 4K, 而
    且应该是``改良的\\,也就是说除了可能包含些许错误之外,它应该会改善你的
    磁碟效率,特别是如果你有较新的 EIDE 硬体的话.

    Networking support (网路支援)

    原则上,如果你有连接网路,譬如说,你有 Internet 连线,或是你将使用
    SLIP,PPP,term 或其它方式拨接到 Internet 上的话,回答 `y\. 然而,某些
    软体套件(例如 X Window 系统)需要网路支援,即使你的机器并不真正连接到网
    路上.这情形你也应该回答 `y\. 然後,你会被问到是否需要支援 TCP/IP 网路
    ,如果你不十分确定,就回答 `y\.

    Limit memory to low 16MB (制记忆体在 16 MB)

    可能会有一些不良的 386 DMA 控制器无法正确地定址到 16 MB 以上的记忆体位
    址; 如果你的机器刚好有这种(罕见)情况时,那麽你也就只好回答″ y ″了.

    System V IPC

    一个 IPC (行程内通讯,Interprocess Communication) 的定义就在 Perl 书中
    的注解. 这并不大奇怪,一些 Perl 程式设计者用它来让行程之间互相沟通,就
    像许多其它套件(最著名如 DOOM)一样. 因此除非你完全了解你在做什麽,不然
    最好别回答 n.

    Processor type (386, 486, Pentium, PPro) (微处理机种类)

    (在较旧版本的核心中为: Use -m486 flag for 486-specific optimizations,
    使用 -m486 旗标针对 486 做最佳化)

    按照惯例地,这是对一特别的微处理机做某种最佳化; 核心仍可在其它晶片上跑
    得很好,但可能会比较大些. 不过,在较新版本的核心上,已经不是这个样子了
    .因此你应该正确地回答你要编译的微处理机种类. ``386\\ 的核心可以在所有
    的机器上工作.

    SCSI support (SCSI 的支援)

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

    Network device support (网路设备支援)

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

    Filesystems (档案系统)

    这将会有提示要你回答所要支援的档案系统种类,计有:

    Standard (minix) — 新的套件不再建立 minix 档案系统,而且很多人不使用它
    ,但是把它配置在核心里仍然是个好主意. 某些``急救磁片\\程式会用到它,而
    且仍然有许多软碟磁片可能用 minix 档案系统,因为 minix 档案系统对於处理
    软碟片方面较无问题.

    Extended fs — 这是扩充档案系统的第一版,现在已经不再使用.使用的时机是
    ,如果你有需要,你就会知道的.如果你觉得怀疑,你就不需要它.

    Second extended — 这是现在新发行的套件所广泛采用的档案系统,你可能会有
    其中一种,所以必须回答 `y\.

    xiafs filesystem — 这个档案系统曾经一度很普遍,但是在写这份文件时,我
    已经不知道有任何人在使用它了.

    msdos — 如果你想要在 linux 下使用你硬碟中的 MS-DOS 分割区,或是想将用
    MS-DOS 格式化的软碟片挂进来的话,回答 `y\.

    ums-dos — 这种档案系统能使 MS-DOS 档案系统拥有更多像 Unix 的特性,像是
    长档名等等.这对那些不使用 MS-DOS 的人(像我)并不是很有用.

    /proc — 另一种神奇的东西(我猜这个概念是无耻地从贝尔实验室里偷过来的).
    它不是你硬碟分割区里的任何东西,而是核心与程序之间的档案系统介面.许多
    程序工具(像 `ps\)都会用到它. 有时可以试著用 `cat /proc/meminfo\ 或
    `cat /proc/devices\. 某些 shell (特别像是 rc) 使用了 /proc/self/fd (在
    其它系统里叫做 /dev/fd) 来做输出输入动作. 你几乎应该回答 `y\; 许多重要
    的 Linux 工具都依赖它来运作的.

    NFS — 如果你在网路环境下而且想要由 NFS 来使用其它机器的档案系统,回答
    `y\.

    ISO9660 — 绝大部分的光碟片都使用这个档案系统.如果你有光碟机而且想在
    Linux 下使用,回答 `y\.

    OS/2 HPFS — 在编写这份文件的时候,这个档案系统还只支援到 OS/2 HPFS 的
    读取.

    System V and Coherent — 这是为 System V 以及 Coherent 系统的分割区而设
    的(它们是另一种在 PC 上的 Unix 系统).

    但是我不知道我需要那些档案系统!

    好吧,键入 `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\. 它会给你一份目前
    使用的核心所支援的档案系统列表.

    这配置并不常使用.不重要的档案系统会使核心显得臃肿; 参见可载入模组一节
    的说明以避免此情况,以及`` [10]陷阱\\一节说明为何臃肿的核心不好.

    Character devices (字元设备)

    在这里,你将会发现许多设备名称,用来设定你的印表机,汇流排滑鼠,PS/2 滑
    鼠(大部分笔记型电脑使用内建的 PS/2 滑鼠), 以及一些磁带机驱动程式,以及
    其它的``字元\\设备.当有合适的选项时,回答 `y\.

    注意:Selection 这个程式使你可以在 X window 之外使用滑鼠在各个虚拟控制
    台间做剪贴的动作. 如果你有串列滑鼠的话,这真的很棒,因为它与 X window
    之间的沟通良好, 不过如果你用其它种类的滑鼠就需要点技巧了.Selection 曾
    经一度是选择的配置配项,不过现在已经是标准了.

    注意二: Selection 现在已经过时了.现在新的程式名叫 ``gpm\\. 它能做更神
    奇的事,像是转换滑鼠协定,处理多重滑鼠等……

    Sound card (音效卡)

    如果你想听到 biff 程式大叫的话,回答 `y\. 然後等一下会编译另一个配置程
    式并详细询问你所有关於音效卡的问题. (注意: 当它问你是否安装完整版本的
    驱动程式时,你可以回答 `n\ 以减少你核心记忆体并只选用你真正需要的.) 如
    果你有音效卡我强烈建议看一下 [11]Sound-HOWTO 以知道更多的细节.

    其它配置选项

    没有将所有的选项都列出来,因为有些经常改变,或是相当自明的(例如 3Com
    3C509 support 就是编译这种特别乙太网路卡的驱动程式), 有一个十分容易理
    解的所有选项列表(包括将它们放到 Configure 指令稿的方法)可在这个 URL 找
    到(由 Axel Boldt [12][email protected] 所收集):

    [13]http://math-www.uni-paderborn.de/~axel/config_help.html

    或经由匿名 FTP 站:

    [14]ftp://sunsite.unc.edu/pub/Linux/kernel/config/krnl_cnfg_hlp.x.y
    z.tgz

    其中 x.yz 是版本号码.

    其後来的核心中(2.0.x 及其後的),这已被整合到原始程式码中.

    Kernel hacking

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

    ``kernel hacking\\ 配置的细节通常会产生一个更大或是更慢的核心(或者是又
    大又慢), 而且可能因为将一些常式配置成很活跃地去尝试中断一些不良的程式
    码以便找出核心里的问题( kmalloc() ), 而使得核心变得比较不稳定.所以
    要产生一个核心``产品\\的话,你在这里应该回答 `n\.

    3.4 现在呢? (The Makefile)

    在你完成 make config 之後,应该会有一个讯息告诉你核心已经配置好了, 以
    及要你去``check the top-level Makefile for additional configuration\\
    等等讯息.

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

    4. 编译核心

    4.1 清除与确认

    当用来进行配置的指令稿执行完成时,它会告诉你去 `make dep\ 以及 `clean\
    . 所以要执行`make dep\.这将确保所有的相依关系,例如 include files 都
    没问题. 除非你的电脑真的很慢,否则它不会花太久时间的. 完成後,在较旧
    版本的核心中你还应该做 `make clean\. 这会清除核心编译的所有目的档以及
    其它东西.在重建一个核心之前不要忘记这个步骤.

    4.2 编译时期

    在完成 `make dep\ 及 `make clean\ 工作之後,你现在可以执行 `make
    zImage\ 或 `make zdisk\ (这部份需要长时间). `make zImage\ 将会编译核心
    ,并且在 arch/i386/boot 留给你一个叫做 `zImage\ 的档案.这就是新的压缩
    核心. `make zdisk\ 做的事也一样,但是它会把核心放到你所希望的磁片去,
    只要把这张磁片放在 ``A:\\. `zdisk\对於测试新核心很方便;如果它当掉(或
    工作不正常),只要把磁片拿掉再用旧的核心启动即可. 如果你意外地删除了核
    心或是什麽的,它也是个方便的启动办法. 当你把一台磁碟的内容倾倒到另外一
    台去时,你也可以用它来安装新的系统(除了这些之外还有更多用途!)

    所有近来的核心都是压缩过的,所以有个 `z\ 在名字前面.压缩过的核心执行的
    时候会自动将自己解压缩.

    4.3 其他可以``make\\的东西

    `make mrproper\ 将会做更广泛的 `清除\ 工作. 这个动作有时候是必须的,所
    以你可能会希望在每次修补的时候执行它. `make mrproper\ 还会将你的配置档
    案杀掉,所以如果你认为它重要的话应该先做一备份(在 .config).

    `make oldconfig\ 会尝试由一旧的配置档案来配置你的核心.它会为你执行
    `make config\. 如果你还未曾编译过核心或没有旧的配置档案,那麽你可能不
    该做这个,因为你几乎确定会更改预设的配置.

    参见可载入模组一节对 `make modules\ 的说明.

    4.4 安装核心

    在你已经获得一个看起来能够照你希望运作的新核心之後,现在是安装它的时候
    了. 大部份的人使用 LILO (Linux Loader) 来做这件事. `make zlilo\ 将会
    安装核心,然後对它执行 LILO,使你完成所有开机的准备, 但是这只有在
    LILO 已经以下列这种方式配置好的时候才可以:核心为 /vmlinuz , lilo 在
    /sbin 下,而且与你的 LILO 配置(/etc/lilo.conf)一致.

    另一方面,你可能需要直接使用 LILO.这是一个相当容易安装的软体,然而,它
    的配置档常使人困扰. 查看配置档(不是旧版的 /etc/lilo/config 就是新版的
    /etc/lilo.conf),看看里面有些什麽. 它看起来像这样子的东西:

    image = /vmlinuz
    label = Linux
    root = /dev/hda1
    ...

    首先,`image =\ 设定为已经安装的核心.大部份的人似乎都用 /vmlinuz.
    `label\ 则是给 lilo 用来决定现在要启动的是那个核心或作业系统, 而
    `root\ 则是这个特别的作业系统的根目录 /. 备份一份旧的核心,然後将你做
    的 zImage 拷贝进去(例如,如果你用 `/vmlinuz\ 的话,就像这样 `cp zImage
    /vmlinuz\). 然後,执行 `lilo\,但是在较旧的系统上,你可能必须执行
    /etc/lilo/install 或甚至是 /etc/lilo/lilo -C /etc/lilo/config.

    如果你想知道更多有关於 LILO 的配置,或是你并没有 LILO 但是你想要安装的
    话, 从你喜欢的 ftp 节点取得最新的版本然後依说明行事.

    要能够从硬碟启动你的旧核心其中之一的话(这是另一个在新核心出状况的情况下
    保护你自己的方法), 把 LILO 配置档中所有的(包括) `image = xxx\ 拷贝到档
    案的最底端, 然後把 `image = xxx\ 改成 `image = yyy\ 其中的 `yyy\ 是你
    备份旧核心所存档的名字. 接著,把 `label = zzz\ 改成像是 `label =
    linux-backup\ 然後重新执行 lilo. 你可能得要加上一行 `delay=x\,其中的
    x 是以十分之一秒为单位的时间, 这是告诉 LILO 在启动前先等一下,所以你可
    以中断它的执行(例如用 shift 键). 然後键入所备份的启动映像之 label (在
    发生了某些令人不愉快的事情的情况下).

    5. 修补核心

    5.1 使用修补档

    核心的小幅更新是以修补档的方式发行.例如,如果你的版本是 1.1.45 , 而且
    你注意到出现了一个 `patch46.gz\ 可以用来升级它, 这代表你可以藉由使用这
    个修补档将版本升级到 1.1.46. 你也许会想要先备份原始程式码(`make
    clean\ 然後 `cd /usr/src; tar zcvf old-tree.tar.gz linux\ 将会为你造出
    一份 tar 压缩档,里面就是整个原始程式码与其档案架构).

    现在接著继续上面的例子,假设你已经取得了 `patch46.gz\ 并放在 /usr/src
    下. cd 到 /usr/src 然後执行 `zcat patch46.gz | patch -p0\ (如果并不是
    压缩过的修补档,那麽就执行 `patch -p0 < patch46\), 你将会看到许多东西
    飞逝而过(或是慢慢跳过,如果你的电脑真的很慢的话)告诉你它正试著修补程式
    ,以及是否成功. 通常,这个过程快得无法仔细看清楚它的动作,所以你会无法
    确定它到底有没有成功地执行. 所以你可能会想在 patch 指令中加上 -s 选项
    ,告诉 patch 程式只报告错误讯息就好. (这样你就不会得到许多``嗨! 我的电
    脑正在做某些改变!\\的感觉,不过你可能宁愿这样…) 那麽就得找找看一些可能
    不是那麽顺利的事.cd 到 /usr/src/linux 并找寻档名结尾为 .rej 的档案.
    某些版本的 patch(比较旧的版本,它们可能是在比较早期的档案系统上编译的
    )会把这些没有成功的操作记录在档名有 # 的档案里. 你可以用 `find\ 来替
    你找;
    find . -name \*.rej\ -print

    会将现行目录及子目录下所有具 .rej 结尾的档名印到标准输出.

    如果一切正确无误的话,执行第三节跟第四节所讨论的 `make clean\
    ,`config\ 以及 `dep\.

    关於 patch 指令另外还有一些选项.如前所述,patch -s 将会抑制除了错误以
    外的所有其他讯息. 如果你把核心原始程式码放在 /usr/src/linux 以外的地方
    ,在该目录下用 patch -p1 也可以乾净俐落的执行修补任务. 其它的 patch 选
    项在线上手册(man page)里都有很详细的描述.

    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?\, 你可能使用
    了一些比你目前的版本编号还低的修补档; 如果你回答 `y\,它会尝试将你的程
    式码降级,而且几乎一定会失败; 如此,你就需要重新取得一份新的原始程式码


    要还原到修补前的状态的话,在原先的修补档上执行 `patch -R\.

    当修补档真的失败的时候,最好的办法是从一个乾净的原始程式码(例如从
    linux-x.x.x.tar.gz 档案其中之一)开始,再重新执行.

    5.3 砍掉 .orig 档案

    只要做过几次修补以後,那些 .orig 的档案将会开始堆积. 例如,我的一个
    1.1.51 版的程式码最後一次做清扫是在 1.1.48 版(我想是吧). 删除这些
    .orig 档案会节省许多的磁碟空间.
    find . -name \*.orig\ -exec rm -f {} \;\

    将会替你照料这件事.某些版本的 patch 会用 ~ 来代替 .orig.

    有其它更好的的办法可砍掉这些 .orig 档,就是利用 GNU 的 xargs:
    find . -name \*.orig\ | xargs rm

    或是更安全但有些罗嗦的方法:
    find . -name \*.orig\ -print0 | xargs --null rm --

    5.4 其它的修补档

    有一些并不是由 Linus 发行的其它修补档出现(我将称之为``非标准的\\). 如
    果你使用了它们,Linus 的修补档可能会而无法正确地执行, 那麽你不是得将它
    们还原就是得因此而去修改原始程式码或是修补档.这个工作对初学者通常是很
    讨厌, 所以如果你不想去修改原始程式码(结果通常不大好),在使用 Linus 的
    修补档之前先还原这些非标准的修补档,或重新安装新的程式码. 然後试试这非
    标准的修补档能不能用.如果不能的话,那麽要不你就继续使用旧的核心, 试著
    修改修补档使其能用,要不就等待(可能是乞求)新版非标准修补档出现.

    非标准的修补档有多普遍? 你有可能曾经听过它们.我使用 Bill Paul 的不闪烁
    修补档来修改我的虚拟控制台,因为我讨厌会闪烁的游标(这个修补档经常为新版
    核心而更新). 由於大部份较新的设备驱动程式都已经被发展成可载入模组形式
    ,因此许多非标准的修补档的重要性已逐渐降低.

    6. 附加的套件

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

    6.1 kbd

    Linux 的控制台有著比你所能吃惊更多的特色.这包括切换字型,重新对映你的
    键盘,切换显示模式(较新版的核心)的能力等等. kbd 这套软体里有能够让使用
    者做这些动作的支援程式,还加上一大堆的字型以及几乎足以适用任何键盘的一
    些键盘对映表. 它可在放置核心原始码的同一站台找到.

    6.2 util-linux

    Rik Faith ( [15][email protected]) 收集了一大堆 Linux 的工具,叫做
    util-linux. 现在是由 Nicolai Langfeldt ( [16][email protected])
    所维护. 可从 sunsite.unc.edu 的 [17]/pub/Linux/system/misc 取得. 它包
    括了像 setterm,rdev 以及 ctrlaltdel 与核心有关的工具. 就像 Rik 所说的
    ,不要想都不想就把它装上去! 你不需要安装此套件中的每一个东西,而且如果
    你这样做的话可能会引起严重的问题.

    6.3 hdparm

    像很多软体一样,这曾经是一个核心修补档及其支援程式. 这些修补档被放入商
    业核心中,而用来最佳化以及调适你硬碟的支援程式一般是分开发行的.

    6.4 gpm

    gpm 是 general purpose mouse 的简写. 这个程式可以让你使用不同种类的滑
    鼠在虚拟控制台之间剪贴,以及做一些其它的事情.

    7. 一些陷阱

    7.1 make clean

    如果你的新核心会做一些真的很奇怪的事,有可能是因为在编译核心前你忘了做
    清除 make clean. 症状从你的核心不正常地崩溃到奇怪的输出入问题,一直到
    可怜的执行效率等等不一而足,可以是任何事. 最好也要确定你有做 make dep


    7.2 巨大或缓慢的核心

    如果你的核心占用了大量的记忆体,或者它真的是很大很大,也或者是即使用你
    全新的 786DX6/440 来编译却都还像是永远编译不完的话, 那麽有可能是因为你
    配置了太多不必要的东西(设备驱动程式,档案系统等等). 如果你不会用到某些
    东西,那就不要配置它,因为它真的会占用记忆体. 核心过於臃肿最明显的症状
    就是发生记忆体与磁碟之间异常大量的资料交换. 如果你不是用那种声音听起来
    好像是喷射机降落的旧型 Fujitsu Eagles 硬碟,检查一下你的核心配置.

    你可以找出你机器上全部记忆体的数量,然後减掉 /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)

    如果你`必须\得到一大型核心但系统却不让你做,你可以试试 `make bzimage\.
    你可能必须安装新版的 LILO 来做这件事.

    7.3 核心无法编译

    如果它没有被编译,那麽可能是有个修补档失败了,或者是你从某个地方拿到的
    原始程式码有问题. 也有可能是因为你的 gcc 版本不正确或坏掉了(例如含入档
    有错误). 确定 Linus 在 README 里所描述的符号链结都有正确建立. 一般说
    来,如果核心没能编译,这表示在某些地方有严重的错误,重新安装某些工具可
    能是必须的.

    或者可能你用 ELF 编译器 (gcc 2.6.3 或以後的) 来编译 1.2.x 的核心. 如果
    编译过程中你得到一大堆的 xxxx undefined 的讯息,这可能是你的问题. 修正
    的方法大部份都很简单.将这几行加到 arch/i386/Makefile 的顶端:
    arch/i386/Makefile:
    AS=/usr/i486-linuxaout/bin/as
    LD=/usr/i486-linuxaout/bin/ld -m i386linux
    CC=gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include

    然後重新执行 make dep 与 zImage.
    发布人:netbull 来自: