第八章 编译核心

核心 (kernel) 顾名思义是整个操作系统的核心,系统一开机即加载核心,它控制了整个系统的运作,包含和硬件沟通、系统资源配置、内存管理、档案系统管理等等。

本章将介绍如何客制化一个核心,它可以缩小您的系统、增加支持的软硬件、更改系统限制等。读完本章后,您将了解下列主题:

8.1 为什么要重新编译核心

传统上,我们将所有支持的硬件、档案系统等全部放到核心中,每次有新增的硬件或功能都必须重新编译核心,并重新启动计算机。但随着支持的功能越来越多,系统核心变得越来越肥大,而重新开机以加载新加入的功能也不符合现代操作系统的需求。

目前 FreeBSD 许多可以独立出来的功能都能做成所谓的核心模块 (kernel module),当系统有需要使用该模块时,才将它加载核心中。这么做的好处就是可以让我们更快加入硬件驱动程序,更方便地加入我们想要的功能。所有可以独立出来的模块都可以编译放入核心中,然而,使用动态加载的方式和直接编入核心中各有优缺,直接编入核心中可以减少加载的时间,而动态加载可以让我们在不需要用到该功能时立即从系统中移除其所占用的资源。以 DVD 所使用的档案系统格式为例,我们平常可能很少用到 DVD,所以并未将它加入核心中。但当需要时,我们可以 kldload 这支程序来动态加载该模块,使用完毕后,也可以立即使用 kldunload 将它从核心中移除,在使用上方便许多。

我们刚安装完 FreeBSD 时,所使用的核心是一般性的核心,称之为 GENERIC kernel。为了要支持常见的软硬件,因此 GENERIC 核心中可能包含了许多我们用不到的驱动程序,也可能不支持一些特殊的硬件。例如,单单网络卡驱动程序就有数十种被加入 GERERIC 核心中,其实我们只需要使用其中一种。在硬件方面,核心中包含了太多的东西不仅会占去内存的空间,不同程序间也有可能造成冲突。

在软件方面,如果要启动 FreeBSD 的防火墙功能,或是使用 ADSL 联机 (4.4 以前的版本),都需要重新将支持这些功能的参数加到核心中。另外,如果要改变系统的效率,你必须修改核心中的参数,例如增加同时上线的人数、或最大同时开启的档案数等。当然,有的功能在 FreeBSD 中可以经由 sysctl 这个指令来修改,而毋需修改核心,但大部份的功能是一定要修改核心的。过于肥大的核心,开机需要的时间较长,所以我们可以将不必要的设定移除,以加速开机速度。

除此之外,我们常看到 FreeBSD 总部发布安全性漏洞修补程序,在完成原始码的修补之后,大多数的修补都必须重新编译核心。所以我们还是要来了解一下如何为自己量身订做一个新的核心。

请放心,编译核心并不难,其实只有几个步骤,只要依下列的方法去做,相信您对于系统核心将有更深入的了解。

8.2 修改核心

首先,您必须确认在安装 FreeBSD 时,有将所有 FreeBSD 的原始码 src 装进来。请先检查 /usr/src/sys/i386/conf/ 目录存在,您可以在这个目录中看到一个名为 GENERIC 的文字文件,GENERIC 就是安装时用的一般核心。在 FreeBSD 4.x 的版本中,这个目录下还有一个 LINT 的档案,这个档案中包含了所有可用的核心参数,您可以参考这个档以取出所需的设定加入自己的核心中。如果您使用的是 FreeBSD 5.x 以后的版本,请参考 NOTES 这个档。

如果系统中没有 /usr/src/sys 这个目录,表示您在安装时并未安装 FreeBSD 的原始码,您可以使用 sysinstall 这个指令来执行安装的选单工具,并安装原始码。执行了 sysinstall 后,请选择 [Configure] -> [Distribution] -> [src] -> [sys],即可安装核心的原始码。除了使用 sysinstall 外,您也可以先将本书所附第一张光盘放入光驱中,并使用下列指令来安装:

# mount /cdrom
# mkdir -p /usr/src/sys
# ln -s /usr/src/sys /sys
# cat /cdrom/6.0-RELEASE/src/ssys.[a-d]* | tar -xzvf -

有了核心的原始码后,我们就可以开始进行修改。首先,我们要做的就是将 GENERIC 复制一份,并修改复制的那一份。

# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL

上面那一行指令就是把 GENERIC 复制一份叫做 MYKERNEL,新的 KERNEL 要叫什么名字你可以自己取一个比较有意义的名字。建议您不要将自己所修改的核心设定放在 /usr/src/sys/i386/conf 目录下,有时候我们可能会因为硬盘空间不足而删除 /usr/src 这个目录,或者日后进行升级时忘了备份我们编辑过的核心设定档。所以建议您将 GENERIC 复制到其它目录下,再建立一个 link 到 /usr/src/sys/i386/conf,如此一来,我们可以更方便的备份及保存设定。例如,我们可以将它复制到 /root 目录下:

# cd /usr/src/sys/i386/conf
# cp GENERIC /root/MYKERNEL 
# ln -s /root/MYKERNEL

接着就要来修改 MYKERNEL 了,请使用文字处理软件打开 MYKERNEL 后,再依文件中的说明来修改,把不必要的项目移除。必须要注意的是,核心中有的参数是互相依赖的,也就是说某些参数的存在一定要有某一行的支持。现在使用指令 ee 来修改刚才复制的核心:

# ee MYKERNEL

在核心中,如果在一行的开头有"#"表示该行为批注,以下我们针对 GENERIC 核心中每一个参数的说明。

8.2.1 基本的设定

machine	i386

这一行是必备的,代表的是使用 i386 的计算器架构 (architecture),也就是 IBM 兼容个人计算机。FreeBSD 支持的硬件架构包含了 i386、pc98、alpha、sparc64 等。

cpu	I486_CPU
cpu	I586_CPU
cpu	I686_CPU

上面这四行指的是 CPU 的类型,最近的 CPU 都是 I686_CPU。有些 CPU 如 Cyrix 233Hz CPU 或 Pentume Pro 也都是 I686。我们可以在开机后使用 dmesg 指令或参考 /var/run/dmesg.boot 来看 CPU 类型,并移除不必要的类型。

ident	GENERIC

这个可以说是核心的名字,我们在开机时会看到这个字符串,建议将它修改成和您核心设定档同名,例如,MYKERNEL 或 WEBSERVER 等。

maxusers	0

这个项目在 FreeBSD 5.x 后已经不必设定了。这是用来控制系统内部表格(internal system tables)大小的参数,它的值大约是您期望系统同一时间会上线使用的使用者数量。如果您使用的是 FreeBSD 4.5 以上的版本,建议您将它设定 0。如果设成非 0 的数字,这个值一定要设定大于四,maxusers 的值决定了处理程序所容许的最大值,20+16*maxusers 就是你将得到的所容许处理程序。

系统一开机就必须要有 18 个处理程序 (process),即便是简单的执行指令 man 又会产生 9 个 process,所以将这个值设为 64 应该是一个合理的数目。如果你的系统会出现 proc table full 的讯息的话,可以就把它设大一点,例如 128。不过现在的 FreeBSD 很聪明,您只要将它设为 0,FreeBSD 会动态分配合理的值。

值得注意的是 maxusers 的值和同时可以上线的最大使用者人数并无关系,它只是决定你的 kernel 中一些数据结构的大小,真正影响上线人数的是 pseudo-device pty。

8.2.2 一般选项

#makeoptions	DEBUG=-g

这个参数是用来将核心编辑成除错模式。加了这个参数之后,核心会包含一些除错用的信息,除非您需要做核心开发或协助测试核心程序,否则不需要加入这个参数。除错模式的核心会比一般核心庞大许多,而且也会影响系统效能。

options	SCHED_4BSD	# 4BSD scheduler

这是传统的 FreeBSD 排程方式,它会被用来控制系统中所要执行的工作顺序。FreeBSD 5.x 之后加入新的排程方法,称之为 ULE。ULE 主要是为了 SMP 多颗 CPU 排程而设计,但您也可以用来做为一般排程使用。若您想试试 ULE 排程的功能,您可以将 SCHED_4BSD 改为 SCHED_ULE。

options	MATH_EMULATE

这个参数让 kernel 用软件的方式仿真浮点运算,如果你的 CPU 不含浮点运算器,你就必须打开此参数。486-DX 以上的 CPU 可以不需要这一行。不过 FreeBSD 所提供的一般浮点仿真器并不是十分精准,如果你没有浮点运算器却又需要最好的准确度,建议你把这一行改成 GPL_MATH_EMULATE 来使用 GNU 浮点模拟。因为 GNU 版权的关系,因此 FreeBSD 不以它来当作内定的仿真器。由于目前我们所使用的 CPU 都支持浮点运算,所以在 FreeBSD 5.x GENERAL kernel 预设并未加入这个参数。

options	INET		#InterNETworking
options	INET6		#IPv6 communications protocols

上述这二行是因特网沟通协议,就算您不打算连上网络,至少必需保留第一个 INET 的设定,因为大多数的程序都会要求使用 lookback 网络 (就是自己的机器和自己的机器沟通)。INET6 指的是 IPv6 协议,如果您要使用 IPv6 则必需加入该参数。

8.2.3 各种档案系统的支持

options	FFS		#Berkeley Fast Filesystem
options	FFS_ROOT		#FFS usable as root device [请勿删除]

这是最基本的档案系统支持,如果你是从硬盘开机的,你一定需要它。FreeBSD 5.x 已经不再需要 FFS_ROOT 这个选项了,所以如果您使用 5.x 并不会看到这一行。

options	SOFTUPDATES	#Enable FFS soft updates support

使用 soft update 可以加速对硬盘的在取速度,我们必须先再核心中加入对于 soft update 的支持,再针对不同的档案分割区启动此功能。您可以打指令 mount 来查看各个分割区是否已启动 soft update,如果没有,tunefs 这个指令来启动它。我们在安装 FreeBSD 时,预设除了根目录的分割区外,其它的磁盘分割区都会将此功能打开。

options	UFS_ACL		#Support for access control lists

FreeBSD 5.x 才加入这个选项,它是一种权限控制的功能,预设是开启的状态。一旦这个选项打开始,并开始使用档案系统之后,最好不要将它关闭,以避免奇怪的问题产生。

options	UFS_DIRHASH	#Improve performance on big directories

这个选项可以加快 FreeBSD 对于大型目录的处理速度,但将需要很大的内存空间。如果此核心是供大型服务器使用,加入这个参数可以有比较好的效能。

options	MFS		#Memory Filesystem
options	MD_ROOT		#MD is a potential root device

内存映对档案系统 (Memory-mapped Filesystem)。基本上它容许我们将一块内存空间当做档案系统来使用,以达到快速存取暂存盘的功能。例如,我们可以分割出一个 MFS 供 /tmp 使用,因为许多程序会利用 /tmp 建立暂时档案,而 MFS 是将档案系统挂在内存中,对于数据的存取会快很多。不过 FreeBSD 5.x 后已经不再使用 MFS 而改由 md-backed 档案系统所取代。

options	NFSCLIENT		#Network Filesystem Client
options	NFSSERVER		#Network Filesystem Server
options	NFS			#Network Filesystem (4.x 才有)
options	NFS_ROOT		#NFS usable as /, requires NFSCLIENT

这些选项是传统的 UNIX 都支持的网络档案系统,在 FreeBSD 4.x 中,只有 NFS 及 NFS_ROOT 这二个选项。而 FreeBSD 5.x 将 NFS 分成 NFS 客户端及服务器二个选项。传统的 NFS 是使用 UDP 的方式传输。但 FreeBSD 的 NFS 支持 TCP 模式,如果您不打算使用 TCP 模式,您可以将这些选项移除。

options	MSDOSFS		#MSDOS Filesystem

支持 MS-DOS 档案系统。除非你每次开机都要使用 MS-DOS 档案系统,否则您可以将它移除,系统会在你使用到 MSDOS 档案系统时自动加载核心模块。除此之外,你也可以使用 mtools来存取 DOS 的软盘,这并不需要有 MSDOS 档案系统的支持。

options	CD9660		#ISO 9660 Filesystem
options	CD9660_ROOT	#CD-ROM usable as root, CD9660 required

ISO 9660 是 CD-ROM 的档案系统,如果你只是偶尔用到 CD-ROM,你可以此功能移除,同样的,系统会在使用到 CD-ROM 时自动加载核心模块。此外,当我们使用 CD-ROM 听音乐时并不需要 CD9660 的支持。CD9660_ROOT 只有当我们要拿 ISO 9660 档案系统做根目录时才需要,FreeBSD 5.x 后预设已将它移除。

options	PROCFS		#Process filesystem

处理程序档案系统,它是将一些系统信息伪装成档案系统并挂入 /proc 目录下,让一些系统监控软件 (如 ps 这个指令) 可以从中得到执行中的处理程序的信息。在 FreeBSD 5.0 以后的版本预设不再使用 /proc,大多数的监控程序也都改成不必使用 /proc 来得到系统信息。如果您使用的是 FreeBSD 5.x 以后的版本,要使用 PROCFS 还必须加入下列这一个参数:

options	PSEUDOFS		#Pseudo-filesystem framework

这个参数只出现在 FreeBSD 5.x 后,FreeBSD 4.x 并无此参数。

8.2.4 软硬件兼容性设定

options	COMPAT_43		#Compatible with BSD 4.3 [KEEP THIS!]

这是为了要和 4.3 BSD 兼容所使用的参数,请不要将它移除,否则有些应用程序可能会出现奇怪的影响。

options	COMPAT_FREEBSD4	#Compatible with FreeBSD4
options	COMPAT_FREEBSD5	#Compatible with FreeBSD5

FreeBSD 6.x 做了许多修改,为了兼容于 FreeBSD 4.x、5.x 的系统呼叫 (system call),建议您保参这个设定。

options	SCSI_DELAY=5000	#Delay (in ms) before probing SCSI

这个选项控制了开机时寻找 SCSI 设备时要延迟多久 (MILLISECONDS),预设是 5 秒。有的 SCSI 需要一段时间来进行被始化的动作,当使用 IDE 的硬盘开机时,我们可以忽略这一行。如果您是以 SCSI 硬盘开机,您可以把这一行的数字调小一点以加快开机的速度。当然,如果因此抓不到硬盘,您就必须再把这个值调高一点。

options	UCONSOLE		#Allow users to grab the console

允许使用者抓取console 所印出的讯息。这个选项对于 X window 使用者尤其有用。例如,我们可以使用 xterm -C 来模拟 console,以得到 talk、write (一种在 UNIX 网络聊天的功能) 所传来的讯息,或是任何从系统发出的讯息。不过 FreeBSD 5.x 后已不再需要这个选项。

options	USERCONFIG		#boot -c editor
options VISUAL_USERCONFIG	#visual boot -c editor

这个选项可以让我们在开机时编辑开机选项。FreeBSD 5.x 后已不再支持这二个选项,而改用 device.hints,请 man device.hints。

options	KTRACE		#ktrace(1) support

允许使用核心除错追踪,通常只有对于核心开发者比较有用。

options	SYSVSHM		#SYSV-style shared memory

这个参数提供 System V 共享内存的支持。最常使用 SYSVSHM 的是 X Windows 的 XSHM 功能,有些图形化的程序用使用它来提高执行速度。如果你使用 X Windows 或是 BBS,你一定要打开此参数。

options	SYSVMSG		#SYSV-style message queues

提供 System V messages 的支持,虽然不常用到,但是它只占一点点 kernel 的空间。如果你架 bbs 站,这是一定要的啦。

options	SYSVSEM		#SYSV-style semaphores

提供 System V semaphores 的支持,虽然不常用到,但是它只占一点点 kernel 的空间。您可以使用 ipcs 这个指令来查看是否有应用程序使用 System V 的这些选项,例如 Postsgre SQL 就必须用到。

options	P1003_1B		#Posix P1003_1B real-time extensions
options	_KPOSIX_PRIORITY_SCHEDULING

Real-time extensions added in the 1993 POSIX。有些程序 (如 star office) 会用到它。FreeBSD 5.x 后不再需要 P1003_1B 这个选项。

options	ICMP_BANDLIM	#Rate limit bad replies

这个选项限制 ICMP 封包错误回应所使用的频宽,它可以降低我们被阻断式攻击 (denial of service packet) 的危险。如果您使用 FreeBSD 4.x,建议您保留该选项。FreeBSD 5.x 后预设已将此功能打开,所以这个选项在 6.x 已经不需要了。

# To make an SMP kernel, the next two are needed
options	SMP		# Symmetric MultiProcessor Kernel
device	apic		# I/O APIC

这二个选项可以使用多颗 CPU,FreeBSD 5.x 后对于多颗 CPU 的支持有更好的效率,如果您只使用单颗 CPU,可以将此选项关闭。

8.2.5 总线及软盘机

device	isa
device	eisa
device	pci

所有 FreeBSD 支持的硬件一定有上述其中之一的总线,isa 总线在现在的 i386 机器上已经很少见了。而 eisa 在 586 以后的主机板已经没见过了。pci 应该是目前的主流,只要您有 pci 适配卡就必须打开此选项。

device	agp		# support several AGP chipsets

这个选项是用来支持 AGP 适配卡,大多数的显示卡都是 AGP 接口。

#FreeBSD 4.x
device	fdc0 at isa? port IO_FD1 irq 6 drq 2
device	fd0 at fdc0 drive 0
device	fd1 at fdc0 drive 1
# FreeBSD 5.x 以后
device	fdc

以上几个选项用以支持软盘机,在 FreeBSD 5.x 后只需要一个 fdc 即可。而使用 FreeBSD 4.x 时,如果您只有一个软盘机,您可以将 fd1 移除。

8.2.6 IDE 接口装置

device	ata

这是 ATA 及 ATAPI 的驱动程序,如果您有 ATA 硬盘或光驱,一定要打开这个选项。如果要支持以下任何 IDE 接口装置都必须将这个选项打开。

device	atadisk		# ATA disk drives
device	ataraid		# ATA RAID drives
device	atapicd		# ATAPI CDROM drives
device	atapifd		# ATAPI floppy drives
device	atapist		# ATAPI tape drives

以上装置分别是 ATA 硬盘、ATA 磁盘阵列装置、IDE 光驱、IDE 软盘机、及 IDE 磁带机。您可以将不必要的装置移除,例如 IDE 软盘机等。

options	ATA_STATIC_ID	#Static device numbering

这个选项用来将 ATA 控置单元设定为固定的控制编号,通常用在一些比较旧的设备上。

8.2.7 SCSI 装置

device	ahb		# EISA AHA1742 family
device	ahc		# AHA2940 and onboard AIC7xxx devices
device	ahd		# AHA39320/29320 and onboard AIC79xx devices
device	amd		# AMD 53C974 (Tekram DC-390(T))
device	isp		# Qlogic family
device	mpt		# LSI-Logic MPT-Fusion
#device	ncr		# NCR/Symbios Logic
device	sym		# NCR/Symbios Logic (newer chipsets + those of `ncr')
device	trm		# Tekram DC395U/UW/F DC315U adapters

device	adv		# Advansys SCSI adapters
device	adw		# Advansys wide SCSI adapters
device	aha		# Adaptec 154x SCSI adapters
device	aic		# Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
device	bt		# Buslogic/Mylex MultiMaster SCSI adapters

device	ncv		# NCR 53C500
device	nsp		# Workbit Ninja SCSI-3
device	stg		# TMC 18C30/18C50

以上这些项目都是 SCSI 适配卡的驱动程序,如果您有 SCSI 适配卡,您可以使用 dmesg 去查看您的适配卡型号,并留下所需的驱动程序即可。如果您只有 IDE 设备,您可以将所有项目移除。

device	scbus # SCSI bus (required for SCSI)
device	ch		# SCSI media changers
device	da		# Direct Access (disks)
device	sa		# Sequential Access (tape etc)
device	cd		# CD
device	pass		# Passthrough device (direct SCSI access)
device	ses		# SCSI Environmental Services (and SAF-TE)

这些是 SCSI 接口的设备,如果您有任何 SCSI 接口的设备或是 USB 硬盘、大姆哥,一定要保留 scbus 这个 SCSI 总线的选项。ch 是 SCSI media changer (一种备份用的设备)。如果您有 SCSI 硬盘或是 USB 硬盘,请保留 da 这个选项。而 sa 及 cd 分别是 SCSI 磁带机及光驱。

# RAID controllers interfaced to the SCSI subsystem
device	amr		# AMI MegaRAID
device	asr		# DPT SmartRAID V, VI and Adaptec SCSI RAID
device	ciss		# Compaq Smart RAID 5*
device	dpt		# DPT Smartcache III, IV - See NOTES for options
device	iir		# Intel Integrated RAID
device	ips		# IBM (Adaptec) ServeRAID
device	mly		# Mylex AcceleRAID/eXtremeRAID
device	twa		# 3ware 9000 series PATA/SATA RAID


# RAID controllers
device	aac		# Adaptec FSA RAID
device	aacp		# SCSI passthrough for aac (requires CAM)
device	ida		# Compaq Smart RAID
device	mlx		# Mylex DAC960 family
device	pst		# Promise Supertrak SX6000
device	twe		# 3ware ATA RAID

以上是磁盘阵列装置,如果您没有任何磁盘阵列,可以将它们全部移除。

8.2.8 基本外围设备

# atkbdc0 controls both the keyboard and the PS/2 mouse
device	atkbdc		# AT keyboard controller
device	atkbd		# AT keyboard
device	psm		# PS/2 mouse

atkbdc 这个选项用来控制键盘及鼠标。而 atkbd 及 psm 分别为 AT 键盘及 PS/2 鼠标的驱动程序。

device	vga		# VGA video card driver

这是显示卡的驱动程序。

# FreeBSD 4.x
pseudo-device	splash
# FreeBSD 5.x 以后的版本
device	splash		# Splash screen and screen saver support

启动时更新屏幕,屏幕保护程序会使用到它。FreeBSD 4.x 及 5.x 后所使用的选项不太一样喔。

# syscons is the default console driver, resembling an SCO console
# FreeBSD 4.x
device	sc0 at isa? flags 0x100
# FreeBSD 5.x 以后的版本
device	sc

这是预设的 console 驱动程序,如果有屏幕一定要保留这个选项。

# Enable this for the pcvt (VT220 compatible) console driver
#device		vt
#options 	XSERVER		# support for X server on a
			# vt console
#options 	FAT_CURSOR	# start with block cursor

支持 vt 200 及 vt100 等兼容终端机。

# Floating point support - do not disable.
device	npx

这是支持 FreeBSD 浮点运算,请勿移除。

device	agp

这是用来支持 AGP 显示卡的驱动程序。

# Power management support (see NOTES for more options)
# FreeBSD 4.x
device	apm0	at nexus? disable flags 0x20
# FreeBSD 5.x 以后的版本
#device	apm

支持 APM 电源管理,在 FreeBSD 4.x 下,如果您想要在打指令 shutdown -p 时能自动关机,请将 disable 字样移除。FreeBSD 5.x 后请将 apm 该行的井字号移除。接着必须在 /etc/rc.conf 中加入下列二行:

apm_enable="YES"
apmd_enable="YES"

 

# Add suspend/resume support for the i8254.
device	pmtimer

这是用来支持 i82454 休眠待命模式。

# PCCARD (PCMCIA) support
# FreeBSD 4.x
device	card
device	pcic0	at isa? irq 0 port 0x3e0 iomem 0xd0000
device	pcic1	at isa? irq 0 port 0x3e2 iomem 0xd4000 disable

# FreeBSD 5.x 以后的版本
# Pcmcia and cardbus bridge support
device	cbb		# cardbus (yenta) bridge
device	pccard		# PC Card (16-bit) bus
device	cardbus		# CardBus (32-bit) bus

这些是 PCMCIA 适配卡的驱动程序,如果您使用的是笔记型计算机,请保留这些项目。FreeBSD 5.x 后支持 32 bit 的 PCMCIA 接口,但 FreeBSD 4.x 不支援喔。

# Serial (COM) ports
# FreeBSD 4.x
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
# FreeBSD 5.x 以后的版本
device	sio		# 8250, 16[45]50 based serial ports

支持串行端口 Serial (COM) ports。在 FreeBSD 4.x 下,sio0、sio1 等分别代表着 COM1、COM2、COM3、COM4。而 FreeBSD 5.x 后只要一个 sio 即可。通常我们只有 COM1 及 COM2,如果您有内接式的调制解调器,您可能要保留 COM3 或 COM4。

# Parallel port
device	ppc
device	ppbus		# Parallel port bus (required)
device	lpt		# Printer
device	plip		# TCP/IP over parallel
device	ppi		# Parallel port interface device
#device	vpo		# Requires scbus and da

这些是并列端口及其它并列端口装置 (如列表机) 的驱动程序。

8.2.9 网络卡设定

device	de		# DEC/Intel DC21x4x (``Tulip'')
device	em		# Intel PRO/1000 adapter Gigabit
device	ixgb		# Intel PRO/10GbE Ethernet Card
device	txp		# 3Com 3cR990 (``Typhoon'')
device	vx		# 3Com 3c590, 3c595 (``Vortex'')

这些是网络卡的驱动程序,您可以使用 dmesg 去查看自己的网络卡型号,并保留所需要的型号设定即可。

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device	miibus		# MII bus support

如果您使用的是下列这些 PCI 10/100 的网络卡,请保留 MII bus 这个选项。

device	bfe		# Broadcom BCM440x 10/100 ethernet
device	bge		# Broadcom BCM570xx Gigabit Ethernet
device	dc		# DEC/Intel 21143 and various workalikes
device	fxp		# Intel EtherExpress PRO/100B (82557, 82558)
device	lge		# Level 1 LXT1001 gigabit ethernet
device	nge		# NatSemi DP83820 gigabit ethernet
device	pcn		# AMD Am79C97x PCI 10/100 (precedence over 'lnc')
device	re		# RealTek 8139C+/8169/8169S/8110S
device	rl		# RealTek 8129/8139
device	sf		# Adaptec AIC-6915 (``Starfire'')
device	sis		# Silicon Integrated Systems SiS 900/SiS 7016
device	sk		# SysKonnect SK-984x and SK-982x gigabit ethernet
device	ste		# Sundance ST201 (D-Link DFE-550TX)
device	ti		# Alteon Networks Tigon I/II gigabit ethernet
device	tl		# Texas Instruments ThunderLAN
device	tx		# SMC EtherPower II (83c170 ``EPIC'')
device	vge		# VIA VT612x gigabit ethernet
device	vr		# VIA Rhine, Rhine II
device	wb		# Winbond W89C840F
device	xl		# 3Com 3c90x (``Boomerang'', ``Cyclone'')

上列为 PCI 的网络卡,请使用 dmesg 查看您的网络卡型号,并保留所需的型号即可。请注意上列网络卡都必须要有 MII bus 的支持。

# ISA Ethernet NICs.  pccard nics included.
device	cs		# Crystal Semiconductor CS89x0 NIC
# 'device ed' requires 'device miibus'
device	ed		# NE[12]000, SMC Ultra, 3c503, DS8390 cards
device	ex		# Intel EtherExpress Pro/10 and Pro/10+
device	ep		# Etherlink III based cards
device	fe		# Fujitsu MB8696x based cards
device	ie		# EtherExpress 8/16, 3C507, StarLAN 10 etc.
device	lnc		# NE2100, NE32-VL Lance Ethernet cards
device	sn		# SMC's 9000 series of ethernet chips
device	xe		# Xircom pccard ethernet
# ISA devices that use the old ISA shims
#device	le

ISA接口的网络卡。如果很不幸的你的网络卡是 ISA 接口,建议你换成 PCI 的适配卡,否则你应该要先知道你使用的 irq 及 port。如果你的型号是 ed0 ,则请勿移除上述的 miibus。

# Wireless NIC cards
device	wlan		# 802.11 support
device	an		# Aironet 4500/4800 802.11 wireless NICs.
device	awi		# BayStack 660 and others
device	ral		# Ralink Technology RT2500 wireless NICs.
device	wi		# WaveLAN/Intersil/Symbol 802.11 wireless NICs.
#device	wl		# Older non 802.11 Wavelan wireless NIC.

这些是无线网络卡。

8.2.10 虚拟装置

device random # Entropy device
# FreeBSD 4.x
pseudo-device	loop	# Network loopback
# FreeBSD 5.x 以后的版本
device	loop		# Network loopback

这二个虚拟的装置分别用来做随机运算及 loopback 网络,请保留这二个选项。

device	mem		# Memory and kernel memory devices

这是系统的内存装置。

device	io		# I/O device

这是支持 user space 程序直接存取系统 I/O,X Windows 需要这个项目。

device	radom		# Entropy device

这是用来产生随机密码数字之类的装置。

# FreeBSD 4.x
pseudo-device	ether	# Ethernet support
# FreeBSD 5.x 以后的版本
device	ether		# Ethernet support

这是用来支持以太网络,只要您有网络卡都必须保留这个项目。

# FreeBSD 4.x
pseudo-device	sl 1
# FreeBSD 5.x 以后的版本
device	sl		# Kernel SLIP

sl 用以支持 SLIP,SLIP已经几乎被 PPP 所取代,ppp 可以更简单、快速的建立 modem-to-modem 联机。在 sl 后面的数字是要仿真多少条 SLIP。

# FreeBSD 4.x
pseudo-device	ppp 1	# Kernel PPP
# FreeBSD 5.x 以后的版本
device	ppp		# Kernel PPP

支持 ppp 拨接连线。

# FreeBSD 4.x
pseudo-device	tun	# Packet tunnel.
# FreeBSD 5.x 以后的版本
device	tun		# Packet tunnel.

tun 会被 ppp 所使用,如果您有拨接网络 (含 ADSL 拨号) 一定要保留这个选项。

# FreeBSD 4.x
pseudo-device	pty	# Pseudo-ttys (telnet etc)
# FreeBSD 5.x 以后的版本
device	pty		# Pseudo-ttys (telnet etc)

最大的 ttys,如 telnet 同时上线最大人数,在 FreeBSD 4.x 预设是 16。你可以在 pty 的后面加上数字来提高人数,最大是 256。FreeBSD 5.x 后则毋需担心这个问题。

# FreeBSD 4.x
pseudo-device	md	# Memory "disks"
# FreeBSD 5.x 以后的版本
device	md		# Memory "disks"

用来支持虚拟的 Memory disk,这是一种将某块内存拿来当成磁盘驱动器使用的虚拟装置。

# FreeBSD 4.x
pseudo-device	gif	# IPv6 and IPv4 tunneling
# FreeBSD 5.x 以后的版本
device	gif		# IPv6 and IPv4 tunneling

支持 IPv6 和 IPv4 之间的沟通。

# FreeBSD 4.x
pseudo-device	faith 1	# IPv6-to-IPv4 relaying (translation)
# FreeBSD 5.x 以后的版本
device	faith		# IPv6-to-IPv4 relaying (translation)

用以支持 IPv6 和 IPv4 之间的转换。

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# FreeBSD 4.x
pseudo-device	bpf	# Berkeley packet filter
# FreeBSD 5.x 以后的版本
device	bpf		# Berkeley packet filter

这是 Berkeley Packet Filter,可以让我们的网络卡支持 promiscuous mode,一些网络监控程序会需要使用这个装置,例如 tcpdump、ethereal 等。

8.2.11 USB 装置

device	uhci		# UHCI PCI->USB interface
device	ohci		# OHCI PCI->USB interface
device	ehci		# EHCI PCI->USB interface (USB 2.0)
device	usb		# USB Bus (required)
#device	udbp		# USB Double Bulk Pipe devices
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
device	ural		# Ralink Technology RT2500USB wireless NICs
device	urio		# Diamond Rio 500 MP3 player
device	uscanner	# Scanners

以上为 USB 装置的驱动程序,请参考井字号之后的批注。如果您要使用 USB 2.0 的装置,请记得将 ehci 装置前面的井号移除。

# USB Ethernet, requires mii
device	aue		# ADMtek USB ethernet
device	axe		# ASIX Electronics USB ethernet
device	cdce		# Generic USB over Ethernet
device	cue		# CATC USB Ethernet
device	kue		# Kawasaki LSI USB Ethernet
device	rue		# RealTek RTL8150 USB Ethernett

这些是 USB 接口的网络卡,如果您要支持任何一种,都必须将 miisub 的选项打开。

小提示

看了这么多项目头都晕了。如果您不知道怎么修改,我的建议是:

  1. 移除不必要的网络卡驱动程序。
  2. 移除不必要的 SCSI 装置。但不要移除 scbus、ch、da 等项目。
  3. 移除不必要的 IDE 装置,如 IDE 软盘。
  4. 如果您不使用 USB,也可以将 USB 装置移除。

8.3 编译与安装

8.3.1 编译新的核心

修改完核心之后,记得要先存盘,接着可以开始编译了。编译核心有二种方式,大部份的时候,我们可以任意使用这二种方法其中之一,使用第二种方式所需要的时间稍微长一点,以下是一些参考的法则:

FreeBSD 支持一种名为 CVSup 更新所有原始码的方式,更新完原始码后,要执行 make world 来重新编译所有程序,这时候就要使用方式二。

方式一:

第一种是使用传统的编译方式,以下范例所使用的核心设定档名为 MYKERNEL,请改成您所使用的档名。首先我们先使用 config 这个指令会依照我们所修改的设定档成出编译核心所需要的档案。

# cd /usr/src/sys/i386/conf
# config MYKERNEL

config 这个指令会产生一个编译所使用的目录,如果您在执行 config 后发现错误讯息,请检查您所修改的档案是否有问题,例如语法错误等。

小提示

如果您想要知道您修改过什么,可以使用下列指令来看二个档案的差异:

# diff -ub GENERIC MYKERNEL

这样一来,您就可以看看是改了什么东西造成错误的发生,不错吧!

接下来就要到编译用的目录下。FreeBSD 5.0 以前的目录和 5.x 后的目录不一样哦:

FreeBSD 4.x:

# cd ../../compile/MYKERNEL/

FreeBSD 5.x 以后:

# cd ../compile/MYKERNEL/

接下来就可以开始进行编译了:

# make depend
# make

上面的指令完成后,应该就完成了核心的编译。如果在过程中出现错误的讯息,注意一下错误是什么,并再次修改核心设定档。一般常见的错误可能是某一个设备的设定需要另一个设定,例如网络卡驱动程序要求 miibus,而却将它移除了。

完成了上述的步骤确定没问题时,就要安装新的核心了。使用下列指令加以安装:

# make install

完成安装后,我们就可以移除编译过程所产生的档案了:

如果是 FreeBSD 4.x:

# cd / ; rm -rf /usr/src/sys/compile/MYKERNEL

如果是 FreeBSD 5.x 以后:

# cd / ; rm -rf /usr/src/sys/i386/compile/MYKERNEL

方式二:

在 FreeBSD 4.2-STABLE 2001年2月以后的版本,我们可以使用新的方式来编译及安装新的核心:

# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL

安装完成后,将编译过程中使用的档案删除:

# rm -rf /usr/obj/usr/src/sys/MYKERNEL

最后我们就可以重新开机了,在重新开机之前,我们多下了几个 sync 这个指令。这个指令的用意是要求系统将所有暂存在内存内的数据都写入硬盘。

# sync;sync;sync;reboot

8.3.2 新的核心有问题

万一很不幸的,你发现编完核心后,无法开机进入 FreeBSD,这时候就要使用旧的核心来开机了。

如果是 FreeBSD 4.x,请在开机时看到倒数计时的时候,按 Enter 以外的键,会出现 boot: 这时候就先打 unload 来将已加载的数据移除,再打 /kernel.old 以使用旧的核心。

boot: unload
boot: /kernel.old

万一连旧的核心也无法使用时,就使用安装时的核心。

boot: /kernel.GENERIC

如果您使用的是 FreeBSD 5.x 以后,请在看到开机选单时按 6 以进入 loader 模式,并输入下列指令以使用旧的 kernel 开机:

OK unload
OK boot /boot/kernel.old

在 FreeBSD 4.x 下,如果你想要删除坏的核心,由于 kernel 文件有特殊的档案属性,因此必须先使用下列指令修改属性,之后才可以删除。

# chflags noschg /kernel
# rm -rf /kernel

值得注意的是FreeBSD 5.x 后的 kernel 放在 /boot/kernel 目录下,而旧的核心在 /boot/kernel.old

小提示

如果您一直卡在 compile kernel 无法成功,不要气馁,其实使用 GENERIC kernel 也没什么不好。您可以先将时间花在系统其它的设定上,等有时间再回来研究,这样比较不会因为一点小问题拖延您学习的时间。