目录
9 配制FreeBSD 的内核
9.1 概要
第3 页9.2 为什么要定制一个内核?
9.3 建立和安装一个定制的内核
9.4 配置文件
9.5 建立设备的节点
9.6 如果出现问题怎么办
=============================================================
(翻译中出现的任何问题或错误,请广大读者及时反馈给我:freebsdhandbook@163.com)
9.1 概要
时你需要重新配置和编译你的内核。
.
.
.
.
.
.
9.2 为什么要定制一个的内核?
带来很多好处。不象GENERIC 内核,它需要支持很广泛的硬件设备,而定制的内核将只支持
你机器的硬件设备,这样会带来很多好处:
FreeBSD 使用手册
第9章配置FreeBSD 的内核
内核是FreeBSD 的核心。它用来管理内存,执行安全控制,网络,磁盘访问等等。而有
读完这章,你将了解到:
为什么需要建构一个定制的内核。
如何写一个内核配置文件,或修改已存在的配置文件。
如何使用内核配置文件创建和建构一个新的内核。
如何安装一个新内核。
如何在/dev 中创建设备文件的入口。
如何解决一些常见的问题。
定制内核基本上是每一个UNIX 用户必须经历的一关。这样做将会对你的FreeBSD 系统
1. 快速启动。既然系统内核只检测你机器上的硬件,那它所花费的启动时间将大大减
少。
2. 较少的内存使用。一个定制的内核会比GENERIC 内核使用较少的内存。这一点非常
重要,因为内核在处理时必须经常使用内存。所以,一个定制的内核对于内存较少的机
器来说是非常有用的。
3. 额外的硬件支持。一个定制的内核允许你加入象声卡之类设备的支持,而这恰恰是
GENERIC 内核所做不到的。
第1 页FreeBSD 使用手册
9.3 建立并安装一个定制的内核
首先,让我们先来看一下建立内核的目录。所有提到的目录都在/usr/src/sys 中,也
可以通过/sys 访问。有许多子目录充当了内核的不同部分。但最重要的是/arch/conf,你
可以在这儿配置内核,然后进行编译。这里的arch 也可能是i386,alpha,pc98。在一个特
殊的架构目录内,所有的东西都是为这个架构服务的;其它部分的代码是与所有平台共享的。
注意一下这个目录的逻辑结构,所有支持的硬件驱动程序、文件系统、参数选项,都放在各
自的目录下。另外,所有放在i386 目录下的是只跟PC 硬件有关的,而i386 目录之外的其
它目录,则是FreeBSD 可能移植到的平台会共享到的部分。
注意:如果你的系统没有这个/usr/src/sys 目录,那么内核源代码就没有被安装。最
快速的安装方式是以root 登陆, 然后运行/stand/sysinstall , 选择
configure Distributions src sys。
接着,切换到arch/conf 目录,拷贝GENERIC 配置文件,并给这个文件起一个容易辨认的名
称,它就是你的内核名称。例如:
# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL
通常,这个名称是大写的,如果正维护着多台不同硬件的FreeBSD 机器,以你机器的域
名来命名是非常好的主意。我们把它命名为MYKERNEL 就是这个原因。
注意:你必须以root 帐户登陆再执行下面的命令,否则你会没有权限,而导致错误。
现在,用你喜欢的文本编辑器编辑MYKERNEL。如果你是初学者,那唯一能用的编辑器
可能就是vi,它由于太复杂而不在这儿介绍了,但在参考书目中有许多书会介绍到它。然
而,FreeBSD 中最容易的编辑器是ee,如果你是一个工程师,它是一个非常好的选择。你可
以很自由地改变注释行来反映你的配置情况,或你在GERNERIC 中已经做的变化。如果你在
Sunos 或其它BSD 系统下定制过内核,那这个文件中的绝大部分将对你非常熟悉。如果你使
用的是诸如DOS 这样的系统,那GENERIC 配置文件就看起来非常困难,所以在下面的配置文
件章节将慢慢地、仔细地进行介绍。
注意:确信经常检查/usr/src/UPDATING,在你执行任何修改之前,记得要用最新发布
的源代码来同步你的源代码树。在这个文件中所有重要的升级都要记下来。
/sur/src/UPDATING 总是符合你的FreeBSD 源代码版本,而且总是比手册所说的信息更加精
确。
当你完成以上步骤之后,如果你使用的FreeBSD 是4.0 之前的版本的话,就执行下面的
第2 页FreeBSD 使用手册
命令进行编译和安装内核;如果你使用的是4.0 版或是之后的版本,你的/usr/src/目录可
能已经包含了sys/子目录了。
注意:如果你设法从一个旧版本的FreeBSD 升级你的内核,你可能必须从你得到新内核
源代码的地方,找到新版的配制文件,重建并安装它。
# /usr/sbin/config MYKERNEL
# cd ../../compile/MYKERNEL
# make depend
# make
# make install
如果你刚升级到一个比较新的版本,确信你已经重建了整个系统,然后运行下面的命令:
# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL
如果你还没有升级你的源代码树,那你应当按顺序执行:
config,make depend,make,make install
警告:如果你已经升级了你的源代码,你必须使用make buildkernel 方法来定制你的
内核。否则,用旧的工具来定制内核,可能会引起错误。如果你已经升级了源代码,不要
使用config/make 来定制内核。
新的内核将会被拷贝到/kernel 目录下,而旧的内核将会被移到/kernel.old。现在,
关闭系统,然后重新用你的内核启动系统。如果发生错误,在这章结尾会有一些故障的解决
办法。一旦你的新内核不能启动,请务必读一下有关如何恢复的章节。
注意:如果你已经加入了新的设备(如声卡),你可能在使用之前,要先在你的/dev 目
录下加入这些设备节点。
9.4 配置文件
内核设置的格式是很简单的,每一行包含了一个关键词(keyword)与一个或多个参数,
而大多数的设置都只包含一个参数。#号之后的文字都是注释,会被程序忽略掉。下面的每
个小节,将依次介绍每个列在GENERIC 中的参数,虽然各相关主题(如网络)的关键词会放在
同一小节,但是这些关键词可能位于GENERIC 的很多地方。详细地列出各个选项(option),
而LINT 列出了绝大部分的选项(options),比起在同一目录下的GENERIC,有更详细的解释。
第3 页FreeBSD 使用手册
如果你不能确定某一行设定的目的是否必要,请先看看LINT。
目前内核在处理各个选项上正转到一个比较好的模式。一般地,设置文件中的各个选项
都转换到内核程序的Makefile 中,属于CFLAGS 的一个-D 参数。时间一长,就造成了一个
选项处理机制的问题,没有人知道在哪个文件中参考使用了那个选项。
在新的机制中,使用#ifdef 来参考选项的程序代码是存放在由执行config 时所产生的
opt_foo.h。由config 所产生的有效的选项清单存储在两个文件里:独立于系统架构的选项
放在/sys/conf/options,与系统架构有关的选项则放在/sys/arch/conf/options.arch,其
中arch 的一个例子便是i386。
数字的引号限制(Quoting numbers): 目前所有FreeBSD 版本,包括3-stable
版,其内核设置文件中如果有任何属于文字形式的数字(如i386),必须用双引号引
起来,不然执行config 时会出错。
如果数字是表示数目、个数,如maxuser 64 这个设置,则不要加双引号。目
前FreeBSD CURRENT 版本已经去掉上述限制,不论是哪种形式的数字都不需要加双
引号。本章的例子,在文字形式的数字前后仍加了双引号(“”),如果你使用FreeBSD
CURRENT,请自动去除双引号。
下面是一个带有很多额外注释的GENERIC 内核配置文件的例子。这个例子与
/usr/src/sys/i386/conf/GENERIC 非常相似。有关内核配置的最详细的选项,请参
看/usr/src/sys/i386/conf/LINT。
#
# GENERIC -- Generic kernel configuration file for FreeBSD/i386
#
# For more information on this file, please read the handbook section on
# Kernel Configuration Files:
#
# http://www.FreeBSD.org/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.ORG/) for the
第4 页FreeBSD 使用手册
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
# $FreeBSD: src/sys/i386/conf/GENERIC,v 1.246 2000/03/09 16:32:55 jlemon Exp
$
下面这个选项在每个内核中都要有:
machine i386
上面的选项指出了在你的系统中所用的CPU 类型。你可以使用多个CPU 类型(例如,你
不确信你使用的是I586_CPU 还是I686_CPU),然而,对于一个定制的内核,最好是只指定
你所拥有的CPU 类型。如果你不能确定你的CPU 类型,你可以使用dmesg 命令来看看你的启
动信息。
Alpha 结构的机器使用下面的选项:
cpu EV4
cpu EV5
如果你正使用一台Alpha 机器,你应当使用上面的CPU 类型。
ident GENERIC
ident 是一个内核的标识符。你应该自己命名一个容易辨认的名称,以有别于GENERIC
的名称─GENERIC。放在ident 后的参数,将在你用这个内核启动时显示在屏幕上。如果你
同时设置了几个内核,采用不同的名称是个不错的主意。
注意,象machine 与cpu 这两个设置。如果你的内核名称包含数字,请记得用双引号把
它括起来。内核名称将会使用-D 参数传给编译器,所以不要用像DEBUG 或是其它可能干扰
编译器的机器、CPU 名称,如vax。
maxusers 32
这个设置的大小值定义了重要的system tables。这个数值粗略地假设你的机器同时会
有多少使用者。然而,在一般情况下,你最少要设置4 个以上,特别是你要执行X Window
或是编译程序。原因是maxusers 值决定了系统同时可有多少个进程( processes),其算法
是20 + 16 * maxusers。如果你设置maxusers 值是1,则你的系统只能同时存在36 个
第5 页FreeBSD 使用手册
processes,包括18 个(或更多)系统启动要占去的processes;如果你执行了X Window,则
又要用掉15 个以上。甚至阅读一个man page 也会使用九个processes 来过滤、解压缩、然
后显示文件。设置maxusers=4,则系统可以同时有84 个processes,对任何人应该都是足
够的。当你执行程序时,得到像是“proc table full”这样的错误信息,或者你要建一个
同时会有很多人来访问的网站(如Walnut Creek CDROM 的FTP)时,你就要增加这个设置的
值,然后重新编译内核。
注意: maxuser 这个参数并不限制可以登陆你系统的用户的数目。它只是系统中使用者
可以最多执行的程序的个数。有一个关键词的值则真的限制了可以同时远程连接(remote
logins)的人数:pseudo-device pty 16。
# Floating point support - do not disable.
device npx0 at nexus? port IO_NPX irq 13
npx0 是连接FreeBSD 中浮点运算处理器的一个接口。不论你有硬件的浮点运算处理器
还是使用软件仿真,都需要这个设置。这个设置并不是可有可无的。
# Pseudo devices - the number indicates how many units to allocate.
pseudo-device loop # Network loopback
loop 是一个通用的TCP/IP 接口。如果你用telnet 或ftp 连到localhost(等同于
127.0.0.1),则该连接会通过这个虚拟设备连回来。这是一定要有的设置,请不要去掉。
#makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols
options MATH_EMULATE #Support for x87 emulation
如果你的计算机没有浮点运算处理器(386 或486SX),你可以加入这行,使得内核提供
软件仿真的浮点运算处理器。如果你用的是486DX 或是386SX、486SX(还加装了387、487
芯片)或更高的(Pentium、Pentium II 等)则不需要这行设置。
注意: 这个仿真的浮点运算处理器并不是很精确。如果你没有浮点运算器,还需要较
高的精度,你可以改用GPL_MATH_EMULATE 参数,这将会使用GNU 的浮点运算仿真器。至于
为什么这个仿真器不是系统默认值,是因为GNU 使用许可的关系。
提供网络支持。就算你不打算连上网络,你还是要留着这个选项。对于绝大部分的程序,
这个选项是一定要有的。
第6 页FreeBSD 使用手册
options INET6 #IPv6 communications protocols
这个启用IPv6 通讯协议。
options FFS #Berkeley Fast Filesystem
options FFS_ROOT #FFS usable as root device [keep this!]
最基本的硬盘文件系统。如果你要从硬盘启动,就留着。
options MFS #Memory Filesystem
options MD_ROOT #MD is a potential root device
Memory-mapped 文件系统。提供RAM disk,以供需要快速访问的资料或是暂存资料用。
如果你分了很大的swap 空间,使用这个选项可以给你不少好处。把/tmp 挂到MFS 分区是一
个相当好的想法,因为不少程序都会在此暂存资料。要把/tmp 挂到MFS RAM disk,可以修
改/etc/fstab,加入以下一行:
/dev/ad1s2b /tmp mfs rw 0 0
现在重启动,或是键入mount /tmp 命令:
options NFS #Network Filesystem
options NFS_ROOT #NFS usable as root device, NFS required
网络文件系统(Network Filesystem, NFS),除非你要从网络上的其它机器加载目录,
不然你可以用# 号注释掉这行设置。
options MSDOSFS #MSDOS Filesystem
MS-DOS 文件系统。除非你要在启动时挂上一个DOS 格式的硬盘,不然你可以放心地把
这行注释掉。如前所述,在你第一次挂上一个DOS 分区时,内核将会自动加载模块来支持它。
此外,mtools 是个相当不错的软件(可在ports 里面找到),可以让你在访问DOS 磁盘时,
不需要挂入或卸载软盘(而且也不需要MSDOSFS 的支持)。
options CD9660 #ISO 9660 Filesystem
options CD9660_ROOT #CD-ROM usable as root, CD9660 required
CD-ROM 使用的ISO 9660 文件系统。如果你没有光驱,或是很少用光驱,可以注释掉这
一行(内核会在第一次挂入时动态加载模块以支持它)。音乐CD 则不会用到这个文件系统。
options PROCFS #Process filesystem
第7 页FreeBSD 使用手册
Process filesystem。这是一个虚拟的文件系统,挂在/proc 下,允许一些程序,像ps
来读取资料,提供你正在执行的processes 的信息。
options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!]
使系统兼容4.3BSD。不要去掉这一行,不然有些程序将无法正常运行。
options SCSI_DELAY=15000 #Delay (in ms) before probing SCSI
这行设置告诉内核等待15 秒钟,以供SCSI 控制器扫描你计算机上的SCSI 设备。如果
你只有IDE 硬盘,你可以不理会这个设置,不然你可能会想要降低这个值,也许会降到五秒,
以增加启动的速度。如果你发现降低后,FreeBSD 无法正确辨认你的SCSI 设备,那么你该
提高这个值,延长等待时间。
options UCONSOLE #Allow users to grab the console
允许使用者找到console 信息,对X Window 很有用。举例来说,你可以输入xterm -C
来打开一个console xterm,这个窗口将显示任何write、talk 等命令的信息,以及你发出
去的信息。当然,kernel 产生的信息也会在这里出现。
options USERCONFIG #boot -c editor
这个选项允许你从启动菜单启动配置编辑器。
options VISUAL_USERCONFIG #visual boot -c editor
这个选项允许你从启动菜单启动虚拟配置编辑器。
options KTRACE #ktrace support
这个选项启用内核进程跟踪,在调试时很有用。
options SYSVSHM #SYSV-style shared memory
提供System V Shared memory(SHM)的支持,最常