翻译文档LinuxKernelHOWTO.docx
- 文档编号:4456122
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:19
- 大小:39.07KB
翻译文档LinuxKernelHOWTO.docx
《翻译文档LinuxKernelHOWTO.docx》由会员分享,可在线阅读,更多相关《翻译文档LinuxKernelHOWTO.docx(19页珍藏版)》请在冰豆网上搜索。
翻译文档LinuxKernelHOWTO
Linux内核帮助手册
布赖恩·沃德,bri@cs.uchicago.edu
1.0版,1999年6月5日
这是一份对基于英特尔x86架构的系统进行内核配置、编译、升级和解决相关问题的详细指南。
1简介:
你真的需要读这篇文档吗?
好,看看你是否已经有下面的一些症状:
啊!
这份wizzo-46.5.6的软件包说它需要2.8.193版本的内核,但我只有1.0.9版本!
新版本的内核里有一个你已经有的设备的驱动程序
你确实完全不知道如何编译一个内核
Readme里面真的包含了所有的内容了吗?
你尝试过,你努力了,但它还是不能工作。
你需要给那些坚持让你为他们安装内核的人一些东西。
1.1先读读这里!
这篇文档中的一些例子假定你已经有了GNU下的tar、find和xargs程序,它们都是非常标准的,这不会引起任何问题。
同时也假定你知道你的计算机中的文件系统结构。
否则,你要赶紧把mount命令在一般的系统操作下输出的结果记下来作为参考(或者是/etc/fstab下的文件列表,如果你能够看懂的话)。
这些信息很重要,而且只要你不重新划分或添加新的硬盘、重新安装系统或是进行其他类似的操作,它就不会改变。
本文写作时作为“产品”的最新的内核版本是2.2.9,这意味着所有的例子和参考都是和该版本相一致的。
虽然我尽力使得这篇文档和内核的具体版本无关,但是内核总是在不断开发的,所以如果你得到了一个更新的版本,它难免会存在一些不同。
同样的,这不会造成什么大问题,但可能会引起一点混乱。
Linux的内核源代码有两类版本:
“产品版”和“开发版”。
产品版是版本号的第二个数字为偶数的版本,比如1.2.x、2.0.x、2.2.x等都是产品版。
这样的内核被认为是最稳定、没有问题的版本。
在当时发行的版本中是可以使用的。
而开发版(例如2.1.x、2.3.x等)代表正在测试的内核,是给那些想要测试内核并发现可能存在的问题的人用的。
我已经警告过你了。
1.2风格简介
这样一些文本或许会出现在你的屏幕上:
一个文件名,或是像一个命令或命令的选项一样可以直接被键入的东西(如果你看到的是一个纯文本文件,这看起来没有什么不同)。
命令和其他的输入经常被引用(用‘’符号),这会引起下面的典型标点问题:
如果这样的一项出现在一个被引用的句子的结尾,人们通常会和这个命令一起键入一个“.”号。
因为美国人的引用习惯是把分段号放在引用符号的里面。
即使常识(不幸的是,这里假设这个“常识”被用在所谓的美国人的引用习惯中)告诉我们应当分出这个标点,很多人还是不会记得。
所以我在这种情况下会把它放在引号的外面,换句话说,当说明需要键入“makeconfig”时,我会写“makeconfig”,而不是“makeconfig.”
2重要的问题及其答案
2.1内核到底是干什么的?
Unix的内核在你的硬件设备和程序之间担当着调节员的工作。
首先,它为正在运行的程序(进程)实现或安排内存管理,并确保它们都能公平(或者不公平,如果你喜欢的话)地分享处理器的时间。
另外,它为程序提供一个友好的、十分方便的接口来和硬件对话。
内核的功能当然比这些要多,但这些基本的功能是必须知道的。
2.2为什么我想要升级我的内核?
更新的内核一般会提供访问更多种类的硬件的能力(那是因为它们有更多的设备驱动程序),它们可以有更好的进程管理,能够比旧的内核运行的更快,也能够比旧的内核运行的更稳定,而且它们能够改进旧版本的一些愚蠢的错误。
大多数人是为因为需要设备的驱动程序和对错误的改进而升级内核。
2.3新的内核支持什么样的硬件?
请看硬件的帮助手册。
你也可以看看Linux内核源码中的“config.in”文件或者在你尝试“makeconfig”的时候找出来,它会显示出正式的内核发行版本支持的全部硬件,但并不是Linux支持的所有设备。
很多通用的设备驱动程序(例如PCMCIA驱动和一些磁带机驱动)是单独维护和发布的可加载模块。
2.4我需要什么版本的gcc和libc?
Linus会在Linux源代码包含的readme文件中推荐gcc的版本,如果你没有这个版本,所推荐版本的gcc中的文档会告诉你是否需要升级你的libc,这并不是一个困难的过程,但根据说明来操作十分重要。
2.5什么是可加载模块?
它们是不直接链接(包含)在内核中的内核代码片断。
一个模块单独编译,并可以在几乎任何时间被插入到正在运行的内核中或是从内核中删除。
由于其灵活性,它现在是编写某些内核特性代码的首选方式。
很多流行的设备驱动程序,例如PCMCIA驱动程序和QIC-80/40磁带机驱动程序,都是可加载模块。
2.6我需要多大的磁盘空间?
这取决于你自己特定的系统配置。
首先,2.2.9版本的Linux源代码压缩后大约有14MB,很多时候在解包后仍然保持这个大小。
在解压缩并进行一个中等程度的配置后,它将另外占去67MB的空间。
2.7这需要花费多少时间?
在更新的机器上,编译所花费的时间要明显少于旧的机器,一台带有高速磁盘的AMDK6-2/300计算机编译2.2.x版本的内核大约需要几分钟,至于老式的奔腾计算机、486、386等,如果你打算进行编译的话,需要做好等待的准备,可能是几小时,甚至几天。
3如何实际配置一个内核
3.1获得源代码
你可以从ftp.kernel.org这个ftp站点上的/pub/linux/kernel/vx.y目录下匿名得到源代码,其中x.y是版本号(例如2.2)。
正如前面提到的,以奇数结尾的是开发版本,可能是不稳定的。
它们被加上linux-x.y.z.tar.gz的标签,其中x.y.z是版本号,这个网站也提供由bzip2程序压缩的.bz2后缀名的文件(这些文件更小,在传输的时候所花费的时间更少)。
最好使用ftp.xx.kernel.org的ftp地址,其中xx是国家代码;例如ftp.at.kernel.org是奥地利的地址,而ftp.us.kernel.org是美国的地址。
3.2将源代码解包
以root用户身份登陆,并用cd命令切换到/usr/src目录下,如果你在当初安装Linux的时候安装了源代码(像大多数情况一样),这里会有一个叫做“linux”的目录包含整个原有的源代码树。
如果你有足够的硬盘空间又想保证安全,先保存一下这个目录。
一个好办法是搞清楚你当前系统上运行的内核的版本并据此把目录重新命名。
“uname-r”命令可以打印出当前的内核版本号。
因此如果“uname-r”命令显示为“1.0.9”,你需要将目录名(使用“mv”命令)由“linux”改为“linux-1.0.9”。
如果你完全不顾后果,那就把整个目录清除掉。
无论如何,要保证在你解压缩整个源代码包之前,/user/src目录下没有“linux”这个子目录。
现在,在/usr/src目录下,用“tarzxpvflinux-x.y.z.tar.gz”命令将源代码包解开(如果你得到的是一个以.tar为后缀名而后面没有.gz的文件,则使用“tarxpvflinux-x.y.z.ta”命令),源代码的内容将被展开。
当解压完成后,/usr/src目录下将生成一个新的“linux”目录。
用“cd”命令切换到该目录下,浏览一下“README”文件,其中会有一段名为“安装内核”的内容。
在适当的时候按这里的步骤执行——符号链接必须合适,所有旧的.o文件都已经删除,等等。
如果你有一个.bz2后缀名的文件和bzip2程序(读读http:
//www.muraroa.demon.co.uk/上的有关内容),执行下面的命令:
bz2catlinux-x.y.z.tar.bz2|tarxvf-
3.3配置内核
注意:
这里的部分内容是对Linus的README文件中类似部分的重复和澄清。
在/usr/src/linux目录下执行“makeconfig”命令将启动一个配置脚本,询问你很多内容。
这需要有bash,所以先确认你的bash是/bin/bash、/bin/sh或者$BASH。
但是,有一些比“makeconfig”好的多的选择,你会发现它们用起来更加方便和舒服。
“makemenuconfig”可能是使用最广泛的。
不管你选择使用哪种方式,最好首先熟悉一下界面,因为你会发现它的发展比你想象中还要快。
对于在Xwindow下运行的系统,如果装有TK的话可以尝试“makexconfig”命令。
“makemenuconfig”是为那些装有(n)curses而且更喜欢文本界面菜单的人准备的。
这些界面具有更加清晰的优点:
如果你在配置过程中出现了错误的选择,只需要返回去把它们改正就可以了。
在“makemenuconfig”和“makexconfig”方式下,配置选项是按层次显示的。
你已经准备好回答这些问题,通常是使用“y”(yes)或“n”(no)。
设备驱动程序还特别有一个“m”的选项,它的意思是“模块”。
这意味着系统会编译它,但并不直接编进内核中,而是作为一个可加载的模块。
一个更有趣的方式是把它描述为“maybe”。
一些更显然和不重要的选项并没有在这里提到,其他一些内容的简单介绍可以参见“其他配置选项”部分。
用空格键可以进行段落跳转。
在2.0.x及以后的版本中,有了一个“?
”选项,可以对配置参数进行简要的描述。
那里的信息应当是最新的,这里列出了一些重要的特性,它们位于什么层次,和一些简单的描述。
内核的数学运算模拟(处理器种类和特性)
如果你没有数学协处理器(只有一个单独的386或是486SX),你需要在此回答“y”。
如果你有了协处理器却仍然回答“y”也不用太担心——协处理器仍然会被使用,而模拟将被忽略,对任何较新的处理器,这里的回答都是no,但即使你不小心回答了yes也不必担心,如果不需要的话,它是不会被使用的。
增强型(MFM/RLL)硬盘和IDE硬盘/光驱支持(块设备)
你可能需要支持这些;这意味着内核需要支持大部分人都会有的标准的PC硬盘。
这个驱动并不包括SCSI驱动,它们很快将在配置中被引入。
你将被问到关于“olddisk-only”和“newIDE”驱动的情况,你需要从二者中选择一个。
它们的主要区别是“olddisk-only”支持在一个接口上连接两块硬盘,而“newIDE”支持二级接口和IDE/ATAPI光驱的驱动。
新的驱动比老的要大4KB,而且应当是“改进的”。
这意味着除了包含不同数量的问题以外,它会改进你的硬盘的性能,特别是如果你有更新的(EIDE类型)硬件的话。
网络设置(通用设置)
在原理上,只有你的机器连接到像因特网之类的网络上,或者你打算使用SLIP、PPP、term等方式拨号连接因特网,你才需要在这里回答“y”。
然而由于很多软件包(比如Xwindow系统)需要有网络支持,即使你并没有真正连接网络,你也需要在这里回答“y”。
稍后,你将被问到是否支持TCP/IP网络;同样的,如果你不能完全确定的话,回答“y”。
SystemVIPC(通用设置)
IPC(进程间通信)的一个最好的定义在Perl书籍的术语表中。
这毫不奇怪,一些Perl的程序员利用它使得进程间能够互相对话,就像很多其他的软件包一样(比如著名的DOOM)。
所以除非你确切的知道自己在干什么,否则回答“n”不是一个好主意。
处理器类型(处理器种类和特性)
(在旧版的内核中:
使用–m486标记启动486特效的优化)
传统上,该编译选项会为特殊的处理器做某些优化。
这样的内核在别的芯片上也会正常工作,但它可能会更大一些。
但是在更新的内核中就不一定了,因此你需要输入你编译的内核所对应的处理器类型。
一个“386”的内核可以在任何的机器上工作。
SCSI支持
如果你有SCSI设备,回答“y”。
它将会提示你一些进一步的信息,例如对光驱、硬盘、或是你有的其他SCSI适配器的支持。
进一步的细节请参见SCSI的帮助文档。
网络设备支持
如果你有一个网卡,或者你想使用SLIP、PPP或是并口适配器连接因特网,回答“y”。
配置脚本会询问你有何种网卡,使用什么协议。
文件系统
之后配置脚本会问你是否需要支持如下的文件系统:
标准(minix)——更新的发行版本不会创建minix文件系统,而且很多人也不用它,但最好还是把这项配置加上。
一些磁盘恢复程序会用到它,而且很多软盘可能还有minix的文件系统,因为minix文件系统用于软盘较为可靠。
Secondextended——这是Linux的标准文件系统,你几乎可以肯定会有它,因此选择“y”。
Msdos——如果你想使用你的MS-DOS硬盘分区,或者挂载MS-DOS格式的软盘,选择“y”。
还有其他很多可以使用的不同的文件系统。
/proc——(我猜它来自贝尔实验室)。
硬盘上并不存在proc文件系统。
这是一个面向内核和进程的文件系统接口,很多进程列表使用它。
有时可以尝试使用“cat/proc/meminfo”或“cat/proc/devices”命令。
有些shell(特别是rc)使用/proc/self/fd(在其他系统里叫做/dev/fd)进行I/O。
你在这里基本上一定会选择“y”;很多重要的linux工具依赖它。
NFS——如果你的机器依赖于网络,而且你想通过NFS使用其他计算机系统上的文件系统,选择“y”。
ISO9660——存在于大多数CD-ROM上,如果你有一个光驱并想在Linux下使用它,选择“y”。
但我不知道我需要什么文件系统!
好吧,输入“mount”,输出一般会像下面这样:
bash#mount
/dev/hda1on/typeext2(defaults)
/dev/hda3on/usrtypeext2(defaults)
noneon/proctypeproc(defaults)
/dev/fd0on/mnttypemsdos(defaults)
一行一行的看;紧接着“type”的是文件系统的类型。
在这个例子中,我的“/”和“/usr”文件系统都是“secondextended”。
我正在使用“/proc”,这是一个挂载的软盘,使用msdos文件系统。
如果你当前的“/proc”是可用的,你可以试试“cat/proc/filesystems”命令;它会列出你当前内核的文件系统。
对那些很少用到的、不重要的文件系统进行配置会造成内核的膨胀。
可以参见模块部分来避免这种情况,看看“缺陷”部分来了解为什么内核膨胀是不好的。
字符设备
这里,你启动了你的打印机(我是指并口打印机)、总线鼠标、PS/2接口鼠标(很多笔记本电脑为它们内部的导航球使用PS/2接口鼠标的协议)的驱动,一些磁带设备驱动,和很多这样的“字符设备”的驱动。
在适当的情况下选择“y”。
注意:
gpm是一个可以让鼠标在Xwindow系统以外的虚拟控制台之间进行复制和粘贴的程序。
如果你有一个串口鼠标最好,因为它可以和Xwindow很好的共存,但是如果你使用其他类型的鼠标就需要一点技巧了。
声音
如果你很想听到biff程序发声的话,选择“y”。
你可以告诉配置程序关于你的声卡的全部信息(关于声卡配置的一点注意:
当它询问你是否需要安装完整版本的驱动程序时,你可以回答“n”而只选择你认为需要的特性,以节省一些内核存储空间)。
如果你对声卡的支持很关心,可以看看http:
//www.linux.org.uk/OSS/上的免费驱动和SoundSystem。
其他配置选项
这里并没有列出所有的配置选项,因为它们变化得太快或是太显然(例如,对3Com3C509的支持只需要单独编译这块网卡的驱动程序)。
这里有所有选项的一个相当全面的列表(以及把它们加入配置脚本中的方法),它由埃克赛尔·伯尔特(boldt@math.ucsb.edu)发起并维护,是一个在线的帮助文件。
也可以在你的2.0以后版本的Linux内核源代码树中的Documentation/Configure.help文件中找到。
内核堆砌
来自Linus的README文件
“内核堆砌”的配置细节通常导致内核变大或变慢(或两者兼有),甚至可能由于配置一些程序去积极的中断有问题的代码以发现内核的问题而造成系统的不稳定。
因此当你被问到需要一个“产品版”的内核的时候,应当回答“n”。
3.4现在呢?
(Makefile)
在你配置完成后,一条信息会告诉你内核已经被配置完成,并“检查顶层Makefile文件中的额外配置”等等。
因此,看看Makefile。
你可能不需要去修改它,但看看总没有坏处。
当新的内核配置好以后,你也可以用“rdev”命令去修改它的选项。
如果你在看这个文件的时候被弄糊涂了,也不需要太担心。
4编译内核
4.1清除与依赖
当配置脚本完成后,它也会告诉你去“makedep”和(可能有)“clean”。
所以,执行“makedep”,这会确保所有的依赖关系,比如头文件,设置正确。
这不会花费很多时间,除非你的电脑本来就很慢。
对于较早版本的内核,你需要在结束的时候执行一下“makeclean”。
它会删除原有版本留下的目标文件和其他的一些东西。
无论如何,在尝试重新编译内核之前都不要忘记这一步。
4.2编译时间
在关联和清除完成后,你现在可以执行“makebzImage”或“makebzdisk”(这是需要花费较多时间的一步)。
“makebzImage”命令将编译内核,并在arch/i386/boot目录下留下一个名为“bzImage”的文件(和其他文件一起),这是新生成的压缩内核。
“makebzdisk”完成同样的事情,但是把新的bzImage文件放在你插进驱动器A:
里的软盘上。
“bzdisk”是用于测试新内核的相当方便的手段,如果它崩溃了(或者只是工作不正常),只需要拔掉软盘并从你的旧内核启动就行了。
如果你不小心删除了你的内核(或是发生了其他类似的可怕事情),它也可以很方便的启动。
当你把一个磁盘上的内容转移到另一个磁盘上时,你也可以用它来安装新的系统(除此以外还有很多!
现在你觉得如何呢?
)。
所有较新的内核都是压缩的,因此在名字前面有“bz”。
一个压缩的内核在执行的时候会自动解压缩。
在原先的内核中,你没有生成bzImage文件的选项,只有一个简单的zImage。
这个选项现在仍然可以使用,但是会使新的内核和代码一样大,现在基本上都必须生成bzImage了,因为旧的方法不能处理现在这种过于庞大的内核。
4.3其他可以make的东西
“makemrproper”会做一些比“clean”更多的事情,这有时是必要的。
你可能希望对每一个补丁包都这么做。
“makemrproper”也会删除你的配置文件,因此如果你觉得它(.config文件)有价值的话,可能想对它做个备份。
“makeoldconfig”会尝试根据一个旧的配置文件去配置内核,它会为你执行“makeconfig”的过程。
如果你还没有编译过内核或是没有旧的配置文件,那你可能就无法使用它,因为你很可能想要修改默认的配置。
请参见模块部分描述“makemodules”的章节。
4.4安装内核
在你有了一个似乎能够按照你的要求工作的新内核后,你应当安装它。
大多数人使用LILO(Linux装载器)来完成这个事情。
“makebzlilo”命令会安装内核,在上面运行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”是所指定的操作系统的“/”目录。
对你的旧内核做好备份,把你刚才生成的bzImage文件复制到指定的位置(如果你使用的是/vmlinuz,则使用“cpbzImage/vmlinuz”命令)。
然后重新执行lilo——在新的系统上,你可以只运行“lilo”,但是在比较老的版本上,你可能需要执行/etc/lilo/install或者甚至是/etc/lilo/lilo-C/etc/lilo/config。
如果你想了解更多关于LILO的配置,可以从你喜欢的ftp服务器上获取最新的版本并按照说明执行。
要运行你硬盘上的一个旧的内核(这是另一个在你的新内核出现问题时进行补救的办法),把下面这行LILO的配置文件中所有的(包含)“image=xxx”复制到文件的最底部,然后把“image=xxx”改成“image=yyy”,其中“yyy”是你保存你的备份内核的完整的路径名。
然后把“label=zzz”改成“label=linux-backup”并重新运行lilo。
你可能需要在配置文件中加上一行“delay=x”,其中x是以十分之一秒为单位的时间,它告诉LILO在启动前需要等待多长时间,因此你可以打断它(例如用shift键),并输入备份的启动映像文件的名字(如果出现了什么异常情况的话)。
5为内核打补丁
5.1应用一个补丁
对内核不断的升级是以补丁包的形式发布的。
例如,你有一个1.1.45版本的内核,而且你注意到有一个该版本的“patch46.gz”补丁包,这意味着你可以通过使用这个补丁包升级到1.1.46版。
你可能首先想对内核树进行备份(“makeclean”之后执行“cd/usr/src;tarzcvfold-tree.tar.gzlinux”会为你生成一个压缩的归档文件)。
因此,继续我们上面的例子。
我们假设你在/usr/src目录下有“patch46.gz”文件。
切换到/usr/src目录下执行“zcatpatch46.gz|patch-p0”(或者是“patch-p0 你会看到很多内容快速掠过(或者是慢慢滑过,如果你的系统真的是那么慢的话),告诉你正在进行修改,不管它是否成功。 通常这些动作执行的非常快以至于你来不及去阅读,而且你也不太确定它是否被执行,因此你可能想对patch命令使用-s参数,它只会报告错误信息(这样你就不会得到像“嘿,我的电脑正在进行一些改变”的感觉,但你可能更喜欢这样…).为了寻找那些进行的并不顺利的部分,切换到/usr/src/linux目录下,查找以.rej为扩展名的文件。 某些版本的补丁包(教老的版本可能是在低等的文件系统上编译的)会把这些错误记录保存在以“#”为后缀名的文件里。 你可以使用“find”命令来帮你查找: find.-name'*.rej'-print 它会在标准输出上打印出当前目录及其任何子目录下以.rej为后缀名的所有文件的名称。 如果一切顺利,按照第三和第四部分的描述,执行“makeclean”、“config”和“dep”。 patch命令有很多参数,如前所述,patch–s将抑止除了错误信息以外的所有其他信息,如果你把内核源代码放在除了/usr/src/linux以外的别的某个地方,patch-p1(在哪个目录下)会干脆的进行修补。 patch的其他参数在帮助手册中有详细的列出。 5.2如果出现了问题 (注意: 该部分提到的主要是旧版本的内核) 最
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 翻译 文档 LinuxKernelHOWTO