28 编译内核

后退

V部分. 构建系统

前进


28 编译内核

内容列表

28.1. 安装内核源代码

28.2. 编译需求与过程

28.3. 创建内核配置文件

28.4. 手动配置内核

28.5. 产生依赖文件并手动重新编译

28.6. 使用 build.sh

28.7. 如果产生错误

大多数NetBSD的使用者,迟早会编译一个定制内核。这有许多好处。

l        你可以大量的精简内核尺寸及内核的内存占用量(例如内存占用从2.5M减小到1.2M)。在NetBSD2.0上,编译一个定制内核,可以将内核从7.5M减小到3.5M

l        你可以提高系统性能。

l        你可以调节你的系统。

l        你可以解决外围设备的检测/冲突问题。

l        你可以订制一些选项(例如键盘布局,BIOS时钟偏置)。

l        你可以获得系统更底层的知识。

28.1 安装内核源代码

你可以通过AnonCVS(参见第26章《用CVS得到源代码》)或者通过syssrc.tgz压缩包来取得内核源代码。syssrc.tgz放在你所使用系统版本的目录中的source/sets/下。如果你使用后一种方式,那么可以以root身份用下面的方法解开压缩包:

# cd /
# tar zxf /path/to/syssrc.tgz

如果你使用的AnonCVS,就请稍微忍耐一下,用这种方式取得内核源代码会花费一段很长的时间,因为源码仓库里面有很多源码文件。

一旦你有了内核源代码,你就可以创建出一个定制的内核:这并没有你想象的那么难。事实上,如本章下面几节所讲的,新内核可以用几个简单的步骤创建出来。

28.2 编译需求与过程

为了重新编译内核,你必须安装有包含编译器的包(comp.tgz)。

基本的内核编译步骤如下:

1.     创建/修改内核配置文件

2.     配置内核

3.     产生依赖文件

4.     编译内核

5.     安装内核

这些步骤既可以手动实现,又可以使用在第27章《使用build.sh交叉编译NetBSD》中介绍的build.sh命令来实现。这一节首先为你介绍怎样手动编译一个原生内核,接着再介绍怎样使用build.sh完成这个工作。

28.3 创建内核配置文件

本节描述的是以i386目录为例。使用其他体系的用户必须将其替换为适当的目录,取得体系的列表可以参见src/sys/arch下的子目录。

内核配置文件中,定义了内核所支持设备的类型、数量和特性,同时还包含许多内核配置选项。对于i386体系来说,内核配置文件放在/usr/src/sys/arch/i386/conf目录里。

需要注意的是,由于历史原因内核配置文件的文件名是大写的,如此便可以很清楚的与同一目录中其他文件区分出来:

$ cd /usr/src/sys/arch/i386/conf/
$ ls
CARDBUS                 GENERIC_PS2TINY         NET4501
CVS                     GENERIC_TINY            SWINGER
DELPHI                  GENERIC_VERIEXEC        SWINGER.MP
DISKLESS                INSTALL                 VIRTUALPC
GENERIC                 INSTALL.MP              files.i386
GENERIC.FAST_IPSEC      INSTALL_LAPTOP          kern.ldscript
GENERIC.MP              INSTALL_PS2             kern.ldscript.4MB
GENERIC.MPDEBUG         INSTALL_SMALL           largepages.inc
GENERIC.local           INSTALL_TINY            majors.i386
GENERIC_DIAGNOSTIC      IOPENER                 std.i386
GENERIC_ISDN            LAMB
GENERIC_LAPTOP          Makefile.i386

创建一个新配置文件的最简单的方法是拷贝一个已经存在的配置文件,然后修改这个拷贝。通常,对大多数平台来说GENERIC配置是最好的选择,因为它包含大多数设备和内核选项。在配置文件中,每一个选项后都有简单的描述;更详细的描述可以参见man手册中的options(4)。如上所说,最一般的操作过程是:

$ cp GENERIC MYKERNEL
$ vi MYKERNEL

对内核配置文件的修改基本上来说有三种操作:

1.     维护那些 包含或不包含 在内核中的硬件设备(比如,如果不需要的话,对SCSI的支持可以去除)。

2.     维护那些 允许或禁止 的内核特性(比如,允许对NFS客户端的支持,允许Linux兼容,...)。

3.     调节内核参数。

以注释符"#"开始的行都被注释;添加注释符使行变得无效,去除注释符使行有效。要取消行,最好使用注释,而不是删除它们;因为注释以后还可以为它们去掉注释。

dmesg(8)命令的输出可以用来决定哪些行可以被注释掉。它的输出有下面的格式:

XXX at YYY

那么XXXYYY都必须在内核配置文件中设置为有效。你可能需要试验很多次来得到最小的内核,可是在没有SCSIPCMCIA设备的桌面系统中,至少可以减小一半的内核尺寸。

你应该检查配置文件中的选项,屏蔽掉你不需要的那些。每一个选项都有一个简短的注释来描述它,这些描述基本可以使你明白该选项的作用。许多选项的更长、更详细的描述可以在man手册的options(4)里面找到。在配置文件中,你应该根据你所在的位置为你的CMOS时钟设置一个正确的本地时间。例如:

options RTC_OFFSET=-60

Perl脚本adjustkernel(可以在pkgsrc里面找到)分析dmesg(8)的输出,然后自动生成一个最小内核的配置文件。虽然包的安装在第30章《程序包的集合》中有更详细的介绍,但在这里我们还是简单的说一下adjustkernel的安装

$ cd /usr/pkgsrc/sysutils/adjustkernel
$ make install

安装之后,你可以以下面的方式运行脚本:

$ cd /usr/src/sys/arch/i386/conf
$ adjustkernel GENERIC > MYKERNEL

这个脚本通常可以很好的工作,省去很多手动编辑配置文件的麻烦。但是应该注意到,该脚本只能配置系统可用的设备:你还是有必要手动配置其它内核选项。

28.4 手动配置内核

当你修改了内核配置文件(我们称之为MYKERNEL)之后,你就可以输入下面的命令:

$ config MYKERNEL

如果MYKERNEL没有任何错误,config(8)程序将会产生编译内核所需要的一些文件,否则必须修改那些错误,然后再一次执行config(8)

28.5 产生依赖文件并手动重新编译

依赖文件的产生与内核的编译可以用下面的命令来实现:

$ cd ../compile/MYKERNEL
$ make depend
$ make

当有错误发生时它们会停止执行;有许多可能导致出现错误的原因,可是大多数常见的原因是那些在运行config(8)时没有捕捉到的配置文件中的错误。一些时候,错误也来自于硬件的原因(通常是RAM芯片的问题):因为内核编译时,系统负荷比大多数应用程序的编译更高。另外一种常见的错误是:依赖于选项A的选项B有效,而选项A却无效。内核的完全编译可以持续几分钟到几个小时,这要看所运行的硬件。

make命令之后,就在compile目录中产生出netbsd内核文件:应该在备份根目录中旧的netbsd文件之后,将这个新产生的netbsd内核文件拷贝到根目录。

# mv /netbsd /netbsd.old
# mv netbsd /

定制内核可以明显的精简内核尺寸。在下面的例子中,netbsd.old是以前安装的内核,netbsd是新产生的内核。

-rwxr-xr-x  3 root  wheel  3523098 Dec 10 00:13 /netbsd
-rwxr-xr-x  3 root  wheel  7566271 Dec 10 00:13 /netbsd.old

新内核在重新启动之后就可以起作用了。

# shutdown -r now

28.6 使用build.sh

创建和修改(可能的)内核配置文件之后,可以使用src/build.sh脚本,以如下说述的方式,一次性完成那些手动配置内核的步骤,自动产生依赖文件,直到重新编译完成:

$ cd /usr/src
$ ./build.sh kernel=MYKERNEL 

这个脚本将会执行与手动操作一样的步骤,但是有一小点区别:在编译之前,所有旧的object文件都将被删除,以此来开始全新的内核创建工作。这样做是比较费事的,因为有时候只需要重新编译那些依赖产生变化的文件,而保留其余的旧object文件。为了达到这个目的,可以为build.sh添加-u选项:

$ cd /usr/src
$ ./build.sh -u kernel=MYKERNEL 

这项操作完成的时候,build.sh会打印出存放新内核的目录地址。然后可以像上面28.5节《产生依赖文件和手动重编译》中介绍的步骤那样安装内核。

28.7 如果产生错误

当安装新内核并重新启动计算机的时候,系统可能不按照我们所期望的那样工作,更或者根本就不能启动。不要担心:如果这种情况发生了,可以使用以前备份的旧内核重新启动计算机,删除新内核(最好是引导进单用户模式):

l        重新启动机器

l        在引导提示的倒计时的5秒钟之内按下空格键

boot:

l        键入下面内容

> boot netbsd.old -s

l        依次执行下面的命令来恢复以前的旧内核:

# fsck /
# mount /
# mv netbsd.old netbsd
# reboot

这样将使你回到你编译新内核之前的系统去,然后你可以改变内核配置文件,直到新产生的内核可以完全工作。一般来说,从配置GENERIC内核开始,逐渐修改配置,是很好的做法。


后退

向上

前进

27 使用 build.sh 交叉编译NetBSD

主页

29 控制台驱动程序