Contributed by Jake Hamby .
6 October 1995. 这个略大的章节会讨论如何自订你的 FreeBSD kernel。
这个章节适合初学者以及经验丰富的管理者。
5.1. 为何要自订 kernel ?
5.2. 建⒁约鞍沧耙桓鲎远┑?nbsp;kernel
5.3. kernel 设定档
5.3.1. 一定要有的关键字
5.3.2. 一般的参数
5.3.3. 档案系统的参数
5.3.4. 基本控制卡以及介面卡
5.3.5. SCSI 装置支援
5.3.6. Console,滑鼠,及 X Server 支援
5.3.7. Serial 跟 Parallel Ports
5.3.8. 网路
5.3.9. 音效卡
5.3.10. 虚拟装置 (Pseudo-devices)
5.3.11. 摇杆、PC 喇叭及其他杂七杂八的
5.4. 建立 device nodes
5.5. 发生问题的解决方法
_________________________________________________________________
5.1. 为何要自订 kernel ?
建立一个自订的 kernel 是每个 UNIX 系统管理者所必须学习的重要课题。
这个过程虽然耗时,但是将会对你的 FreeBSD 系统带来许多好处。 一个自订的
kernel,只会包含支援你硬体的驱动程式, 而一个 GENERIC kernel
却包含大多数的硬体驱动程式以便在各种机器上执行。 自订的 kernel
将包含下列优点:
* 开机时只需要花较少的时间,因为 kernel 不需花额外的时间去侦测
你没有的硬体是否存在。
* 自订的 kernel 通常占较少的记忆体,这是很重要的。 因为 kernel
本身是一个常驻在记忆体中的程式,那些没有用到的 程式码 (如 GENERIC
kernel) 将会占去你其他程式执行时的记忆体空间。
因此,在一个记忆体较小的机器上,建立一个自订的 kernel
将是相当重要的。
* 最後,有你可以调整许多的 kernel 参数来符合你的需求, 以及奶J其他
(如音效卡的驱动程式) ,这些是 GENERIC kernel 所没有的。
_________________________________________________________________
5.2. 建立以及安装一个自订的 kernel
首先,我们先浏览一下编译 kernel 的目录。 所有的 kernel
原始程式都是放在 /usr/src/sys 以下的 (而通常我们会将 /sys 连结 (link)
到 /usr/src/sys)。 Kernel 原始程式有许多不同的目录,比方说
/sys/i386/conf, 你将会把你的 kernel 设定档放在此目录下; 还有例如
/sys/compile, 你将会在此编译你的 kernel。
注意: 如果你的系统中 没有 /usr/src/sys, 表示你尚未安装 kernel
原始程式,请参照系统安装过程来安装 kernel 原始程式。
接下来,进入 /sys/i386/conf 并且拷贝 GENERIC 档
成为你想要的档名。例如:
# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL
传统上这个档名都是用大写字母,如果你有许多的 FreeBSD 机器, 用大写的
hostname 来命名是区分不同机器设定的好方法。
注意: 你必须以 root 的身份执行所有的命令,否则你会得到 "permission
denied" 的错误。
现在,以你最习惯的编辑器编辑 MYKERNEL (如果你不知道用什麽好,
你可以试试 vi,虽然要解释如何使用它太过杂, 但是至少大部份的 书
都会提到它。 你必须修改或新增此档案中的设定以符合你系统的需求。
如果你曾经在 SunOS 或是其他的 BSD 系统上建立过 kernel,
那麽你将会对这个 kernel 设定档的内容十分熟悉。
如果你较熟悉其他的作业系统 (如 DOS),你可能会看不懂 kernel
设定档,麻烦你仔细阅读 kernel 设定档 。
注意: 如果你是从较旧版本的 FreeBSD 升级上来的, 你可能必须一更新
config(8)。如果你是从 FreeBSD 原始程式升级的, 你可以在
/usr/src/usr.sbin/config 中找到 config 的原始程式。
当你完成建立或修改 kernel 设定档时,执行以下命令来编译你的 kernel:
# /usr/sbin/config MYKERNEL
# cd ../../compile/MYKERNEL
# make depend
# make
# make install
:make depend; make; make install 可用 make depend all install 来替代
新编译好的 kernel 将会被安装到根目录去 (名为 /kernel), 旧的 kernel
将会被更名为 /kernel.old。 现在,关闭 (shutdown) 你的系统并重新开机
(reboot)。 如果重新开机後出了什麽问题,请阅读本文最後的
发生问题的解决方法 。 请记得阅读 以免你的 kernel 无法开机 。
注意: 如果你增s的硬体 (如音效卡), 你必须建立一些 device nodes
到你的 /dev 下。
_________________________________________________________________
5.3. kernel 设定档
这个档案的内容相当的简单。每一行都包含了一个关键字以及它的参数。
任何以 # 开头的行都被视为解而忽略。 接下来会介绍 GENERIC
(一般设定档) 中所含有的关键字。 另一个设定档 LINT
中包含绝大多数的详细关键字,LINT 中并有详细说明,
如果你有任何的疑问可以参考 LINT。
传统上 kernel 设定档中的关键字会以 -D 的方式由 CFLAGS
传递给编译器,但是这样做所有的档案都有可能被影响。
现在我们有了新的方法。config 这个程式会将那些关键字分门别类的放到
opt_foo.h,这样只有相关的原始程式才会参考到这些设定档。
5.3.1. 一定要有的关键字
5.3.2. 一般的参数
5.3.3. 档案系统的参数
5.3.4. 基本控制卡以及介面卡
5.3.5. SCSI 装置支援
5.3.6. Console,滑鼠,及 X Server 支援
5.3.7. Serial 跟 Parallel Ports
5.3.8. 网路
5.3.9. 音效卡
5.3.10. 虚拟装置 (Pseudo-devices)
5.3.11. 摇杆、PC 喇叭及其他杂七杂八的
_________________________________________________________________
5.3.1. 一定要有的关键字
以下是你的 kernel 设定档中一定要有的关键字。
machine ``i386''
第一个关键字是 machine,因为 FreeBSD 现在只能在 386 以上的 PC
执行,理所当然参数是 i386。
注意: 任何包含数字的关键字都必须用引号匡起来 (如 "i386"), 否则
config 可能会误以为你的意思是数字 386 (三百八十六)。
cpu ``cpu_type''
第二个关键字是 cpu, 这些是指你的 kernel 即将支援的 CPU 种类。
它的参数 cpu_type 有:
+ I386_CPU
+ I486_CPU
+ I586_CPU
+ I686_CPU
设定档中可以有一行以上的 cpu "cpu_type" 以支援各种的 CPU, 就像
GENERIC 档案一样。如果你的硬体是固定的,只要包含你用的 CPU
种类就好了。 如果你使用 Intel Pentium,那你只要有 cpu
"I586_CPU" 就好了。
ident machine_name
接下来是 ident, 这是用来区别不同 kernel 用的。 你可以使用
GENERIC 这个字或是其他你喜欢的字 (如 MYKERNEL)。
你可以在开机的时候看到这个字。 你可以替试验性的 kernel
取不同的名字藉以区别其它的 kernel。 要注意的是,这个字将会以
CFLAGS 的方式传给 C 编译器, 请勿使用到特殊的关键字如
DEBUG,以免发生不可预期的事。 如果你不知道要用那个字,你可以用
GENERIC 这个字。
maxusers number
这个数字将会决定你的 kernel 中一些资料结构的大小。
例如你的系统中可以同时载入的程序 (process) 数目等於 20 + 16 *
maxusers。 对於一个使用者的环境来说,设定 maxusers = 4
大概可以符合一般需求。 然而,如果你得到 "proc table full"
的错误讯息, 你必须增?maxuser 的值。如果你想执行
X-Windows,你可能需要 maxuser = 16A更大的值是必须的。
注意: 这个数字并 不是 代表你的系统
可以同时上线的人数,它只是决定你的 kernel 中一些资料结构的大小。
真正影响上线人数的是 pseudo-device pty 16 。
config kernel_name root on root_device
这行指定 kernel 的名称及位置。传统上来说,kernel 的命名为
vmunix, 但是 FreeBSD 称它为 kernel。你一定要用 kernel 当作
kernel_name,因为许多程式都会去参考 /kernel 这个档案。
这行的第二个参数 root_device 指定你的 root partition 跟 kernel
放在哪颗硬碟上。 一般来说,用 SCSI 硬碟的系统使用 sd0,用 IDE
硬碟的使用 wd0。
_________________________________________________________________
5.3.2. 一般的参数
这些参数提供档案系统及其它的功能支援。
options MATH_EMULATE
这个参数让 kernel 用软体的方式模拟浮点运算,如果你的 CPU
不含浮点运算器 (或没有 387),你就必须打开此参数。
注意: FreeBSD 所提供的一般浮点模拟器并没有十分准确,
如果你没有浮点运算器却又需要最好的准确度,你可以是用
GPL_MATH_EMULATE 来使用较优秀的 GNU 浮点模拟。 因为 GNU
版权的关,因此不以它来当作内定的模拟器。
options ``COMPAT_43''
提供 4.3BSD
的相容模式,有些程式需要这个参数,所以请一定要打开。
options BOUNCE_BUFFERS
ISA 以及以 ISA 相容模式运作的 EISA 介面卡只能对 16MB
以下的记忆体做 DMA(Direct Memory
Access)。这个参数用缓区的方式使得这些介面卡 可以 DMA 存取
16MB 以上的记忆体。 通常使用 ISA SCSI 卡又有超过 16MB
的人才需要此参数, 打开此参数会使得系统稍微慢一点。
options UCONSOLE
允许使用者?ampcirc;取 console,对 X Windows 是很有用的。
举例来说,你可以用 xterm -C来?ampcirc;取传到 console 上的 talk
、write 以及 system log 的讯息。
options SYSVSHM
这个参数提供 System V 共享记忆体 (shared memory) 的支援。
最常使用 SYSVSHM 的是 X Windows 的 XSHM 功能 (如使用 xanim,
Linux DOOM 等),因为他可以提高执行速度。如果你使用 X Windows
或是电子告栏 (BBS),你一定要打开此参数。
options SYSVSEM
提供 System V semaphores 的支援,虽然不常用到,但是它只占一点点
kernel 的空间。
options SYSVMSG
提供 System V messages 的支援,虽然不常用到,但是它只占一点点
kernel 的空间。
注意: ipcs(1) 这个命令会列出正在使用以上三种 SYSV 的功能 的程序
(process)。
_________________________________________________________________
5.3.3. 档案系统的参数
这些参数提供各种档案系统的支援,你一定要包含一种以上的档案系统
以便开机所需。 如果你是从硬碟开机,你必须包含 FFS; 如果你用 diskless
开机 (网路开机),你必须包含 NFS。
此外,你还可以将常用到的档案系统包含进去 (如 MSDOS)。
但是你可以将这些非开机必备的档案系统拿掉,FreeBSD 会利用动态载入模组
(Loadable Kernel Module) 在你用到档案系统时,自动将档案系统模组从 /lkm
载入使用。
options FFS
最基本的档案系统支援,如果你是从硬碟开机的,你一定需要它。
options NFS
网路档案系统(Network Filesystem?ampcirc;,除非你想要经由网路存取
(mount)其他工作站的档案,否则你不需要它。
options MSDOSFS
MS-DOS 档案系统。除非你每次开机都要使用 MSDOS 档案系统,
不然你可以将他拿掉,系统会在你使用到 MSDOS 档案系统时, 自动用
LKM 将 MSDOS 档案系统支援载入。 除此之外,你也可以使用
mtools来存取 DOS 的软碟, 这并不需要有 MSDOS 档案系统的支援。
options ``CD9660''
ISO 9660 是 CD-ROM 的档案系统,如果你只是偶尔用到 CD-ROM,
你可以将它拿掉,系统会在使用到 CD-ROM 时自动以 LKM 载入。
此外,用 CD-ROM 听 Audio CD 不需要 CD9660 的支援。
options PROCFS
Process 档案系统。这是一个对映记忆体中执行程序的虚拟档案系统,
许多系统工具如 ps 需要 PROCFS。
options MFS
记忆体映对档案系统 (Memory-mapped Filesystem)。
这基本上是一个为了达到快速暂存用的 RAM disk, 当你有许多 swap
空间的时候是很有用的。 一个挂上 (mount) MFS 的好地方是 /tmp,
因为许多程式会利用 /tmp 建立暂时档案。 以下是将 MFS 挂上 /tmp
的方法: 在 /etc/fstab 中奶J以下这行并重新开机或键入 mount
/tmp。
/dev/wd1s2b /tmp mfs rw 0 0
注意: 将 /dev/wd1s2b 替换成你的 swap partition, 你的 swap partition
在 /etc/fstab 中看起来是这样的:
/dev/wd1s2b none swap sw 0 0
注意: 再来,MFS 无法以 LKM 载入, 一定要将它连结在 kernel 中。
options QUOTA
奶J quota 的支援,可以藉以限制使用者能用的硬碟空间。 请参阅
quota(1) 的说明 (man quota)。
_________________________________________________________________
5.3.4. 基本控制卡以及介面卡
这些章节讨论 FreeBSD 的硬碟、磁带机、CD-ROM 的支援。 对於 SCSI 卡 跟
网路卡 我们将在另一章节讨论。
controller isa0
所有的 PC 都应该奶J ISA 的支援。如果你的系统是 IBM PS/2 (Micro
Channel Architecture),很抱歉现在 FreeBSD 并不支援。
controller pci0
奶J PCI (含 PCI Plug) 的支援。
controller fdc0
软碟控制卡: fd0 是 ``A:'' 磁碟,fd1 是 ``B:'' 磁碟。 ft0
是接在软碟控制卡上的 QIC-80 磁带机。
注意: QIC-80 磁带机需要 ft(8) 程式的支援。
controller wdc0
这是主要 (primary) IDE 控制卡的支援。 wd0 跟 wd1 是第一台
(primary) 跟第二台 (slave) 硬碟。 wdc1 是次要 (secondary) IDE
控制卡, 提供第三台及第四台硬碟 (或者是 IDE ATAPI CD-ROM)
的支援。
controller wcd0
提供 IDE ATAPI CD-ROM 的支援,需要 wdc0 或 wdc1
的支援。此外,你还需要 options ATAPI, ATAPI_STATIC 的参数。
device npx0 at isa? port ``IO_NPX'' irq 13 vector npxintr
npx0 是 FreeBSD 浮点运算的呼叫介面,不管你有没有
浮点运算器,这个参数都是 必要 的。
device wt0 at isa? port 0x300 bio irq 5 drq 1 vector wtintr
Wangtek 跟 Archive QIC-02/QIC-36 磁带机的支援。
专属介面 CD-ROM 的支援
以下这些是所谓的 专属介面 CD-ROM。
他们使用专属的控制卡或是音效卡,他们 不是 IDE 或 SCSI 的
CD-ROM。他们大多数是单倍速或双倍速的老机种。
device mcd0 at isa? port 0x300 bio irq 10 vector mcdintr
Mitsumi CD-ROM (LU002, LU005,