第9章 配置FreeBSD的内核
9.1概要
内核是FreeBSD操作系统的核心。它用来管理内存,执行安全控制,网络,磁盘访问等等。虽然现在FreeBSD可以更多地进行动态配置,但有时你还是需要重新配置和编译你的内核。
读完这章,你将了解到:
为什么需要建立一个定制的内核。
如何写一个内核配置文件,或修改已存在的配置文件。
如何使用内核配置文件创建和建立一个新的内核。
如何安装一个新内核。
如何在/dev中创建设备文件的记录。
如何解决一些常见的问题。
9.2为什么要定制一个的内核?
通常,FreeBSD有一个叫做“monolithic”(高度集成)的内核。这意味着内核是一个巨大的程序,支持很多的设备,如果你想要修改内核的行为,必须重新编译一个新的内核,然后用新内核启动系统。
今天,FreeBSD已经将内核的功能分成了很多的模块,可以动态地加载和卸载内核模块。这样可以快速地调整内核以支持新加入的设备(如在手提计算机中的PCMCIA卡),或加入最初内核编译时没有加入的功能。通俗地来讲,这种功能叫做KLD。
虽然这样,作一些静态内核的配置也是必需的。有时,由于有些功能与内核的联系非常紧密,所以它不能被动态地加载。另外,有些人不太愿意为实现某些功能而写一个动态加载的内核模块,编译一个静态内核可能更简单。
定制内核基本上是每一个UNIX用户必须经历的一关。这样做将会对你的FreeBSD系统带来很多好处。不像GENERIC内核,它需要支持很广泛的硬件设备,而定制的内核将只支持你机器的硬件设备,这样会带来很多好处:
快速启动。既然系统内核只检测你机器上的硬件,那它所花费的启动时间将大大减少。
较少的内存使用。一个定制的内核会比GENERIC内核使用较少的内存。这一点非常重要,因为内核在处理时必须经常使用内存。所以,一个定制的内核对于内存较少的机器来说是非常有用的。
额外的硬件支持。一个定制的内核允许你加入像声卡之类设备的支持,而这恰恰是GENERIC内核所做不到的。
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的版本。
如果你只安装内核源代码,使用方法1。
如果你运行的是FreeBSD
4.0以前的版本的话,你不需要升级到FreeBSD 4.0或更高版本,只要使用方法1。
如果你在没有升级源代码的情况下编译一个新内核(也许你只想为内核添加一个新的选项,如IPFIREWALL),可以使用任何一种方法。
如果你正在重新建立的内核作为“make
world”进程的一部分,需要使用方法2。
方法1.用“传统方法”建立一个内核
1.运行config来产生内核源代码。
# /usr/sbin/config
MYKERNEL
2.进入建立内核的目录。
# cd
../../compile/ MYKERNEL
3.编译内核。
# make depend
# make
4.安装新的内核。
# make install
方法2.用“新的方法”来建立内核
1.进入/usr/src目录。
# cd /usr/src
2.编译内核。
# make
buildkernel KERNCONF= MYKERNEL
3.安装新内核。
# make
installkernel KERNCONF=MYKERNEL
注意:在FreeBSD 4.2和更老的版本中,你必须用KERNEL=替换KERNCONF=。2001年2月2日以后生成的4.2-STABLE就可以认出KERNCONF=了。
如果你还没有升级源代码树,那你应当按顺序执行:
config,make depend,make,make install
新的内核将会被拷贝到/kernel目录下,而旧的内核将会被移到/kernel.old。现在,关闭系统,然后重新用内核启动系统。如果发生错误,在这章结尾会有一些故障的解决办法。如果新内核不能启动,请务必读一下有关如何恢复的章节。
注意:如果你已经加入了新的设备(如声卡),你可能在使用之前,要先在你的/dev目录下加入这些设备节点。
9.4配置文件
内核设置的格式是很简单的,每一行包含了一个关键词(keyword)与一个或多个参数,而大多数的设置都只包含一个参数。#号之后的文字都是注释,会被程序忽略掉。下面的每个小节,将依次介绍每个列在GENERIC中的参数,虽然各相关主题(如网络)的关键词会放在同一小节,但是这些关键词可能位于GENERIC的很多地方。详细地列出各个选项(option),而LINT列出了绝大部分的选项(option),比起在同一目录下的GENERIC,有更详细的解释。如果你不能确定某一行设定的目的是否必要,请先看看LINT。
目前内核在处理各个选项上正转到一个比较好的模式。一般地,设置文件中的各个选项都转换到内核程序的Makefile中,属于CFLAGS的一个-D参数。时间一长,就造成了一个选项处理机制的问题,没有人知道在哪个文件中参考使用了那个选项。
在新的机制中,使用#ifdef来参考选项的程序代码是存放在由执行config时所产生的opt_foo.h。由config所产生的有效的选项清单存储在两个文件里:独立于系统架构的选项放在/sys/conf/options,与系统架构有关的选项则放在/sys/arch/conf/options.arch,其中arch的一个例子便是i386。
数字的引号方式(Quoting numbers):目前所有FreeBSD版本,包括3.x,其内核设置文件中如果有任何属于文字形式的数字(如i386),必须用双引号引起来,不然执行config时会出错。
如果数字是表示数目、个数,如maxuser 64这个设置,则不要加双引号。目前FreeBSD 4.x版本已经去掉上述限制,不论是哪种形式的数字都不需要加双引号。本章的例子,在文字形式的数字前后仍加了双引号(“”),如果你使用FreeBSD 4.x版本,请自动去除双引号。
下面是一个带有很多额外注释的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
# 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
这是机器的架构。它可能是i386,alpha或pc98。
cpu I386_CPU
cpu I486_CPU
cpu I586_CPU
cpu I686_CPU
上面的选项指出了在你的系统中所用的CPU类型。你可以使用多个CPU类型(例如,你不能确定使用的是I586_CPU还是I686_CPU),然而,对于一个定制的内核,最好是只指定你所拥有的CPU类型。如果你不能确定CPU类型,可以使用dmesg命令来看看你的启动信息。
Alpha结构的机器使用下面的选项:
cpu EV4
cpu EV5
如果你正使用一台Alpha机器,应当使用上面的CPU类型。
ident GENERIC
这是一个内核的标识符。你应该自己命名一个容易辨认的名称,以有别于GENERIC的名称——GENERIC。放在ident后的参数,将在你用这个内核启动时显示在屏幕上。如果你同时设置了几个内核,采用不同的名称是个不错的主意。(例如,你想定制一个实验性质的内核)。
maxusers 32
这个设置的大小值定义了重要的系统表(system tables)。这个数值粗略地假设你的机器同时会有多少用户。然而,在一般情况下,你最少要设置4个以上,特别是你要执行X Window或是编译程序。原因是maxusers值决定了系统同时可有多少个进程(process),其算法是20 + 16 * maxusers。如果你设置maxusers值是1,则你的系统只能同时存在36个进程,包括18个(或更多)系统启动要占去的进程。如果你执行了X Window,则又要用掉15个以上。甚至阅读一个man page也会使用九个进程来过滤、解压缩、然后显示文件。设置maxusers=4,则系统可以同时有84个进程,对任何人应该都是足够的。当你执行程序时,得到像是“proc table full”这样的错误信息,或者你要建一个同时会有很多人来访问的网站(如ftp.FreeBSD.org)时,你就要增加这个设置的值,然后重新编译内核。
注意: maxusers这个参数并不限制可以登陆你系统的用户数目。它只是系统中用户可以最多执行的程序个数。有一个关键词的值则真的限制了可以同时远程连接(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使用许可的关系。
options INET #InterNETworking
提供网络支持。就算你不打算连上网络,还是要留着这个选项。对于绝大部分的程序,这个选项是一定要有的。
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
网络文件系统(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
进程文件系统(Process filesystem)。这是一个虚拟的文件系统,挂在/proc下,允许一些程序,像ps来读取资料,提供你正在执行的进程的信息。
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来打开一个控制台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共享内存(SHM)的支持,最常用到SHM的应该是X Window的XSHM延伸,不少绘图相关程序(像影片播放程序XAnim与Linux DOOM游戏)会自动使用SHM来提供额外的速度。如果你要使用X Window,你最好加入这个选项。
options SYSVSEM #SYSV-style semaphores
支持System V semaphores,不常用到,只在kernel中占用几百个字节的空间。
options SYSVMSG #SYSV-style message queues
支持System V messages,一样的,只占用kernel几百字节的空间。
注意: ipcs命令可以显示出任何使用到上述三个System V功能的进程。
options P1003_1B #Posix P1003_1B real-time extensions
options _KPOSIX_PRIORITY_SCHEDULING
在1993 POSIX中添加的实时扩展。在ports collection中某些应用程序会用到这些(如Star Office)。
options ICMP_BANDLIM #Rate limit bad replies
这个选项启用ICMP的带宽限制的错误响应。使用这个选项可以帮助你保护你的机器免受拒绝式服务攻击。
# To make an SMP kernel, the next two are needed
#options SMP # Symmetric MultiProcessor Kernel
#options APIC_IO # Symmetric (APIC) I/O
上面两个选项都支持SMP。
device isa
所有FreeBSD支持的PC都需要这行设置。如果你使用IBM PS/2 (微信道架构)计算机,则你无法在该机器上执行FreeBSD。
device eisa
如果你的主机板上有EISA总线,加入这个设置。使用这个选项可以自动扫描并设置所有连接在EISA总线上的设备。
device pci
如果你的主板有PCI总线,就加入这个选项。使用这个选项可以自动扫描PCI卡,并在PCI到ISA之间建立通路。
# Floppy drives
device fdc0 at isa? port IO_FD1 irq 6 drq 2
device fd0 at fdc0 drive 0
device fd1 at fdc0 drive 1
软盘控制器:fd0是A: 盘,fd1是B: 盘。
device ata
这个驱动器支持所有ATA和ATAPI设备。你只要在内核中加入device ata选项,就可以让内核支持现代计算机上的所有PCI ATA/ATAPI设备。
device atadisk # ATA disk drives
这个是ATAPI磁盘驱动器所必须的。
device atapicd # ATAPI CDROM drives
这个是ATAPI CDROM驱动器所必须的。
device atapifd # ATAPI floppy drives
这个是ATAPI 软盘驱动器所必须的。
device atapist # ATAPI tape drives
这个是ATAPI 磁带机驱动器所必须的。
options ATA_STATIC_ID #Static device numbering
这个可以静态分配控制器的编号,也可以动态分配设备的编号。
# ATA and ATAPI devices
device ata0 at isa? port IO_WD1 irq 14
device ata1 at isa? port IO_WD2 irq 15
上面的选项用在比较老的,非PCI的系统中。
# SCSI Controllers
device ahb # EISA AHA1742 family
device ahc # AHA2940 and onboard AIC7xxx devices
device amd # AMD 53C974 (Teckram DC-390(T))
device dpt # DPT Smartcache - See LINT for options!
device isp # Qlogic family
device ncr # NCR/Symbios Logic
device sym # NCR/Symbios Logic (newer chipsets)
device adv0 at isa?
device adw
device bt0 at isa?
device aha0 at isa?
device aic0 at isa?
SCSI控制器。可以注释掉你系统中没有的设备。如果你只有IDE设备,你可以把这些一起删掉。
# SCSI peripherals
device scbus # SCSI bus (required)
device da # Direct Access (disks)
device sa # Sequential Access (tape etc)
device cd # CD
device pass # Passthrough device (direct SCSI
access)
SCSI外围设备。也可以像上面一样操作。
# RAID controllers
device ida # Compaq Smart RAID
device amr # AMI MegaRAID
device mlx # Mylex DAC960 family
支持RAID控制器。如果你没有这些,可以把它们注释掉或是删掉。
# atkbdc0 controls both the keyboard and the PS/2 mouse
device atkbdc0 at isa? port IO_KBD
键盘控制器atkbdc提供AT键盘输入以及PS/2指针设备的I/O服务。键盘驱动程序atkbd与PS/2鼠标驱动程序psm需要这个控制器,所以不要删除它。
device atkbd0 at atkbdc? irq 1
atkbd驱动程序,与atkbdc控制器一起使用,提供连接到AT键盘控制器的AT 84键盘与AT加强型键盘的访问服务。
device psm0 at atkbdc? irq 12
如果你的鼠标连接到PS/2鼠标端口,就使用这个设备驱动程序。
device vga0 at isa?
显卡驱动。
# splash screen/screen saver
pseudo-device splash
在启动时的启动画面!屏幕保护也需要这个。
# syscons is the default console driver, resembling an SCO console
device sc0 at isa?
sc0是默认的控制台驱动程序,绝大部分全屏幕程序都通过termcap这类terminal database library来访问控制台,因此不论你用这个驱动程序或是VT220兼容控制台驱动程序vt0,这中间并没有太大差别。如果使用sc0,且你在登陆系统后,执行全屏幕程序时遇到问题,请将你的TERM设置成“scoansi”。
# Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
#device vt0 at isa?
#options XSERVER # support for X server on a vt console
#options FAT_CURSOR # start with block cursor
# If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
#options PCVT_SCANSET=2 # IBM keyboards are non-std
这是一个兼容VT220的控制台驱动程序,并向下兼容VT100/102。在部分与sc0相冲突的