Chapter 7. 编译核心

Table of Contents
7.1. 安装核心原始码
7.2. 意大利式的键盘配置
7.3. 重新编译核心
7.4. 产生核心设定档
7.5. 设定核心
7.6. 产生 dependencies 和重新编译
7.7. 如果发生错误

大部分的 NetBSD 使用者,不论早晚都将会编译一个个人化的核心。 这带给你许多好处:

7.1. 安装核心原始码

安装程序 Sysinst 并不会将核心原始码 复制到硬盘上,因此它们必须被手动地安装。核心原始码档案位于 source/sets 目录且命名为 syssrc.tgz

# gzip -dc syssrc.tgz | (cd / ; tar xvf -)
    

请耐心等待:这个作业会花费数分钟,因为这个压缩档包含成千个档案。 原始码会位于 /usr/src/sys;会有一个 炼结 sys 指向这个目录。所以底下的作业会有 相同的效果:

# cd /usr/src/sys
# cd /sys
    

在完成解压缩之后,你可以移除不需要的架构所在目录,以保留 硬盘空间。cd/sys/arch 并且删除你不需要的目录。在 i386 平台为例,你可以只保留 i386 目录。对其他的平台而言,可能需要保留不只一个目录。

在原始码完成安装以后,你便可以建立个人化核心:这并没有 你想象中的困难。事实上,建立新的核心只需四到五个步骤, 将会在以下的段落中做描述。

7.2. 意大利式的键盘配置

在编译核心以前,意大利使用者应该考虑修改预先定义的键盘配置 来使用意大利式的键盘,这已经定义在原始码的档案 /sys/dev/pckbc/wskbdmap_mfii.c 中了。 在预先定义的键盘配置中,一些对程序设计者有用的字符被遗失了 (例如,左箭头和右箭头等)这是一个可选择的配置:

static const keysym_t pckbd_keydesc_it[] = {
...
KC(8),   KS_7,          KS_slash,       KS_braceleft,
KC(9),   KS_8,          KS_parenleft,   KS_bracketleft,
KC(10),  KS_9,          KS_parenright,  KS_bracketright,
KC(11),  KS_0,          KS_equal,       KS_braceright,
KC(12),  KS_apostrophe, KS_question,    KS_grave,
KC(13),  KS_igrave,     KS_asciicircum, KS_asciitilde,
KC(26),  KS_egrave,     KS_eacute,      KS_bracketleft, KS_braceleft,
KC(27),  KS_plus,       KS_asterisk,    KS_bracketright,KS_braceright,
...
    

预先的配置定义了这些对照表:

Keys Character
Alt Gr + 7 {
Alt Gr + 8 [
Alt Gr + 9 ]
Alt Gr + 0 }
Alt Gr + ' `
Alt Gr + ì ~
Alt Gr + é [
Alt Gr + + ]
Shift + Alt Gr + è {
Shift + Alt Gr + + }

终端机驱动程序: 从版本 1.4 开始,NetBSD使用了 wscons, 跨平台的终端机驱动程序来处理屏幕,键盘和鼠标。 先前的版本则使用 pcconspcvt。详细说明请看 Chapter 12

7.3. 重新编译核心

要重新编译核心,你必须安装编译程序集 (comp.tgz)

核心编译的基本步骤

  1. 建立/修改核心设定档

  2. 设定核心

  3. 产生 dependencies

  4. "Make" 核心

  5. 安装核心

7.4. 产生核心设定档

Note: 这里描述的目录是以 i386 为例的。其它平台的使用者必须 至换成适当的目录(通常是 arch 底下 的子目录)。

核心设定文件定义了被核心支持的装置种类,数目和特性,就如同 有数个核心设定选项一样。核心设定档位于 /sys/arch/i386/conf 目录。最简单 的建立方法是复制一个现有的并编辑它:在大部分的平台上, 通常最好的选择是 GENERIC 设定档。在此设定档中,有许多的 批注来描述选项;更详尽的说明在 options(4) 在线手册中。

# cd /sys/arch/i386/conf/
# cp GENERIC MYKERNEL
# vi MYKERNEL
    

核心名称: 基于历史,核心设定档的名称都是大写。

修改核心设定档,基本上包含三个作业:

  1. 包含/不包含在核心中支持的硬件装置(例如,如果不需要, SCSI 支持可以移除)

  2. 打开/关闭在核心中支持的特征(例如,打开 NFS client 支持, 打开 Linux 仿真功能, ...)

  3. 更改核心参数。

凡是行开头具有 "#" 符号的便是被标记的;被标记的 行表示被关闭支持,要打开支持则要移除标记字符。最好使用 标记行来关闭支持而不要删除该行;我们以后便可以利用解除 标记来打开它们。

dmesg 指令的输出可以被用来决定哪一行 应该被关闭。每一行的型态为:

<XXX> at <YYY>
    

XXX 和 YYY 两者都必须设定在核心设定档中。在建立最小化设定时, 你可能需要做一些试验,在不具有 SCSI 和 PCMCIA 的桌上型计算机, 可以将核心的大小减半。

你应该也检查不需要的选项是否被关闭。每一个选项都有简短的 批注描述它们,对了解该选项是很有帮助的。需多选项在 options(4) 中都有更详尽的叙述。你应该设定正确的选项来支持 各种键盘配置和区域性的时间。例如,在意大利:

options RTC_OFFSET=-60
...
options PCKBD_LAYOUT="KB_IT"
    

adjustkernel Perl script 可以在 被找到。 http://www.feyrer.de/Misc/adjustkernel, 分析了 dmesg 的输出并自动地产生 最小化的核心设定档。你需要在系统上安装 Perl 来执行。 要安装新的软件请参考 Chapter 8。 如果你现在要安装 Perl,下载预先编译好的 package perl-5.00404.tgz 并执行以下指令:

# pkg_add perl-5.00404.tgz
    

现在 Perl 被安装及设定好了,可以开始使用:真是非常简单...

你现在可以执行 script:

# cd /sys/arch/i386/conf
# perl adjustkernel GENERIC > MYKERNEL
    

我已经试过这个 script 而且它的效果非常好,减少了我许多 手动的编辑工作。要注意的是这个 script 只设定了有效的装置: 你仍然必须手动地增加其它的选项(例如,Linux 仿真,...)

7.5. 设定核心

当你完成核心设定档的修改以后(我们将称它为 MYKERNEL),你可以键入以下指令:

# config MYKERNEL
    

如果 MYKERNEL 没有错误,则 config 程序将会建立必要的档案 来编译核心,否则,我们必须修正错误并再一次地执行 config 程序。

7.6. 产生 dependencies 和重新编译

用以下指令来产生 Dependencies 和编译核心:

# cd ../compile/MYKERNEL
# make depend
# make
    

编译会因为发生错误而停止;会有种种的原因但是大多数发生 的错误是核心设定档没有通过 config 的 检验。有时候错误的原因是因为硬件问题(大多因为 RAM): 编译的工作比其它的应用程序的执行更加耗费硬件资源。另一个 典型的错误是:选项 B 被打开但是所需要的另一个选项 A 没有打开。

完成编译需花费几分钟到几小时,视硬件而定。 请看以下的范例:

CPU RAM (MB) Approx. time
486 DX2 50 20 1 hour
P166 96 15 minutes
PIII 128 5 minutes
68030/25 8 4 hours

make 指令最后会在编译目录中产生 netbsd 档案:在储存原先的核心后,这个档案应该被复制到根目录底下。

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

个人化的设定可以缩减核心的大小。在以下的例子中, netbsd.old 是原先安装的核心而 netbsd 是新的核心。

-rwxr-xr-x  1 root  wheel  1342567 Nov 13 16:47 /netbsd
-rwxr-xr-x  1 root  wheel  3111739 Sep 27 01:20 /netbsd.old
    

在重开机后将会使用新核心:

# reboot
    

7.7. 如果发生错误

当重开机后,可能会发生心核心并不如预期般的运作或 甚至不能开机。别担心:如果这个情况发生,只要利用之前保留的 核心来重开机并移除新的(最好重开机在"单一使用者" 模式)