Kernel HOWTO 中译版 <author> 作者: Brian Ward <tt><htmlurl url="mailto:bri@blah.math.tu-graz.ac.at" name="bri@blah.math.tu-graz.ac.at"></tt><newline> 译者: <htmlurl url="http://www.phys.ntu.edu.tw/~cwhuang/pub/" name="C.W.Huang"> & <htmlurl url="http://ultima.ncnu.edu.tw/~asdchen/" name="Asd L. Chen"> <date>v0.80, 26 May 1997. 翻译日期: 25-29 August 1997 <abstract> 这是一份关於如何配置、编译、升级核心以及排难解纷的详细指引. </abstract> <toc> <sect>简介 <p> 你是否需要阅读这份文件? 如果你有下列任何症状之一的话,是的: <p> <itemize> <item> ``哎呀!这套 wizzo-46.5.6 软体说它需要 1.8.193 版的核心,而我却仍然只有 1.0.9 版!'' <item> 比较新的核心之一□面有你正好需要的一个设备驱动程式. <item> 你对於如何编译核心真的一无所知. <item> ``在 README 档案里面<it>真的</it>就是全部的资料了吗?'' <item> 你来,你试,它还是不动. <item> 你需要某事给予一直要求你为他们安装核心的人们. </itemize> <sect1>请先看此! <p> 这份文件中的某些□例假设你有 GNU <tt>tar</tt>,<tt>find</tt> 以及 <tt>xargs</tt>. 这些是 Linux 套件里的标准工具,应该不是问题. 文件中也假设你知道你系统的档案系统架构,如果你并不知道,最好赶快写下一份 mount 指令在系统正常运作下,所显示的结果作为参考(或者是一份 /etc/fstab 的列表,如果你能够看得懂). 这些资讯很重要,而且,除非你重新分割或加入新的磁碟,重新安装你的系统以及做诸如此类的操作,否则它们不会变动. <p> 本文写作时最新``产品''的核心版本号码是 2.0.30,也就是说本文的参考及例子是对应於该版本的. 虽然我尝试让这篇文章尽量跟版本无关,核心却不断地在发展中. 因此如果你取得一新的版本,它不可避免地会有一些不同. 当然,这应该不会造成大问题,但它可能会制造一些混淆. <p> 有两种版本的 Linux 核心原始码,``产品'' 与 ``发展中'' 的. 产品版本从 1.0.x 开始而且目前是以偶数编号发表的; 1.0.x 是产品,1.2.x 是产品, 2.0.x 也是.这些版本应该比较稳定,在发表时是没有臭□(bug)的版本. 发展中的核心 (1.1.x, 1.3.x 等等) 是作为测试用的,给那些想要测试最新而且可能有许多臭□的人用的. 已经警告过你了. <sect1>文章风格说明 <p> 看起来像这样 <tt>text</tt> 的文字或者是某样将出现你的萤幕上的东西,一个档名, 或是某样可被直接键入的东西,像是命令,或命令的选项(如果你看的是纯文字档案,它看起来没什麽不同). 命令与其它的输入经常被框起来(用` '),这经常引起典型的标点符号问题: 如果这样的项目出现在句子的最後面,人们时常会在命令後面加上一句号 `.', 因为美国人的引号习惯将句号放入引号里面. 即使用常识(而不幸的是,这假设了拥有此``常识''的人是习惯於美国式的引号)想也知道应先将这标点去掉,但很多人总是忘记. 所以在此情形下我将句号放在引号外头.换句话说,当我叫你要打 ``<tt>make config</tt>'' 时, 我会写 `<tt>make config</tt>',而不是 `<tt>make config</tt>.'. <sect>重要问题与解答 <p> <sect1>不管怎麽样,核心到底是做什麽的? <p> 在 Unix 系统中,像是你的程式与硬体的一个仲裁者. 首先,它为所有执行中的程式(程序)做记忆体管理, 并且确保它们都能够平均(或不平均,如果你愿意)的分享处理机的运算资源. 此外,它还提供了一个良好的介面让刚刚提到的程式能透过它与你的硬体沟通. <p> 其实核心所处理的工作比这还要更复杂一些,不过这些基本的功能是最必要知道的. <sect1>我为什麽要更新核心? <p> 比较新的核心一般来说会提供更强的能力来与更多种奇奇怪怪的硬体沟通(也就是说,它们拥有更多的设备驱动程式), 它们能够有更好的行程管理,它们能够执行的比旧的版本更有效率,它们可能比旧的版本来的更稳定,而且它们修正了旧版里的一些错误. 大部分的人是因为他们需要那些新的设备驱动程式以及错误修正的部份而更新核心. <sect1>较新的核心支援那些硬体? <p> 请看 <htmlurl url="Hardware-HOWTO.html" name="Hardware-HOWTO"> 文件. 另一个方法是,你可以查看 Linux 原始程式码中的 `<tt>config.in</tt>' 档, 或者就在当你试著去 `<tt>make config</tt>' 时找出来. `<tt>make config</tt>' 将会让你看到标准的核心原始程式码支援的所有硬体,但这并不是 Linux 所支援的全部硬体; 许多普通的设备驱动程式(像是 PCMCIA 驱动程式以及某些磁带机的驱动程式)是个别维护及发行的可载入模组. <sect1>我需要那个版本的 gcc 或是 libc ? <p> Linus 对这个问题的建议放在 Linux 原始程式的 <tt>README</tt> 档案□头. 如果你没有该版本或是更新的版本,新版的 gcc 应该会告诉你是否需要更新 libc 的版本. 这两个操作都不会有什麽问题,只要照著说明做就可以了. <sect1>什麽是可载入模组? <p> 它们是核心的一部分(通常是设备驱动程式),但是并没有编译到核心里面去. 它们被分别编译,然後几乎可以在任何时候将它们插入运作中的核心或从中取出. 由於它的便利性,这已经成为一种增加东西到核心里去的较好方式. 许多常用的设备驱动程式,例如 PCMCIA 驱动程式以及 QIC-80/40 磁带机的驱动程式就是可载入模组. <sect1>我需要多大的磁碟空间? <p> 这与你系统的特殊配置有关.首先,压缩过後的 Linux 原始程式码在 2.0.10 版时约占 6 MB. 许多站台在解压缩後仍会保留一份.解压缩以後这将占掉约 24 MB. 但这还不是全部 — 你将会需要更多的磁碟空间来实际编译这些东西. 这与你配置多少东西到你的核心里头去有关.例如,在某部机器上,我有网路,3Com 3C503 的驱动程式, 并且配置了三种档案系统,而这全部共需要 30 MB.加上压缩过的 linux 原始程式码,这个配置大概需要用掉你 36MB . 在另外一个系统上,不需要支援网路设备(但仍然需要支援网路),加上音效卡,结果吃掉更多空间. 还有,一个新版本的核心几乎总是比旧版本的占更大的空间. 所以,一般来说,如果你有许多种硬体设备的话,确定你有足够的硬碟空间来容纳这个配置. (以今日的价格来说,对於储存空间的问题我不能不建议你再买一台磁碟机.) <sect1>这需要多久的时间? <p> 对大部份的人而言,答案是``很久''.你的处理机速度有多快,以及你拥有的记忆体数量有多少将是决定所需时间的主要因素, 但是,在把多少东西配置到核心里头去这方面还是可以做点努力. 在一台有 16 MB 记忆体的 486DX4-100 电脑上,一个有五种档案系统、支援网路、以及音效卡驱动程式的 1.2 版核心可以在二十分钟以内完成. 类似的配置,在一台 386DX/40(8 MB 记忆体)上大约需要要 1.5 个小时. 在编译核心时通常一些好的建议是去喝一点咖啡,看点电视,织些毛线,或任何你喜欢的事. 如果你的机器真的很慢的话你也该换台较快的机器. <sect>如何真正进行核心的配置? <p> <sect1>取得原始程式码 <p> 你可以经由匿名 ftp 站从 <tt>ftp.funet.fi</tt> 的 <tt><htmlurl url="ftp://ftp.funet.fi/pub/Linux/PEOPLE/Linus" name="/pub/Linux/PEOPLE/Linus"></tt>, 或是其它 MIRROR 站取得.([<tt/译注/] 台湾可从 <tt><htmlurl url="ftp://ftp.edu.tw/OS/Linux/kernel" name="ftp.edu.tw"></tt> 取得.) 档案名称一般是以标记成 <tt>linux-x.y.z.tar.gz</tt> 为代表,其中的 <tt>x.y.z</tt> 是版本编号. 较新的(更好的?)版本以及修补档一般是放在类似 `<tt>v1.1</tt>' 以及 `<tt>v1.2</tt>' 这样的子目录下. 数字最大的是最新的版本,而且通常是``测试版'',也就是说如果你对 beta 或 alpha 版感到不安的话,你应该停留在主要的发行版本上. <p> <it>强烈</it>建议你去找 mirror 的 ftp 节点,而不要直接到 <tt>ftp.funet.fi</tt> 去! 底下是一些 mirrors 以及其他节点的简要列表: <p> <verb> 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 </verb> 一般来说,<tt>sunsite.unc.edu</tt> 的 mirror 站是很好找的. 档案 <tt>/pub/Linux/MIRRORS</tt> 包含了已知的 mirror 节点. 如果你没有办法上 ftp ,有个存放 linux 的 BBS 系统列表会定期刊登在 comp.os.linux.announce 上,试著到那边去找一下. <p> 如果你想寻找一般的 Linux 资讯与套件,去 <tt><htmlurl url="http://www.linux.org/" name="http://www.linux.org/"></tt>. <sect1>解开原始程式码的包装 <p> 确定你是以`<tt>root</tt>'的身份签入,然後 <tt>cd</tt> 到 <tt>/usr/src</tt>. 如果你安装 Linux 时已经安装了核心原始程式码,在这个目录底下应该已经存在一个叫做 `<tt>linux</tt>' 的子目录. 这是旧版的 linux 原始程式码.如果你还有磁碟空间而且想要玩得安全一点,那麽你会想要保留这个子目录的. 有个好主意是根据你目前使用的核心版本来修改这个子目录的名称. `<tt>uname -r</tt>' 这个指令将会告诉你目前的核心版本. 所以,如果 `<tt>uname -r</tt>' 显示 `<tt>1.0.9</tt>',你就可以把 `<tt>linux</tt>' 改名(用 `<tt>mv</tt>')为 `<tt>linux-1.0.9</tt>'. 如果你是个鲁莽型的人,那就直接把这个子目录清除掉. 无论是哪一种情况,反正只要确定在解开全部的原始程式码之前,<tt>/usr/src</tt> 目录下没有 `<tt>linux</tt>' 这个子目录就对了. <p> 在 <tt>/usr/src</tt> 目录下,用 `<tt>tar zxpvf linux-x.y.z.tar.gz</tt>' 来解开原始程式码的包装 (如果你拿到的是 <tt>.tar</tt> 的档案,後面没有加上 <tt>.gz</tt>,那就用 `<tt>tar xpvf linux-x.y.z.tar</tt>'). 你将会看到原始程式的内容飞逝而过.当它完成以後,在 <tt>/usr/src</tt> 将会出现一个新的 `<tt>linux</tt>' 子目录. <tt>cd</tt> 到 <tt>linux</tt> 目录下然後查看 <tt>README</tt> 档, 里面应该会有一段标题为 `<tt>INSTALLING the kernel</tt>' 或类似的文字. 如果适当的话,先依照说明里的指示 — 建立该有的符号链结,移除过时的 .o 档案等等等诸如此类的工作. <sect1>配置核心 <p> 注意:这部份内容有些是重覆 Linus 的 <tt>README</tt> 档案中的相应章节或加以修订. <p> 在 <tt>/usr/src/linux</tt> 下执行 `<tt>make config</tt>' 这个命令将会启始一个指令稿, 而这个指令稿会问你各种问题.它需要 bash ,所以要确定 bash 是 <tt>/bin/bash</tt>,<tt>/bin/sh</tt> 或 <tt>$BASH</tt>. <p> 还有其它种 `<tt>make config</tt>' 的方式你可能会觉得更容易使用. 对那些执行 X Window 的人你如果有装 Tk 的话可以试著用 `<tt>make xconfig</tt>'. `<tt>make menuconfig</tt>' 是给那些有装 (n)curses 而且喜欢文字模式选单的人用的. 这些界面有个明显的好处: 如果在配置过程中你不小心犯了错,可以简单地回去修正. <p> 你现在该准备好回答这些问题,通常用 `<tt>y</tt>' 或 `<tt>n</tt>' 就可以了. 设备驱动程式通常会有一个 `<tt>m</tt>' 选项. 这表示``模组(module)'',表示说系统将会编译它,但不会直接放进核心里,而是做为一可载入模组. 一个有趣的说法是表示``maybe''.有一些很明显或是不重要的选项将不会在此加以说明. 请见``<ref id="other-options" name="其它配置选项">''一节对其中的简短说明. <p> 在 2.0.x 或以後的版本中有一个 `?' 选项,提供了这个配置参数的简短描述. 这些资讯应该都是最新的. <sect2>Kernel math emulation (核心的数学运算模拟) <p> 如果你没有数学辅助运算处理机(你只有一台单纯的 386 或 486SX),那麽你在 这里要回答 `<tt>y</tt>'.如果你已经有数学辅助运算处理机却还回答 `<tt>y</tt>', 那也不必太担心 — linux 还是会去使用它而忽略掉核心的模拟程式. 唯一的影响是编译出来的核心变大了(用掉更多的记忆体). 我听说数学运简模拟很慢; 虽然和本节无太大关系,还是应该注意这对 X Window 系统的效率会有很大影响. <sect2>Normal (MFM/RLL) disk and IDE disk/cdrom support (标准硬碟支援) <p> 你在这里差不多都得回答 `<tt>y</tt>'.它代表的意思是核心将会支援标准的 PC 硬碟, 例如大多数人使用的 IDE 界面硬碟.这不包括 SCSI 设备的支援; 这将在後面设定. <p> 然後你会被问到关於 ``old disk-only'' 与 ``new IDE'' 驱动程式的事. 你应该两者选一; 主要的差别是旧的驱动程式只支援单一界面两部磁碟机, 而新的驱动程式支援第二界面及 IDE/ATAPI 光碟机.新的驱动程式比旧的大约多 4K, 而且应该是``改良的'',也就是说除了可能包含些许错误之外,它应该会改善你的磁碟效率,特别是如果你有较新的 EIDE 硬体的话. <sect2>Networking support (网路支援) <p> 原则上,如果你有连接网路,譬如说,你有 Internet 连线,或是你将使用 SLIP,PPP,term 或其它方式拨接到 Internet 上的话,回答 `<tt>y</tt>'. 然而,某些软体套件(例如 X Window 系统)需要网路支援,即使你的机器并不真正连接到网路上.这情形你也应该回答 `<tt>y</tt>'. 然後,你会被问到是否需要支援 TCP/IP 网路,如果你不十分确定,就回答 `<tt>y</tt>'. <sect2>Limit memory to low 16MB (制记忆体在 16 MB) <p> 可能会有一些不良的 386 DMA 控制器无法正确地定址到 16 MB 以上的记忆体位址; 如果你的机器刚好有这种(罕见)情况时,那麽你也就只好回答″ y ″了. <sect2>System V IPC <p> 一个 IPC (行程内通讯,Interprocess Communication) 的定义就在 Perl 书中的注解. 这并不大奇怪,一些 Perl 程式设计者用它来让行程之间互相沟通,就像许多其它套件(最著名如 DOOM)一样. 因此除非你完全了解你在做什麽,不然最好别回答 <tt>n</tt>. <sect2>Processor type (386, 486, Pentium, PPro) (微处理机种类) <p> (在较旧版本的核心中为: Use -m486 flag for 486-specific optimizations,使用 -m486 旗标针对 486 做最佳化) <p> 按照惯例地,这是对一特别的微处理机做某种最佳化; 核心仍可在其它晶片上跑得很好,但可能会比较大些. 不过,在较新版本的核心上,已经不是这个样子了.因此你应该正确地回答你要编译的微处理机种类. ``386'' 的核心可以在所有的机器上工作. <sect2>SCSI support (SCSI 的支援) <p> 如果你有 SCSI 设备,那麽就回答 `<tt>y</tt>'. 接著会有提示要求更进一步的资讯,像是你是否要支援光碟机,磁碟机,还有你使用的是那一种 SCSI 介面卡. 这部份请参阅 <htmlurl url="HOWTO/SCSI-HOWTO.html" name="SCSI-HOWTO">,有更详细的说明. <sect2>Network device support (网路设备支援) <p> 如果你有网路卡,或者你想要使用 SLIP,PPP,或是并列埠界面卡,那就回答 `<tt>y</tt>'. 接著会有提示问你使用的是那一种网路卡,或要使用那一种通讯协定. <sect2>Filesystems (档案系统) <p> 这将会有提示要你回答所要支援的档案系统种类,计有: <P> Standard (minix) — 新的套件不再建立 minix 档案系统,而且很多人不使用它,但是把它配置在核心里仍然是个好主意. 某些``急救磁片''程式会用到它,而且仍然有许多软碟磁片可能用 minix 档案系统,因为 minix 档案系统对於处理软碟片方面较无问题. <p> Extended fs — 这是扩充档案系统的第一版,现在已经不再使用.使用的时机是,如果你有需要,你就会知道的.如果你觉得怀疑,你就不需要它. <p> Second extended — 这是现在新发行的套件所广泛采用的档案系统,你可能会有其中一种,所以必须回答 `<tt>y</tt>'. <p> xiafs filesystem — 这个档案系统曾经一度很普遍,但是在写这份文件时,我已经不知道有任何人在使用它了. <p> msdos — 如果你想要在 linux 下使用你硬碟中的 MS-DOS 分割区,或是想将用 MS-DOS 格式化的软碟片挂进来的话,回答 `<tt>y</tt>'. <p> ums-dos — 这种档案系统能使 MS-DOS 档案系统拥有更多像 Unix 的特性,像是长档名等等.这对那些不使用 MS-DOS 的人(像我)并不是很有用. <p> /proc — 另一种神奇的东西(我猜这个概念是无耻地从贝尔实验室里偷过来的). 它不是你硬碟分割区里的任何东西,而是核心与程序之间的档案系统介面.许多程序工具(像 `<tt>ps</tt>')都会用到它. 有时可以试著用 `<tt>cat /proc/meminfo</tt>' 或 `<tt>cat /proc/devices</tt>'. 某些 shell (特别像是 rc) 使用了 <tt>/proc/self/fd</tt> (在其它系统里叫做 <tt>/dev/fd</tt>) 来做输出输入动作. 你几乎应该回答 `<tt>y</tt>'; 许多重要的 Linux 工具都依赖它来运作的. <p> NFS — 如果你在网路环境下而且想要由 NFS 来使用其它机器的档案系统,回答 `<tt>y</tt>'. <p> ISO9660 — 绝大部分的光碟片都使用这个档案系统.如果你有光碟机而且想在 Linux 下使用,回答 `<tt>y</tt>'. <p> OS/2 HPFS — 在编写这份文件的时候,这个档案系统还只支援到 OS/2 HPFS 的读取. <p> System V and Coherent — 这是为 System V 以及 Coherent 系统的分割区而设的(它们是另一种在 PC 上的 Unix 系统). <sect3>但是我不知道我需要那些档案系统! <p> 好吧,键入 `<tt>mount</tt>'.它看起来会像这样: <p> <tscreen><verb> 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) </verb></tscreen> 仔细看看每一行;在 `<tt>type</tt>' 後面的那个字就是档案系统的格式. 在这个例子中,我的 <tt>/</tt> 和 <tt>/usr</tt> 分割区是 second extended 格式, 我使用了 /proc ,而且挂有一张以 msdos (bleah) 为档案系统格式的磁片. <p> 如果你有使用 <tt>/proc</tt>,可以试试 `<tt>cat /proc/filesystems</tt>'. 它会给你一份目前使用的核心所支援的档案系统列表. <p> 这配置并不常使用.不重要的档案系统会使核心显得臃肿; 参见可载入模组一节的说明以避免此情况,以及``<ref id="pitfalls" name="陷阱">''一节说明为何臃肿的核心不好. <sect2>Character devices (字元设备) <p> 在这里,你将会发现许多设备名称,用来设定你的印表机,汇流排滑鼠,PS/2 滑鼠(大部分笔记型电脑使用内建的 PS/2 滑鼠), 以及一些磁带机驱动程式,以及其它的``字元''设备.当有合适的选项时,回答 `<tt>y</tt>'. <p> 注意:Selection 这个程式使你可以在 X window 之外使用滑鼠在各个虚拟控制台间做剪贴的动作. 如果你有串列滑鼠的话,这真的很棒,因为它与 X window 之间的沟通良好, 不过如果你用其它种类的滑鼠就需要点技巧了.Selection 曾经一度是选择的配置配项,不过现在已经是标准了. <p> 注意二: Selection 现在已经过时了.现在新的程式名叫 ``gpm''. 它能做更神奇的事,像是转换滑鼠协定,处理多重滑鼠等…… <sect2>Sound card (音效卡) <p> 如果你想听到 <tt>biff</tt> 程式大叫的话,回答 `<tt>y</tt>'. 然後等一下会编译另一个配置程式并详细询问你所有关於音效卡的问题. (注意: 当它问你是否安装完整版本的驱动程式时,你可以回答 `<tt>n</tt>' 以减少你核心记忆体并只选用你真正需要的.) 如果你有音效卡我强烈建议看一下 <htmlurl url="Sound-HOWTO.html" name="Sound-HOWTO"> 以知道更多的细节. <sect2>其它配置选项<p> 没有将所有的选项都列出来,因为有些经常改变,或是相当自明的(例如 3Com 3C509 support 就是编译这种特别乙太网路卡的驱动程式), 有一个十分容易理解的所有选项列表(包括将它们放到 <tt>Configure</tt> 指令稿的方法)可在这个 URL 找到(由 Axel Boldt <tt><htmlurl url="mailto:axel@uni-paderborn.de" name="axel@uni-paderborn.de"></tt> 所收集): <tscreen> <tt><htmlurl url="http://math-www.uni-paderborn.de/~axel/config_help.html" name="http://math-www.uni-paderborn.de/~axel/config_help.html"></tt> </tscreen> 或经由匿名 FTP 站: <tscreen> <tt><htmlurl url="ftp://sunsite.unc.edu/pub/Linux/kernel/config/krnl_cnfg_hlp.x.yz.tgz" name="ftp://sunsite.unc.edu/pub/Linux/kernel/config/krnl_cnfg_hlp.x.yz.tgz"></tt> </tscreen> 其中 <tt>x.yz</tt> 是版本号码. <p> 其後来的核心中(2.0.x 及其後的),这已被整合到原始程式码中. <sect2>Kernel hacking <p> >这是从 Linus 的 README 里摘录的: <p> ``kernel hacking'' 配置的细节通常会产生一个更大或是更慢的核心(或者是又大又慢), 而且可能因为将一些常式配置成很活跃地去尝试中断一些不良的程式码以便找出核心里的问题( kmalloc() ), 而使得核心变得比较不稳定.所以要产生一个核心``产品''的话,你在这里应该回答 `n'. <sect1>现在呢? (The Makefile) <p> 在你完成 <tt>make config</tt> 之後,应该会有一个讯息告诉你核心已经配置好了, 以及要你去``check the top-level Makefile for additional configuration'' 等等讯息. <p> 所以查看一下 <tt>Makefile</tt>.你应该不必改变它,但是看看无妨. 一旦新核心完成,你也可以用 `<tt>rdev</tt>' 指令来改变其中的选项. <sect>编译核心 <p> <sect1>清除与确认 <p> 当用来进行配置的指令稿执行完成时,它会告诉你去 `<tt>make dep</tt>' 以及 `<tt>clean</tt>'. 所以要执行`<tt>make dep</tt>'.这将确保所有的相依关系,例如 include files 都没问题. 除非你的电脑真的很慢,否则它不会花太久时间的. 完成後,在较旧版本的核心中你还应该做 `<tt>make clean</tt>'. 这会清除核心编译的所有目的档以及其它东西.在重建一个核心之前<it>不要</it>忘记这个步骤. <sect1>编译时期 <p> 在完成 `<tt>make dep</tt>' 及 `<tt>make clean</tt>' 工作之後,你现在可以执行 `<tt>make zImage</tt>' 或 `<tt>make zdisk</tt>' (这部份需要长时间). `<tt>make zImage</tt>' 将会编译核心,并且在 <tt>arch/i386/boot</tt> 留给你一个叫做 `<tt>zImage</tt>' 的档案.这就是新的压缩核心. `<tt>make zdisk</tt>' 做的事也一样,但是它会把核心放到你所希望的磁片去,只要把这张磁片放在 ``A:''. `<tt>zdisk</tt>'对於测试新核心很方便;如果它当掉(或工作不正常),只要把磁片拿掉再用旧的核心启动即可. 如果你意外地删除了核心或是什麽的,它也是个方便的启动办法. 当你把一台磁碟的内容倾倒到另外一台去时,你也可以用它来安装新的系统(除了这些之外还有更多用途!) <p> 所有近来的核心都是压缩过的,所以有个 `<tt>z</tt>' 在名字前面.压缩过的核心执行的时候会自动将自己解压缩. <sect1>其他可以``make''的东西 <p> `<tt>make mrproper</tt>' 将会做更广泛的 `清除' 工作. 这个动作有时候是必须的,所以你可能会希望在每次修补的时候执行它. `<tt>make mrproper</tt>' 还会将你的配置档案杀掉,所以如果你认为它重要的话应该先做一备份(在 <tt>.config</tt>). <p> `<tt>make oldconfig</tt>' 会尝试由一旧的配置档案来配置你的核心.它会为你执行 `<tt>make config</tt>'. 如果你还未曾编译过核心或没有旧的配置档案,那麽你可能不该做这个,因为你几乎确定会更改预设的配置. <p> 参见可载入模组一节对 `<tt>make modules</tt>' 的说明. <p> <sect1>安装核心 <p> 在你已经获得一个看起来能够照你希望运作的新核心之後,现在是安装它的时候了. 大部份的人使用 LILO (Linux Loader) 来做这件事. `<tt>make zlilo</tt>' 将会安装核心,然後对它执行 LILO,使你完成所有开机的准备, 但是这只有在 LILO 已经以下列这种方式配置好的时候才可以:核心为 /vmlinuz , lilo 在 /sbin 下,而且与你的 LILO 配置(<tt>/etc/lilo.conf</tt>)一致. <p> 另一方面,你可能需要直接使用 LILO.这是一个相当容易安装的软体,然而,它的配置档常使人困扰. 查看配置档(不是旧版的 <tt>/etc/lilo/config</tt> 就是新版的 <tt>/etc/lilo.conf</tt>),看看里面有些什麽. 它看起来像这样子的东西: <p> <verb> image = /vmlinuz label = Linux root = /dev/hda1 ... </verb> 首先,`<tt>image =</tt>' 设定为已经安装的核心.大部份的人似乎都用 <tt>/vmlinuz</tt>. `<tt>label</tt>' 则是给 lilo 用来决定现在要启动的是那个核心或作业系统, 而 `<tt>root</tt>' 则是这个特别的作业系统的根目录 <tt>/</tt>. 备份一份旧的核心,然後将你做的 <tt>zImage</tt> 拷贝进去(例如,如果你用 `<tt>/vmlinuz</tt>' 的话,就像这样 `<tt>cp zImage /vmlinuz</tt>'). 然後,执行 `<tt>lilo</tt>',但是在较旧的系统上,你可能必须执行 <tt>/etc/lilo/install</tt> 或甚至是 <tt>/etc/lilo/lilo -C /etc/lilo/config</tt>. <p> 如果你想知道更多有关於 LILO 的配置,或是你并没有 LILO 但是你想要安装的话, 从你喜欢的 ftp 节点取得最新的版本然後依说明行事. <p> 要能够从硬碟启动你的旧核心其中之一的话(这是另一个在新核心出状况的情况下保护你自己的方法), 把 LILO 配置档中所有的(包括) `<tt>image = xxx</tt>' 拷贝到档案的最底端, 然後把 `<tt>image = xxx</tt>' 改成 `<tt>image = yyy</tt>' 其中的 `<tt>yyy</tt>' 是你备份旧核心所存档的名字. 接著,把 `<tt>label = zzz</tt>' 改成像是 `<tt>label = linux-backup</tt>' 然後重新执行 <tt>lilo</tt>. 你可能得要加上一行 `<tt>delay=x</tt>',其中的 x 是以十分之一秒为单位的时间, 这是告诉 LILO 在启动前先等一下,所以你可以中断它的执行(例如用 shift 键). 然後键入所备份的启动映像之 label (在发生了某些令人不愉快的事情的情况下). <sect>修补核心 <p> <sect1>使用修补档 <p> 核心的小幅更新是以修补档的方式发行.例如,如果你的版本是 1.1.45 , 而且你注意到出现了一个 `<tt>patch46.gz</tt>' 可以用来升级它, 这代表你可以藉由使用这个修补档将版本升级到 1.1.46. 你也许会想要先备份原始程式码(`<tt>make clean</tt>' 然後 `<tt>cd /usr/src; tar zcvf old-tree.tar.gz linux</tt>' 将会为你造出一份 tar 压缩档,里面就是整个原始程式码与其档案架构). <p> 现在接著继续上面的例子,假设你已经取得了 `<tt>patch46.gz</tt>' 并放在 <tt>/usr/src</tt> 下. <tt>cd</tt> 到 <tt>/usr/src</tt> 然後执行 `<tt>zcat patch46.gz | patch -p0</tt>' (如果并不是压缩过的修补档,那麽就执行 `<tt>patch -p0 < patch46</tt>'), 你将会看到许多东西飞逝而过(或是慢慢跳过,如果你的电脑真的很慢的话)告诉你它正试著修补程式,以及是否成功. 通常,这个过程快得无法仔细看清楚它的动作,所以你会无法确定它到底有没有成功地执行. 所以你可能会想在 <tt>patch</tt> 指令中加上 <tt>-s</tt> 选项,告诉 <tt>patch</tt> 程式只报告错误讯息就好. (这样你就不会得到许多``嗨! 我的电脑正在做某些改变!''的感觉,不过你可能宁愿这样…) 那麽就得找找看一些可能不是那麽顺利的事.<tt/cd/ 到 <tt>/usr/src/linux</tt> 并找寻档名结尾为 <tt>.rej</tt> 的档案. 某些版本的 <tt>patch</tt>(比较旧的版本,它们可能是在比较早期的档案系统上编译的)会把这些没有成功的操作记录在档名有 <tt>#</tt> 的档案里. 你可以用 `<tt>find</tt>' 来替你找; <verb> find . -name '*.rej' -print </verb> 会将现行目录及子目录下所有具 <tt>.rej</tt> 结尾的档名印到标准输出. <p> 如果一切正确无误的话,执行第三节跟第四节所讨论的 `<tt>make clean</tt>',`<tt>config</tt>' 以及 `<tt>dep</tt>'. <p> 关於 <tt>patch</tt> 指令另外还有一些选项.如前所述,<tt>patch -s</tt> 将会抑制除了错误以外的所有其他讯息. 如果你把核心原始程式码放在 <tt>/usr/src/linux</tt> 以外的地方,在该目录下用 <tt>patch -p1</tt> 也可以乾净俐落的执行修补任务. 其它的 <tt>patch</tt> 选项在线上手册(man page)里都有很详细的描述. <sect1>如果有错误发生 <p> (注意: 本节提到的大部份是指旧版的核心) <p> 通常最常发生的问题是当 <tt>patch</tt> 修改一个叫做 `<tt>config.in</tt>' 的档案时,这个档案看起来不怎麽对劲, 因为你修改了一些选项来配合你的机器.这个问题已经小心的注意过了,但还是可能有人会在较旧的版本上遭遇这个问题. 要修正这个问题的话,查看 <tt>config.in.rej</tt> 这个档案里留下些什麽讯息. 有修改过的部份正常来说会在每一行开始的地方标上 `<tt>+</tt>' 和 `<tt>-</tt>'. 查看有标记的附近几行,然後记得它们是设成 `<tt>y</tt>' 或是 `<tt>n</tt>'. 现在编辑 <tt>config.in</tt> 档,然後在适当的地 方把 `<tt>y</tt>' 改成 `<tt>n</tt>' 以及 `<tt>n</tt>' 改成 `<tt>y</tt>'.执行 <verb> patch -p0 < config.in.rej </verb> 如果成功的话(没有错误),那麽你就可以继续配置与编译的工作. 这个 <tt>config.in.rej</tt> 档还是会留在那里,但是你可以砍掉它. <p> 如果你仍然遭遇其它问题,那麽可能是你安装了一份损坏的修补档. 如果 patch 显示 `<tt>previously applied patch detected: Assume -R?</tt>', 你可能使用了一些比你目前的版本编号还低的修补档; 如果你回答 `<tt>y</tt>',它会尝试将你的程式码降级,而且几乎一定会失败; 如此,你就需要重新取得一份新的原始程式码. <p> 要还原到修补前的状态的话,在原先的修补档上执行 `<tt>patch -R</tt>'. <p> 当修补档真的失败的时候,最好的办法是从一个乾净的原始程式码(例如从 linux-x.x.x.tar.gz 档案其中之一)开始,再重新执行. <sect1>砍掉 .orig 档案 <p> 只要做过几次修补以後,那些 <tt>.orig</tt> 的档案将会开始堆积. 例如,我的一个 1.1.51 版的程式码最後一次做清扫是在 1.1.48 版(我想是吧). 删除这些 <tt>.orig</tt> 档案会节省许多的磁碟空间. <verb> find . -name '*.orig' -exec rm -f {} ';' </verb> 将会替你照料这件事.某些版本的 <tt>patch</tt> 会用 ˜ 来代替 <tt>.orig</tt>. <p> 有其它更好的的办法可砍掉这些 <tt>.orig</tt> 档,就是利用 GNU 的 <tt>xargs</tt>: <verb> find . -name '*.orig' | xargs rm </verb> 或是更安全但有些罗嗦的方法: <verb> find . -name '*.orig' -print0 | xargs --null rm -- </verb> <sect1>其它的修补档 <p> 有一些并不是由 Linus 发行的其它修补档出现(我将称之为``非标准的''). 如果你使用了它们,Linus 的修补档可能会而无法正确地执行, 那麽你不是得将它们还原就是得因此而去修改原始程式码或是修补档.这个工作对初学者通常是很讨厌, 所以如果你不想去修改原始程式码(结果通常不大好),在使用 Linus 的修补档之前先还原这些非标准的修补档,或重新安装新的程式码. 然後试试这非标准的修补档能不能用.如果不能的话,那麽要不你就继续使用旧的核心, 试著修改修补档使其能用,要不就等待(可能是乞求)新版非标准修补档出现. <p> 非标准的修补档有多普遍? 你有可能曾经听过它们.我使用 Bill Paul 的不闪烁修补档来修改我的虚拟控制台,因为我讨厌会闪烁的游标(这个修补档经常为新版核心而更新). 由於大部份较新的设备驱动程式都已经被发展成可载入模组形式,因此许多非标准的修补档的重要性已逐渐降低. <sect>附加的套件 <p> 你的 Linux 核心有许多在原始程式码本身里面并没有说明的特性; 这些特性一般是经由外来的软体来利用,在这里列出一部分最普遍的: <sect1>kbd <p> Linux 的控制台有著比你所能吃惊更多的特色.这包括切换字型,重新对映你的键盘,切换显示模式(较新版的核心)的能力等等. kbd 这套软体里有能够让使用者做这些动作的支援程式,还加上一大堆的字型以及几乎足以适用任何键盘的一些键盘对映表. 它可在放置核心原始码的同一站台找到. <sect1>util-linux <p> Rik Faith (<tt><htmlurl url="mailto:faith@cs.unc.edu" name="faith@cs.unc.edu"></tt>) 收集了一大堆 Linux 的工具,叫做 util-linux. 现在是由 Nicolai Langfeldt (<tt><htmlurl url="mailto:util-linux@math.uio.no" name="util-linux@math.uio.no"></tt>) 所维护. 可从 sunsite.unc.edu 的 <tt><htmlurl url="ftp://sunsite.unc.edu/pub/Linux/system/misc" name="/pub/Linux/system/misc"></tt> 取得. 它包括了像 <tt>setterm</tt>,<tt>rdev</tt> 以及 <tt>ctrlaltdel</tt> 与核心有关的工具. 就像 Rik 所说的,<it>不要想都不想就把它装上去!</it> 你不需要安装此套件中的每一个东西,而且如果你这样做的话可能会引起严重的问题. <sect1>hdparm <p> 像很多软体一样,这曾经是一个核心修补档及其支援程式. 这些修补档被放入商业核心中,而用来最佳化以及调适你硬碟的支援程式一般是分开发行的. <sect1>gpm <p> gpm 是 general purpose mouse 的简写. 这个程式可以让你使用不同种类的滑鼠在虚拟控制台之间剪贴,以及做一些其它的事情. <sect>一些陷阱<label id="pitfalls"> <p> <sect1>make clean <p> 如果你的新核心会做一些真的很奇怪的事,有可能是因为在编译核心前你忘了做清除 <tt>make clean</tt>. 症状从你的核心不正常地崩溃到奇怪的输出入问题,一直到可怜的执行效率等等不一而足,可以是任何事. 最好也要确定你有做 <tt>make dep</tt>. <sect1>巨大或缓慢的核心 <p> 如果你的核心占用了大量的记忆体,或者它真的是很大很大,也或者是即使用你全新的 786DX6/440 来编译却都还像是永远编译不完的话, 那麽有可能是因为你配置了太多不必要的东西(设备驱动程式,档案系统等等). 如果你不会用到某些东西,那就不要配置它,因为它真的会占用记忆体. 核心过於臃肿最明显的症状就是发生记忆体与磁碟之间异常大量的资料交换. 如果你不是用那种声音听起来好像是喷射机降落的旧型 Fujitsu Eagles 硬碟,检查一下你的核心配置. <p> 你可以找出你机器上全部记忆体的数量,然後减掉 <tt>/proc/meminfo</tt> 里面的 ``total mem'' 或 `<tt>free</tt>' 指令所得的记忆体数量来得知核心使用了多少记忆体. 你也可以执行 `<tt>dmesg</tt>' (或者也可以查看核心的记录档,它一定在会你的系统里).看起来就像这一行: <p> <tt> Memory: 15124k/16384k available (552k kernel code, 384k reserved, 324k data) </tt> <p> 我的 386 (配置很少垃圾)显示如下: <p> <tt> Memory: 7000k/8192k available (496k kernel code, 384k reserved, 312k data) </tt> <p> 如果你`必须'得到一大型核心但系统却不让你做,你可以试试 `<tt>make bzimage</tt>'. 你可能必须安装新版的 LILO 来做这件事. <sect1>核心无法编译 <p> 如果它没有被编译,那麽可能是有个修补档失败了,或者是你从某个地方拿到的原始程式码有问题. 也有可能是因为你的 gcc 版本不正确或坏掉了(例如含入档有错误). 确定 Linus 在 <tt>README</tt> 里所描述的符号链结都有正确建立. 一般说来,如果核心没能编译,这表示在某些地方有严重的错误,重新安装某些工具可能是必须的. <p> 或者可能你用 ELF 编译器 (gcc 2.6.3 或以後的) 来编译 1.2.x 的核心. 如果编译过程中你得到一大堆的 <tt>xxxx undefined</tt> 的讯息,这可能是你的问题. 修正的方法大部份都很简单.将这几行加到 <tt>arch/i386/Makefile</tt> 的顶端: <tt>arch/i386/Makefile</tt>: <verb> AS=/usr/i486-linuxaout/bin/as LD=/usr/i486-linuxaout/bin/ld -m i386linux CC=gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include </verb> 然後重新执行 <tt>make dep</tt> 与 <tt>zImage</tt>. <p> 在少数情况下,gcc 可能会由於硬体问题而当掉.错误讯息会像 ``xxx exited with signal 15'' 之类的,而且会看起来很奇怪. 我本来不想提这点的,不过在我身上也发生过一次 - 我有一些坏的 cache 记忆体,编译器时常会随机地当掉. 如果你有此问题的话先试著重新安装 gcc.如果你将外部 cache 关掉,减少一些 RAM 之後核心就编译成功了,你大概只会觉得可疑. <p> 告诉人们他的硬体有问题常会使人困扰.不过,这不是我发明的. 这是一个 FAQ -- 可以在 <tt><htmlurl url="http://www.bitwizard.nl/sig11/" name="http://www.bitwizard.nl/sig11/"></tt> 找到. <sect1>新版的核心似乎不能启动 <p> 你没有执行 LILO ,或是没有正确的配置它.有一次我曾经碰到的问题是出在配置档里, 我用了 `<tt>boot = /dev/hda1</tt>' 而不是 `<tt>boot = /dev/hda</tt>' (这在刚开始时真的是很讨厌,但是一旦你有了一个可以用的配置档,应该不需要去再去改变它). <sect1>你忘了执行 LILO,或系统根本不能启动 <p> 噢!现在最好的办法是用磁片启动,并且准备另一张可以启动的磁片(像是`<tt>make zdisk</tt>'时做的磁片). 你得知道你的根目录(<tt>/</tt>)所在的分割区以及它的格式(second extended, minix 等等). 在下面的例子中,你也得知道你的 <tt>/usr/src/linux</tt> 原始程式码在那个分割区,它的格式,以及它一般会挂在那儿. <p> 在这个例子中, 根目录 <tt>/</tt> 是 <tt>/dev/hda1</tt>,而持有 <tt>/usr/src/linux</tt> 的分割区是 <tt>/dev/hda3</tt>,一般会挂在 <tt>/usr</tt> 下. 它们都是 second extended 档案系统.可以运作的核心映像叫做 <tt>zImage</tt> ,放在 <tt>/usr/src/linux/arch/i386/boot</tt> 底下. <p> 这个主意是这样的,假若有一个可以运作的核心映像叫做 <tt>zImage</tt>,可能可以把它用在新的磁片上. 另外一个不一定会更好的变通办法(这跟你的系统怎麽组成的有关)在说明这个例子之後会讨论到. <p> 首先,从 boot/root 磁片或者是急救磁片开机,然後将持有可运作核心的分割区挂上来: <p> <verb> mkdir /mnt mount -t ext2 /dev/hda3 /mnt </verb> 如果 <tt>mkdir</tt> 指令显示该目录已经存在,忽略掉不必理会它. 现在,<tt>cd</tt> 到持有可运作核心的地方.注意: <verb> /mnt + /usr/src/linux/arch/i386/boot - /usr = /mnt/src/linux/arch/i386/boot </verb> 把一张格式化过的磁片放进 ``A:'' 磁碟机(确定不是你的 boot/root 磁片!), 把映像档倾倒到磁片里去,然後配置你的根目录分割区: <p> <verb> cd /mnt/src/linux/arch/i386/boot dd if=zImage of=/dev/fd0 rdev /dev/fd0 /dev/hda1 </verb> <tt>cd</tt> 到根目录 <tt>/</tt> 并且卸下标准 <tt>/usr</tt> 分割区:<p> <verb> cd / umount /mnt </verb> 你现在应该可以从这张磁片正常的开机了.在这次开机後不要忘记执行 lilo (或是其它你曾经做错的什麽事)! <p> 如同前面曾经提过的,还有另外一种很普遍的变通方式. 如果情况是你有一个可以运作的核心在放在 <tt>/</tt> (例如 <tt>/vmlinuz</tt>),你也可以使用它. 假定所有的条件都跟上面的例子一样,而我的核心映像是 <tt>/vmlinuz</tt>,只要对上面的例子做这些改变: 把 <tt>/dev/hda3</tt> 改成 <tt>/dev/hda1</tt> (<tt>/</tt> 分割区), 把 <tt>/mnt/src/linux</tt> 改成 <tt>/mnt</tt>,并且把 <tt>if=zImage</tt> 改成 <tt>if=vmlinuz</tt>. 至於前面有关注意如何推导出 <tt>/mnt/src/linux/arch/i386/boot</tt> 的那个部分可以忽略. <p> 将 LILO 使用在大的硬碟上(超过 1024 磁柱)可能会有问题. 请参见 LILO mini-HOWTO 或其它文件的说明. <sect1>系统表示 `warning: bdflush not running' <p> 这可以算是一个相当严重的问题.从 1.0 版以後的核心开始(大概是在 1994 年四月二十日左右), 有个会周期性地更新档案系统缓冲区的程式叫做 `<tt>update</tt>' 被升级或取代掉了. 取得 `<tt>bdflush</tt>' 的原始程式码(你应该可以从你取得核心的地方找到), 然後编译它(你可能会希望在旧版的核心下执行编译及安装). 它会以 `<tt>update</tt>' 为名安装它自己并且在重开机以後,新核心应该会运作良好. <sect1>系统说 undefined symbols 而且无法编译 <p> 你可能有一 ELF 编译器(gcc 2.6.3 或以後的)而且是 1.2.x (或更早的)核心原始码. 一般修正的方法是将这几行加到 <tt>arch/i386/Makefile</tt> 的顶端: <p> <verb> AS=/usr/i486-linuxaout/bin/as LD=/usr/i486-linuxaout/bin/ld -m i386linux CC=gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include </verb> <p> 这会以 a.out 程式库来编译 1.2.x 核心. <sect1>无法让我的 IDE/ATAPI CD-ROM 正常工作 <p> 很奇怪,一大堆人无法让他们的 ATAPI 光碟机工作,可能是因为有太多事容易出错. <p> 你的光碟机是在一特别 IDE 界面上的唯一设备,它必须被调整为 ``master'' 或 ``single''. 这可能是最常见的错误. <p> Creative Labs 现在将 IDE 界面放到他们音效卡里. 然而,这将导致一个有趣的问题,虽然有些人只有一个 IDE 界面,许多人在主机板上有两个内建的 IDE 界面(通常在 IRQ15), 因此一解决的办法是将声霸卡的界面调成第三个 IDE (有人告诉我是 IRQ11). <p> 这在 1.2.x 的 Linux 核心上会有问题,因为它不支援第三个 IDE 界面(从 1.3.x 系列已开始支援,但它还在发展中,而且不会自动侦测). 要解决此问题,你有一些选择. <p> 如果你已经有第二个 IDE 埠,如果你没用它或没有两部设备在上面的话就有机会. 将 ATAPI 光碟机从音效卡上拿下来并放到第二个界面上.然後你可以关掉音效卡上的界面,这就可以省下一个 IRQ. <p> 如果你没有第二个 IDE 界面,调整音效卡的界面(不是音效卡的音效部份)到第二界面用的 IRQ15,这样应该会动. <p> 如果因为某些理由非得使用``第三个''界面不可,或是有其它问题, 取得 1.3.x 的核心(例如 1.3.57 就有),阅读 <tt>drivers/block/README.ide</tt> 档案. 那里有更多的资讯说明. <sect1>系统显示关於 obsolete routing requests 的奇怪讯息 <p> 取得新版的 <tt>route</tt> 程式及其它与 route 有关的程式. <tt>/usr/include/linux/route.h</tt> (这是 <tt>/usr/src/linux</tt> 下的一个档案)已经做了修改. <sect1>防火墙功能无法在 1.2.0 上工作 <p> 至少升级到 1.2.1 版. <sect1>``Not a compressed kernel Image file'' (非压缩核心映像档) <p> 不要用在 <tt>/usr/src/linux</tt> 产生的 <tt>vmlinux</tt> 做为你的启动核心映像; <tt>[..]/arch/i386/boot/zImage</tt> 才是正确的. <sect1>升级至 1.3.x 後在控制台终端机上的问题 <p> 将控制台设定档 <tt>/etc/termcap</tt> 中的 <tt>dumb</tt> 改为 <tt>linux</tt>. 你可能会必须增加一项 terminfo. <sect1>核心升级後似乎无法编译东西 <p> Linux 的核心原始程式码包含了许多的含入档(就是用 <tt>.h</tt> 结尾的档案)必须为标准的 <tt>/usr/include</tt> 所参考. 它们通常用这种方法被参考(其中 <tt>xyzzy.h</tt> 是在 <tt>/usr/include/linux</tt> 下): <verb> #include <linux/xyzzy.h> </verb> 正常情况下,在 <tt>/usr/include</tt> 下会有一叫做 <tt>linux</tt> 的连结到你的核心原始码的 <tt>include/linux</tt> 目录(一般系统在 <tt>/usr/src/linux/include/linux</tt>). 如果这个连结没有了,或指到错误的地方,大部份的东西都将无法编译. 如果你觉得核心原始码占了太多的空间而砍掉它,这显然会引发问题. 另一个可能的错误是它的档案权限; 如果你的 <tt>root</tt> 预设不让其它使用者看到他的档案, 而且你解开核心原始码时没有加上 <tt>p</tt> (保留档案模式)选项,其它使用者也会无法使用 C 编译器. 虽然你可以用 <tt>chmod</tt> 指令来修正,不过更容易的方法是重新解开含入档. 你可以一开始你解开整个原始码的同样方法,不过多加了一个参数: <verb> blah# tar zxvpf linux.x.y.z.tar.gz linux/include </verb> 请注意: 如果 <tt>/usr/src/linux</tt> 连结不在的话 ``<tt>make config</tt>'' 会重建之. <sect1>增加上限 <p> 下面一些□例指令告诉你如何增加核心提供的上限: <verb> echo 4096 > /proc/sys/kernel/file-max echo 12288 > /proc/sys/kernel/inode-max echo 300 400 500 > /proc/sys/vm/freepages </verb> <sect>升级至 2.0.x 的注意事项 <p> 核心 2.0.x 版在安装上引入了许多的改变. 在原始程式码里的 <tt>Documentation/Changes</tt> 档案包含了升级至 2.0.x 版所应知道的资讯. 你可能还需要升级一些关键的套件,例如 gcc,libc 与 SysVInit,并改变一些系统档案.不过,也别紧张. <sect>可载入模组 <p> 可载入模组能够节省记忆体,而且很容易设定. 模组的□围已经包含了档案系统,乙太网路卡驱动程式,磁带机,印表机驱动程式,还有更多. <sect1>安装模组工具 <p> 模组工具可以从你取得核心的地方找到,如 <tt>modules-x.y.z.tar.gz</tt>; 选择与你目前核心版本相等或稍低的最接近的 <tt>x.y.z</tt>. 用 `<tt>tar zxvf modules-x.y.z.tar.gz</tt>' 解开. <tt>cd</tt> 到它产生的目录(<tt>modules-x.y.z</tt>),看一下 <tt>README</tt>,然後按照安装指示执行 (通常很简单,就像 <tt>make install</tt> 之类的). 然後你在 <tt>/sbin</tt> 应该会有这些程式 <tt>insmod</tt>, <tt>rmmod</tt>, <tt>ksyms</tt>, <tt>lsmod</tt>, <tt>genksyms</tt>, <tt>modprobe</tt>, 以及 <tt>depmod</tt>. 如果你想的话,可以用 <tt>insmod</tt> 里的□例驱动程式``hw''来测试这些工具; 参见 <tt>INSTALL</tt> 档里的细节说明. <p> <tt>insmod</tt> 指令将一个模组插入运行中的核心.模组通会以 <tt>.o</tt> 为结尾; 上面提到的□例程式就叫做 <tt>drv_hello.o</tt>,因此要插入此模组,就用 `<tt>insmod drv_hello.o</tt>'. 要了解目前核心正在使用的模组,用 <tt>lsmod</tt> 指令.输出看起来像这样: <verb> blah# lsmod Module: #pages: Used by: drv_hello 1 </verb> `<tt>drv_hello</tt>' 是这模组的名称,它用了一页 (4K) 的记忆体,而且目前没有其它的核心模组依赖於它. 要移除此模组,用 `<tt>rmmod drv_hello</tt>'.注意 <tt>rmmod</tt> 需要的是<it>模组名称</it>,而不是档案名称; 就是你从 <tt>lsmod</tt> 指令列出来的.其馀工具的作用在线上手册中都有说明. <sect1>与核心发行的模组 <p> 在 2.0.30 版中,几乎所有的东西都可以变成可载入模组. 要使用可载入模组,首先确定你没有将其配置到正常的核心里,也就是说,在 `<tt>make config</tt>' 时不是回答 <tt>y</tt>. 编译新核心并用它来开机.然後,再次 <tt>cd</tt> 到 <tt>/usr/src/linux</tt>,然後执行 `<tt>make modules</tt>'. 这将编译所有你未指定在核心配置里的模组,并将其连结到 <tt>/usr/src/linux/modules</tt>. 你可以直接由此目录使用,或是执行 `<tt>make modules_install</tt>' 将其安装到 <tt>/lib/modules/x.y.z</tt>,其中 <tt>x.y.z</tt> 是核心版本. <p> 这对处理档案系统上特别便利.你可能并不经常使用 minix 或 MS-DOS 的档案系统. 例如,如果我遇到一 MS-DOS 的软碟片,我会用 <tt>insmod /usr/src/linux/modules/msdos.o</tt>,并在使用完成後用 <tt>rmmod msdos</tt> 指令将其去掉. 此过程大约可以节省核心 50K 左右的记忆体.对於 minix 档案系统有一点要注意的就是, 为了要使用``急救磁片'',你应该<it>总是</it>直接将它配置到核心中. <sect>其它配置选项<label id="other-options"> <p> 本节包括了在配置一节中未列出的核心配置选项(在 <tt>make config</tt> 时). 大部份的设备驱动程式并未列出. <sect1>General setup (一般设定) <p> <tt>Normal floppy disk support</tt> (一般软碟支援) - 就是这个. 你可能会想看一下 <tt>drivers/block/README.fd</tt> 这个档案; 对 IBM Thinkpad 的使用者来说特别重要. <p> <tt>XT harddisk support</tt> (XT 硬碟支援) - 如果你想用老古董的八位元 XT 控制器的话. <p> <tt>PCI bios support</tt> (PCI bios 的支援) - 如果你有 PCI,你可能会想打开此选项. 但要小心,某些旧的 PCI 主机板在此选项下可能会当掉.更多关於 PCI 汇流排在 Linux 下使用的资讯可以在 <htmlurl url="HOWTO/PCI-HOWTO.html" name="PCI-HOWTO"> 里找到. <p> <tt>Kernel support for ELF binaries</tt> (核心支援 ELF 执行档) - ELF 是一种新的二进位执行档. Linux 似乎正朝此方向前进,所以你可能会要这个. <p> <tt>Set version information on all symbols for modules</tt> - 在过去,核心模组与每个新核心一起被编译. 如果你回答 <tt>y</tt>,它可能让你使用不同 patchlevel 下编译的模组. 参见 <tt>README.modules</tt> 中的详细说明. <sect1>Networking options (网路选项) <p> 网路选项在 <htmlurl url="HOWTO/NET-3-HOWTO.html" name="NET-3-HOWTO"> (或是 NET-什麽-HOWTO)中描述. <sect>□诀和技巧 <p> <sect1>重导 make 或是 patch 指令的输出 <p> 如果你想要记录这些 `<tt>make</tt>' 或是 `<tt>patch</tt>' 指令到底做了些什麽, 你可以把萤幕的输出重导到一个档案去.首先,要知道你用的是是那一种 shell: `<tt>grep root /etc/passwd</tt>' 然後寻找看起来像 `<tt>/bin/csh</tt>' 一类的东西. <p> 如果你使用的是 sh 或是 bash, <verb> (command) 2>&1 | tee (output file) </verb> 将会把一份 <tt>(command)</tt> 的输出放到 `<tt>(output file)</tt>' 这个档案去. <p> 如果是 csh 或 tcsh,用 <verb> (command) |& tee (output file) </verb> 这个语法. <p> 如果是 rc (注意:你应该不会是用 rc),语法是 <verb> (command) >[2=1] | tee (output file) </verb> <sect1>条件式的核心安装 <p> 除了使用软碟片,还有数种在不动旧核心的情况下测试新核心的方法. 不像其它的 Unix 系统,LILO 具有从任何地方启动核心的能力. (不过如果你有大的硬碟,超过 500 MB 的,请参考 LILO 的文件说明将可能引起的问题.) 因此,如果你在 LILO 配置档案中用像这样的 <verb> image = /usr/src/linux/arch/i386/boot/zImage label = new_kernel </verb> 你可以在不动旧核心 <tt>/vmlinuz</tt> 的情况下选择执行新编译的核心(当然,在执行完 <tt>lilo</tt> 後). 叫 LILO 启动新核心最简单的方法就是在启动时按下 shift 键(当你在萤幕只看到 <tt>LILO</tt> 时), 这会给你一提示符号.此时你可以键入 `<tt>new_kernel</tt>' 来启动新核心. <p> 如果你想在系统中同时保有数种不同的核心原始程式码(小心,这会用掉<it>大量</it>的硬碟空间), 最普通的方法就是将其命名为 <tt>/usr/src/linux-x.y.z</tt>,其中 <tt>x.y.z</tt> 是核心版本. 然後你可以用符号连结来``选择''一份原始码; 例如,用 `<tt>ln -sf linux-1.2.2 /usr/src/linux</tt>' 会让 1.2.2 成为目前的核心树. 但在建立符号连结之前,先确定 <tt>ln</tt> 指令最後一个参数不是一个真正的目录(旧的符号连结没有关系); 否则结果可能不会是你所预期的. <sect1>核心更新 <p> Russell Nelson (<tt><htmlurl url="mailto:nelson@crynwr.com" name="nelson@crynwr.com"></tt>) 总结了新版核心的改变. 这些是简短的,而且你在升级前可能应该先看一下.可以从匿名 FTP 站 <tt>ftp.emlist.com</tt> 的 <tt><htmlurl url="ftp://ftp.emlist.com/pub/kchanges" name="pub/kchanges"></tt>, <sect>其它可能相关有用的 HOWTOs <p> <itemize> <item> Sound-HOWTO: 音效卡与工具 <item> SCSI-HOWTO: 所有关於 SCSI 控制卡与设备的资讯 <item> NET-2-HOWTO: 网路 <item> PPP-HOWTO: 特别关於 PPP 网路的 <item> PCMCIA-HOWTO: 笔记型电脑的驱动程式 <item> ELF-HOWTO: 什麽是 ELF,如何转换等… <item> Hardware-HOWTO: 支援硬体的概要 <item> Module-HOWTO: 更多与核心模组有关的 <item> Kerneld mini-HOWTO: 关於 kerneld <item> BogoMips mini-HOWTO: 你可能会有兴趣的 </itemize> <sect>杂项<p> <sect1>作者 <p> Linux Kernel-HOWTO 的作者及维护人是 Brian Ward (<tt><htmlurl url="mailto:bri@blah.math.tu-graz.ac.at" name="bri@blah.math.tu-graz.ac.at"></tt>). 请将任何评论,补充与更正寄给我(更正对我来说是特别重要的). <p> 你可以从这些 URL 找到我的网页: <tscreen><tt> <htmlurl url="http://www.math.psu.edu/ward/" name="http://www.math.psu.edu/ward/"><newline> <htmlurl url="http://blah.math.tu-graz.ac.at/~bri/" name="http://blah.math.tu-graz.ac.at/~bri/"> </tt></tscreen> <p> 虽然我尽可能地去处理电子邮件,但请记住我每天都收到<it>大量</it>的信件,所以可能要花一点时间才会回覆你. 特别是寄信来问我问题的,请尽量非常清楚与详尽地描述你的讯息. 如果你说的是某个无法运作的硬体(或类似的),我需要知道你的硬体配置是什麽. 如果你要回报错误,不要只是说``我这样试但它给我会错误讯息''; 我需要知道这个错误讯息是什麽. 我可能也想知道你的核心,gcc,libc 的版本是什麽,如果你只是告诉我你用的是这个或那个套件,那没什麽用. 我不介意你问我简单的问题; 请记住,如果你不问,你将永远不会得到解答. 我要感谢每个给我回馈的人们. <p> 如果你写信给我但在一段合理的时间内没有得到回应(三星期或更久),那麽可能我不小心砍掉了你的信件或诸如此类的(抱歉). 请再试一次. <p> 我收到许多信件是关於硬体问题的.这没问题,但请了解我并不是熟悉世界上所有硬体的人而且我也不知道我能帮多少忙. 我个人使用的机器有 IDE 与 SCSI 硬碟,SCSI 光碟机,3Com 与 WD 的乙太网路卡,串列滑鼠, PCI 主机板,NCR 810 SCSI 控制器,AMD 386DX40 w/Cyrix 辅助处理器,AMD 5x86,AMD 486DX4 与 Intel 486DX4 处理器 (这只是我在使用而且熟悉的硬体摘要,并不是建议,但如果你想要用,欢迎来询问 <tt>:-) </tt>). <p> 0.1 版完成於 1994 年十月三日.本文件可以 SGML, PostScript, TeX, roff 与纯文字格式取得. <sect1>预定目标 <p> ``□诀和技巧'' 一节太少了.我希望能用从别人得到的建议来扩充. <p> ``附加的套件'' 一节也是. <p> 还需要更多的侦错/当机回复资讯. <sect1>贡献者 <p> 包含了一小部份 Linus 的 README 档案 (kernel hacking 选项).感谢 Linus! <p> <tt>uc@brian.lunetix.de</tt> (Ulrich Callmeier): patch -s and xargs.<p> <tt>quinlan@yggdrasil.com</tt> (Daniel Quinlan): corrections and additions in many sections.<p> <tt>nat@nat@nataa.fr.eu.org</tt> (Nat Makarevitch): mrproper, tar -p, many other things<p> <tt>boldt@math.ucsb.edu</tt> (Axel Boldt): collected descriptions of kernel configuration options on the net; then provided me with the list<p> <tt>lembark@wrkhors.psyber.com</tt> (Steve Lembark): multiple boot suggestion<p> <tt>kbriggs@earwax.pd.uwa.edu.au</tt> (Keith Briggs): some corrections and suggestions<p> <tt>rmcguire@freenet.columbus.oh.us</tt> (Ryan McGuire): makeables additions<p> <tt>dumas@excalibur.ibp.fr</tt> (Eric Dumas): French translation<p> <tt>simazaki@ab11.yamanashi.ac.jp</tt> (Yasutada Shimazaki): Japanese translation<p> <tt>jjamor@lml.ls.fi.upm.es</tt> (Juan Jose Amor Iglesias): Spanish translation<p> <tt>mva@sbbs.se</tt> (Martin Wahlen): Swedish translation<p> <tt>jzp1218@stud.u-szeged.hu</tt> (Zoltan Vamosi): Hungarian translation<p> <tt>bart@mat.uni.torun.pl</tt> (Bartosz Maruszewski): Polish translation<p> <tt>donahue@tiber.nist.gov</tt> (Michael J Donahue): typos, winner of the ``sliced bread competition''<p> <tt>rms@gnu.ai.mit.edu</tt> (Richard Stallman): ``free'' documentation concept/distribution notice<p> <tt>dak@Pool.Informatik.RWTH-Aachen.DE</tt> (David Kastrup): NFS thing<p> <tt>esr@snark.thyrsus.com</tt> (Eric Raymond): various tidbits<p> 曾寄信给我问问题的人也有很大帮助. <p> <sect1>版权声明,许可,诸如此类的 <p> Copyright © Brian Ward, 1994-1997.<p> Permission is granted to make and distribute copies of this manual provided the copyright notice and this permission notice are preserved on all copies.<p> Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the derived work is distributed under the terms of a permission notice identical to this one. Translations fall under the catagory of ``modified versions.'' <p> Warranty: None.<p> Recommendations: 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 (you could send me a copy of the thing you're making while you're at it). Translators are also advised to contact the author before translating. The printed version looks nicer. Recycle.<p> </article>