第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相冲突的笔记本计算机上,这个驱动程序运作良好。当然,当你登陆系统时,记得设置TERM参数为vt100或是vt220。当连接到网络上许多计算机时,这个驱动程序也常是很有用的,这是因为许多的计算机上的termcap或是terminfo并没有sc0的资料——而vt100的资料几乎所有的平台上都支持。
# Power management support (see LINT for more options)
device apm0 at nexus? disable flags 0x20 # Advanced Power Management
高级电源管理支持。使用在膝上型计算机上。
# PCCARD (PCMCIA) support
device card
device pcic0 at isa? irq 10 port 0x3e0 iomem 0xd0000
device pcic1 at isa? irq 11 port 0x3e2 iomem 0xd4000 disable
PCMCIA支持。如果你使用膝上型计算机,你需要这个。
# Serial (COM) ports
device sio0 at isa? port IO_COM1 flags 0x10 irq 4
device sio1 at isa? port IO_COM2 irq 3
device sio2 at isa? disable port IO_COM3 irq 5
device sio3 at isa? disable port IO_COM4 irq 9
sio0到sio3可看作是MS-DOS系统中的COM1到COM4。如果你使用内置式的数据机,且占用COM4,而你的系统又有COM2,则你必须修改调制解调器的IRQ为2(IRQ 2跟IRQ 9是一样的),这样你才能正常使用调制解调器。部分显示卡(特别是使用S3芯片的卡),用到0x*2e8这个I/O地址,而一些便宜的串行卡,没办法正确译码16位的I/O寻址空间,因此两张卡会冲突,导致COM4无法正常使用。每个串行口都要有一个唯一的IRQ,所以COM3与COM4默认的IRQ将无法使用。
# Parallel port
device ppc0 at isa? irq 7
ISA-bus并行接口
device ppbus # Parallel port bus (required)
提供并行总线的支持。
device lpt # Printer
提供并口打印机的支持。
注意: 要使用并口打印机,就必须同时加入上面三行设置。
device plip # TCP/IP over parallel
这是针对并行网络接口的驱动器。
device ppi # Parallel port interface device
普通用途的I/O (“geek port”) + IEEE1284 I/O。
#device vpo # Requires scbus and da
这是针对Iomega Zip驱动器的。它要求scbus和da的支持。最好的执行效果是工作在EPP 1.9模式。
# PCI Ethernet NICs.
device de # DEC/Intel DC21x4x (``Tulip'')
device fxp # Intel EtherExpress PRO/100B (82557, 82558)
device tx # SMC 9432TX (83c170 ``EPIC'')
device vx # 3Com 3c590, 3c595 (``Vortex'')
device wx # Intel Gigabit Ethernet Card (``Wiseman'')
多种PCI网卡驱动器。注释或删除你系统中没有的设备。
# PCI Ethernet NICs that use the common MII bus controller code.
device miibus # MII bus support
MII总线支持对于一些PCI 10/100 Ethernet NIC来说是必需的。
device dc # DEC/Intel 21143 and various workalikes
device rl # RealTek 8129/8139
device sf # Adaptec AIC-6915 (``Starfire'')
device sis # Silicon Integrated Systems SiS 900/SiS 7016
device ste # Sundance ST201 (D-Link DFE-550TX)
device tl # Texas Instruments ThunderLAN
device vr # VIA Rhine, Rhine II
device wb # Winbond W89C840F
device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')
使用MII总线控制器代码的驱动器。
# ISA Ethernet NICs.
device ed0 at isa? port 0x280 irq 10 iomem 0xd8000
device ex
device ep
# WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really
# exists only as a PCMCIA device, so there is no ISA attachment needed
# and resources will always be dynamically assigned by the pccard code.
device wi
# Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will
# work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP
# mode (the factory default). If you set the switches on your ISA
# card for a manually chosen I/O address and IRQ, you must specify
# those parameters here.
device an
# The probe order of these is presently determined by i386/isa/isa_compat.c.
device ie0 at isa? port 0x300 irq 10 iomem 0xd0000
device fe0 at isa? port 0x300
device le0 at isa? port 0x300 irq 5 iomem 0xd0000
device lnc0 at isa? port 0x280 irq 10 drq 0
device cs0 at isa? port 0x300
device sn0 at isa? port 0x300 irq 10
# requires PCCARD (PCMCIA) support to be activated
#device xe0 at isa?
ISA以太网驱动器。看看/usr/src/sys/i386/conf/LINT了解一下哪个卡被哪个驱动器支持。
pseudo-device ether # Ethernet support
如果你有一个以太网卡,ether是必需的。它包含了通用的以太网协议代码。
pseudo-device sl 1 # Kernel SLIP
Sl是针对SLIP支持的。这已经完全被PPP所代替,它是早期使用的协议。
pseudo-device ppp 1 # Kernel PPP
ppp提供内核模式(kernel-mode)的PPP拨号支持。另外有一个tun则是用户模式 (user-mode)的PPP支持,tun较有弹性且功能较多。如果你要使用这个PPP驱动程序,请参考内核模式PPP这一章节。如同sl,number设置系统最多同时能支持几个PPP连接。
pseudo-device tun # Packet tunnel.
tun是用户模式的PPP软件。这个程序设置相当方便,且速度很快。它有一些特殊的功能,像是在需要连接时自动拨号(dial-on-demand)。tun后面接的数字设置系统同时能支持几个PPP连接。参看这本书的PPP章节(第16.2)以了解更多信息。
pseudo-device pty # Pseudo-ttys (telnet etc)
pty是虚拟的终端机,或仿真的登陆端口(login port)。ctelnet或rlogin连接,xterm以及其他应用程序如emacs会用到pty。number设置系统的pty个数。系统默认值是16,如果你要提高同时连接数,可以适当增加这个数值,最高可达256个。
pseudo-device md # Memory “disks”
Memory disk pseudo-devices.
pseudo-device gif 4 # IPv6 and IPv4 tunneling
这个执行IPv6与 IPv4,IPv4与IPv6,IPv4与IPv4, IPv6与IPv6之间的转换.
pseudo-device faith 1 # IPv6-to-IPv4 relaying (translation)
这个伪设备能检测到接收到的数据包,然后把它们发送给IPv4/IPv6翻译程序。
# The `bpf' pseudo-device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
pseudo-device bpf # Berkeley packet filter
这是Berkeley的封包过滤器。这个伪设备允许网络接口被放在复杂的模式上,在网络上捕获每个封包。这些封包能被磁盘捕获或被tcpdump程序检查。
注意:bpf pseudo-device也可以被dhclient用来获得默认路由的IP地址。如果你使用DHCP,不要注释掉这行。
# USB support
#device uhci # UHCI PCI->USB interface
#device ohci # OHCI PCI->USB interface
#device usb # USB Bus (required)
#device ugen # Generic
#device uhid # ``Human Interface Devices''
#device ukbd # Keyboard
#device ulpt # Printer
#device umass # Disks/Mass storage - Requires scbus and da
#device ums # Mouse
# USB Ethernet, requires mii
#device aue # ADMtek USB ethernet
#device cue # CATC USB ethernet
#device kue # Kawasaki LSI USB ethernet
支持多种USB设备。更多有关FreeBSD支持的设备请参考/usr/src/sys/i386/conf/LINT。
9.5建立设备的节点
几乎内核中的每个设备在/dev目录下都有对应的节点。这些节点看上去是些规则文件,但事实上是程序在使用对应的设备时,与内核联系的进入点。当你一开始安装操作系统时,那些可执行的外壳脚本/dev/MAKEDEV就创建了几乎所有支持的设备。然而,它并不是建立所有设备,所以当你加入对新设备的支持时,注意确信对应的节点在这个目录下。如果不是,就加入它们。这儿是一个简单的例子:
确信在内核中加入了IDE CD-ROM的支持。可以这样加入:
device acd0
这意味着你应当在/dev目录下找一些以acd0为起点的入口,通常后面有一个字母,像c或以r开头表示这是一个raw设备。那些文件不在那儿,必须改变/dev目录然后键入:
# sh MAKEDEV acd0
当这些脚本完成后,你要找一下在/dev目录下有acd0c和racd0c等几个入口,表示程序已经正确执行。
以下是加入声卡节点的例子:
# sh MAKEDEV snd0
注意:当创建完诸如声卡这样的设备节点时,如果其他人有权访问你的机器,可能有必要在/etc/fbtab文件中添加这些节点来保护系统安全。可看一下fstab的联机手册以了解更多信息。
依上述的简单程序,建立任何不在GENERIC里的硬件设备节点。
注意: 所有的SCSI控制器都使用一样的设备节点,所以你无须重新建立节点。另外,网卡与SLIP/PPP虚拟设备并没有任何设备节点,所以你不必担心怎么建立节点。
9.6如果出现问题怎么办?
在定制一个内核时,可能会出现四种问题。它们是:
配置失败
当你在内核描述中看到config命令失败,可能在某个地方发生了一个小错误。幸运的是,config会显示出错的那一行的行号,你可以用vi编辑器做修改。例如,如果你看到:config:line 17:syntax error
可以在vi中用命令模式输入17G来跳到17行。比较GENERIC内核或其他参考资料,以确定你打对了关键字。
编译错误
如果编译失败,通常会在你的内核描述中提示一个错误,但config并没有找出错误。另外,查看一下你的配置信息,如果你仍然无法解决这个问题,可以把你的内核配置信息发邮件到FreeBSD普通问题邮件列表<[email protected]>,它将很快地被解决。
内核无法启动
如果你的新内核无法启动,或无法识别你的硬件,不要担心!幸运的是,BSD有一个解决复杂内核错误的很好机制。从FreeBSD的启动loader中,选择一个你要启动的内核。当配置一个内核时,记得在手头保留一个能正常启动的内核是个好主意。
在用一个好的内核启动后,你可以检查一下配置文件,再设法重新建立一个内核。一个有帮助的文件是/var/log/messages文件,它记载了每个成功启动的所有内核信息。同样,dmesg命令会列出当前启动中的内核信息。
注意:你在编译内核时,确信保留着一个GENERIC或以其他名字命名的内核。你不能仅依靠kernel.old,因为当你安装一个新内核时,kernel.old会被上一次安装的内核所覆盖。所以,尽快将当前正常工作的内核移到不能正常工作的内核,可以用ps命令查一下。解开编译安装内核文件的正确命令是:
#chflags noschg /kernel
另外,如果你要设定内核或其他文件的访问限制,以至它不能被移动或修改,可以用下 面的命令:
#chflags schg /kernel
内核工作,但ps根本就不工作!
如果你在系统中安装了一个不同版本的内核,例如,在3.x系统中安装了4.x内核,许多系统内建的命令像ps和vmstat会根本不工作。你必须重新编译libkvm库以及这些程序。千万不要随意从其他系统拷贝不同版本的内核来使用。