自订 FreeBSD Kernel (系统核心)
2024-07-26 00:29:20
供稿:网友
Contributed by Jake Hamby .
6 October 1995.
这个略大的章节会讨论如何自订你的 FreeBSD kernel。
这个章节适合初学者以及经验丰富的管理者。
5.1. 为何要自订 kernel ?
5.2. 建立以及安装一个自订的 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, FX001D).
device scd0 at isa? port 0x230 bio
Sony CD-ROM (CDU31, CDU33A).
controller matcd0 at isa? port ? bio
Matsushita/Panasonic CD-ROM (Creative Labs for
SoundBlaster).
_________________________________________________________________
5.3.5. SCSI 装置支援
这个章节讨论许多种 FreeBSD 支援的 SCSI 控制卡及周边装置。
SCSI 控制卡
以下这几行提供 SCSI 控制卡的支援,只需要奶J你所需要的:
controller bt0 at isa? port ``IO_BT0'' bio irq ? vector btintr
大多数的 Buslogic 控制卡
controller uha0 at isa? port ``IO_UHA0'' bio irq ? drq 5 vector
uhaintr
UltraStor 14F 跟 34F
controller ahc0
Adaptec 274x/284x/294x/394x
controller ahb0 at isa? bio irq ? vector ahbintr
Adaptec 174x
controller aha0 at isa? port ``IO_AHA0'' bio irq ? drq 5 vector
ahaintr
Adaptec 154x
controller aic0 at isa? port 0x340 bio irq 11 vector aicintr
Adaptec 152x 跟在音效卡上的 Adaptec AIC-6360 (速度慢!)
controller nca0 at isa? port 0x1f88 bio irq 10 vector ncaintr
使用 NCR 5380 or Trantor T130 的 ProAudioSpectrum
controller sea0 at isa? bio irq 5 iomem 0xc8000 iosiz 0x2000
vector seaintr
Seagate ST01/02 8 bit 控制卡 (速度慢!)
controller wds0 at isa? port 0x350 bio irq 15 drq 6 vector
wdsintr
Western Digital WD7000 控制卡
controller ncr0
NCR 53C81x/82x/87x PCI SCSI 控制卡
options ``SCSI_DELAY=15''
这个参数使得 kernel 在开机时会先等待 15 秒, 再侦测 SCSI
周边装置,有些速度慢的周边 (如 CD-ROM) 需要较长的初始时间。
controller scbus0
如果你有任何的 SCSI 装置,你就需要这个参数。
device sd0
支援 SCSI 硬碟。
device st0
支援 SCSI 磁带机。
device cd0
支援 SCSI CD-ROM。
请注意这个 0 并不是说只支援一台或是 SCSI-ID 0,
无论有多少装置都被支援的。
如果你想要指定 SCSI ID 或是 LUN,请参阅 LINT 中相关的说明。
_________________________________________________________________
5.3.6. Console,滑鼠,及 X Server 支援
你一定要在以下两种显示驱动程式中选一种。 大多数的程式经由终端函式库
(如 termcap)控制显示, 不管你选哪一种都应该能执行。
device sc0 at isa? port ``IO_KBD' tty irq 1 vector scintr
sc0 是内定的显示驱动程式,它是模拟 SCO console 的。
使用的时候,将你的环境变数 TERM 设定成 "scoansi" 或 "cons25"。
device vt0 at isa? port ``IO_KBD'' tty irq 1 vector pcrint
这是 VT200 相容的显示驱动程式,通常是用来给那些不能用 sc0
的机器用的。使用的时候将你的环境变数设成 "vt100" 或 "vt200"。
options ``PCVT_FREEBSD=210''
设定 vt0 程式在 FreeBSD 2.1.0 以上的系统执行。
options XSERVER
奶J XFree86 的 X Windows 所需的支援。
device mse0 at isa? port 0x23c tty irq 5 vector ms
支援 Logitech bus mouse 或 ATI InPort bus mouse card.
注意: 如果你使用 serial mouse (插在 COM1 上),你并不需要这项参数。
device psm0 at isa? port ``IO_KBD'' conflicts tty irq 12 vector
psmintr
使用 PS/2 mouse.
_________________________________________________________________
5.3.7. Serial 跟 Parallel Ports
几乎所有的机器都有这东西,如 印表机 或是 Modem 拨接 等等。
device sio0 at isa? port ``IO_COM1'' tty irq 4 vector siointr
sio0 到 sio3 是四个 seiral ports (即 COM1 到 COM4)。 如果你的
COM4 有内接 Modem,而 COM2 有接 serial 装置, 你必须将 Modem 的
IRQ 改成 2 (IRQ 2 就是 IRQ 9)。 如果你有 multiport serial
卡,请阅读 sio(4)的资料。 有些显示卡 (如某些 S3 的卡) 使用
0x*2e8 的 IO Address, 而有些便宜的 serial 卡没有完全支援
16-bit IO Address, 这些会互相突而使得 COM4 失效。 每个
serial port 都需要有一个独立的 IRQ (除了 Multiport 卡),
所以内定给 COM3 跟 COM4 的 IRQ 是不能使用的。
device lpt0 at isa? port? tty irq 7 vector lptintr
lpt0 到 lpt2 是三个印表机的 port,
大多数人只有一台印表机,你可以将没有用到的移除。
_________________________________________________________________
5.3.8. 网路
FreeBSD,跟一般 UNIX 一样,非常重视网路。
因此,就算你没有网路卡,也请注意那些拨接服务支援。
options INET
网路的支援。就算你不需要网路,你还是需要此参数,
许多程式至少需要 loopback 网路 (即,连接自己的电脑),
所以这是必要的。
Ethernet 网路卡
以下是网路卡的支援,如果你没有网路卡,你可以跳过。
device de0
Digital Equipment DC21040 PCI Ethernet 网路卡
device cx0 at isa? port 0x240 net irq 15 drq 7 vector cxintr
Cronyx/Sigma multiport sync/async (with Cisco or PPP
framing)
device ed0 at isa? port 0x280 net irq 5 iomem 0xd8000 vector
edintr
Western Digital 跟 SMC 80xx; Novell NE1000 跟 NE2000;
3Com 3C503
device el0 at isa? port 0x300 net irq 9 vector elintr
3Com 3C501 (速度慢!)
device eg0 at isa? port 0x310 net irq 5 vector egintr
3Com 3C505
device ep0 at isa? port 0x300 net irq 10 vector epintr
3Com 3C509
device fe0 at isa? port 0x240 net irq ? vector feintr
Fujitsu MB86960A/MB86965A Ethernet 网路卡
device fea0 at isa? net irq ? vector feaintr
DEC DEFEA EISA FDDI 网路卡
device ie0 at isa? port 0x360 net irq 7 iomem 0xd0000 vector
ieintr
AT&T StarLAN 10 and EN100; 3Com 3C507; unknown NI5210
device ix0 at isa? port 0x300 net irq 10 iomem 0xd0000 iosiz
32768 vector ixintr
Intel EtherExpress 16
device le0 at isa? port 0x300 net irq 5 iomem 0xd0000 vector
le_intr
Digital Equipment EtherWorks 2 跟 EtherWorks 3 (DEPCA,
DE100, DE101, DE200, DE201, DE202, DE203, DE204, DE205,
DE422)
device lnc0 at isa? port 0x300 net irq 10 drq 0 vector lncintr
Lance/PCnet cards (Isolan, Novell NE2100, NE32-VL,
PCnet-PCI)
device ze0 at isa? port 0x300 net irq 5 iomem 0xd8000 vector
zeintr
IBM/National Semiconductor PCMCIA Ethernet 网路卡
device zp0 at isa? port 0x300 net irq 10 iomem 0xd8000 vector
zpintr
3Com PCMCIA Etherlink III
注意: 你必须更改某些网路卡 (如 NE2000) 的 port 或 IRQ,因为这些卡的
port/IRQ 并没有一定的标准。
pseudo-device loop
loop 是 TCP/IP 的通用 loopback 装置。 如果你 telnet 或 ftp
localhost,他们将会经由 loopback 连接。这是必须的。
pseudo-device ether
当你有网路卡的时候你才需要 ether。
pseudo-device sl number
sl 提供 SLIP (Serial Line Internet Protocol)
的支援。SLIP一经几乎被 PPP 所取代,因为 PPP 功能较强。其参数
number 代表同时 SLIP 连接数目的个数。 关於 SLIP
的更多资料,请参阅 SLIP Client 或 SLIP Server 。
pseudo-device ppp number
ppp 提供 kernel-mode PPP (Point-to-Point Protocol)
的支援。另外还有一种 user-mode PPP (tun)
提供连线时更多的弹性,以及自动连接的功能。 如果你依然想用
kernel-mode PPP,请阅读 kernel-mode PPP 。 如同 sl 一样,其参数
number 代表同时连接 PPP 的数目。
pseudo-device tun number
tun 提供 user-mode PPP 的支援。 这个模式的 PPP
相当容易设定,而且连线速度快。
而且他还包含更多的新功能,如欲连线时自动拨号连线,
停滞一段时间後自动断线。其参数 number 代表同时连接 PPP 的数目。
请阅读 user-mode PPP 以获得更多的资讯。
pseudo-device bpfilter number
Berkeley 封包过滤器 (packet filter)。
提供网路监听的功能,这些网路上的资料可经由 tcpdump(1)
处理显示,以增进网路安全的目的。 其参数 number
代表同时提供网路介面监听数目的多少。
除非你想要使用网路监听的功能,否则你不需此功能。
有少数网路卡不支援此功能。
_________________________________________________________________
5.3.9. 音效卡
内附的 GENERIC kernel 并不包含音效卡的支援, 你必须参考 LINT
这个设定档来奶J音效卡的支援 (只有 LINT 尼t所有音效卡的设定)。
controller snd0
标准音效呼叫介面,所有的音效卡 (除了 pca 外) 都需要此参数。
device pas0 at isa? port 0x388 irq 10 drq 6 vector pasintr
ProAudioSpectrum digital audio 跟 MIDI.
device sb0 at isa? port 0x220 irq 7 conflicts drq 1 vector sbintr
SoundBlaster digital audio.
注意: 如果你的 SoundBlaster 使用不同的 IRQ (如 5), 你必须将设定中的
irq 7 改成 irq 5, 并且移除 conflicts,此外,你还需要奶Joptions
``SBC_IRQ=5'' 的设定。
此外,你还需要奶J以下几行:
device sbxvi0 at isa? drq 5
SoundBlaster 16 digital 16-bit audio.
注意: 如果你的 SB16 使用不同的 16-bit DMA channel (如 6 或 7),将
drq 5 改成 drq 6 或 drq 7,并奶Joptions "SB16_DMA=6" 的设定。
device sbmidi0 at isa? port 0x330
SoundBlaster 16 MIDI 介面。如果你有 SB16,
你一定要奶J此参数,?ampthinsp;则你的 kernel 将无法完成编译。
device gus0 at isa? port 0x220 irq 10 drq 1 vector gusintr
Gravis Ultrasound.
device mss0 at isa? port 0x530 irq 10 drq 1 vector adintr
Microsoft Sound System.
device opl0 at isa? port 0x388 conflicts
AdLib FM-synthesis 音效卡,如果你有 AdLib、SoundBlaster 跟
ProAudioSpectrum,你需要此参数。 此外,你可以用 playmidi 来播放
MIDI 音效 (在 ports 收集里)。
device mpu0 at isa? port 0x330 irq 6 drq 0
独立的 Roland MPU-401 音效卡。
device uart0 at isa? port 0x330 irq 5 vector ``m6850intr''
独立的 6850 UART MIDI 介面。
device pca0 at isa? port ``IO_TIMER1'' tty
利用 PC 喇叭模拟数位音效,此音效的效果很差, 而且要花不少 CPU
时间,你应该要知道这点。 在你没有音效卡时才考虑此功能。
注意: 你还可以阅读 /usr/src/sys/i386/isa/sound/sound.doc。
此外,你还必须建立相关的 device nodes 给音效卡使用。
_________________________________________________________________
5.3.10. 虚拟装置 (Pseudo-devices)
虚拟装置提供一些特殊的支援,但它们并不是真正的硬体介面。 有一部份的
网路相关的 虚拟装置并不在下列说明中。
pseudo-device gzip
gzip 让你可以执行被 gzip 压缩的 FreeBSD 程式,由於 /stand
中的程式都是被压缩过的, 因此奶J此功能是个好主意。
pseudo-device log
log 提供系统记录 (system log) 的功能, 这是必须的。
pseudo-device pty number
pty 代表 ``虚拟终端机 (pseudo-terminal)'' 或上线人数的多少。
许多程式如 telnet、rlogin、xtermx 和 emacs
等都会使用它。GENERIC kernel 内定只有 16 的 ttys,
你可能会想要将它提高到 32 或 64 以上。
pseudo-device snp number
监看装置 (Snoop device)。提供你监看其他 tty 的资讯 (使用
watch(8) 命令),这牵涉到系统安全以及
使用者隐私权的问题,是可有可无的功能。
pseudo-device vn
Vnode 驱动程式。允许将一个档案利用 vnconfig(8) 当成一个
partition 来使用。通常拿来建立 floppy disk image 或充当 swap
装置 (如跟 MS Windows 共享 swap file),是可有可无的功能。
_________________________________________________________________
5.3.11. 摇杆、PC 喇叭及其他杂七杂八的
本章及讨论 FreeBSD 支援的其他杂七杂八的装置, 这些都是 GENERIC kernel
所没有的功能。 你可能会想参照 LINT 设定档的内容。
device joy0 at isa? port ``IO_GAME''
PC 摇杆的支援。
pseudo-device speaker
支援 IBM BASIC 格式的 PC 喇叭音效。 有些有趣的程式 (如
/usr/sbin/splrtest、/usr/games/piano) 会使用到它。
有关 PC 喇叭的的数位音效请参阅 pca0 。
_________________________________________________________________
5.4. 建立 device nodes
几乎所有 kernel 支援的装置,都有一个在 /dev 下的 ``node''
来相对应。这些 nodes 看起来像是一般的档案,
但是实际上应用程式可以透过这些 nodes 来存取 kernel 的资料。 你可以用
shell script /dev/MAKEDEV 来帮助你建立 nodes。
虽然在安装过程中已经帮你建立一些必备的 nodes,
是你一定会想再新增你所需要的
nodes,尤其是增s功能或安装新硬体的时候。 假A想新增一台 IDE
CD-ROM,你必须在 kernel 设定档中奶J相关的钏w,如G
controller wcd0
这表示你必须看看在 /dev 下有没有 wcd0 的 nodes。 比方说是
wcd0c、rwcd0c 等等。 假设没有这些 nodes,你必须建立它们:
# cd /dev; sh MAKEDEV wcd0
当这个 script 执行完毕时,你应该会看到 wcd0c 或 rwcd0c 等 nodes。
又例如新增音效卡的 nodes:
# cd /dev; sh MAKEDEV snd0
这样将会建立音效卡所需的 nodes。
_________________________________________________________________
5.5. 发生问题的解决方法
再建立自订 kernel 时,有四种问题可能发生:
Config 发生错误
如果 config 抱怨这个错误时,你的 kernel 设定档可能有错误,
config 会指出哪些行错了,请重新检查那些行。 比方说你看到:
config: line 17: syntax error
表示你的 kernel 设定档的 17 行有错误,请用编辑器修正。
Make 失败
如果执行 make 时发生错误,有可能是你的 kernel 设定档有错误,
但是 config 程式并没有检查出来,请再检查 kernel
设定档是否有错误, 或是缺少该有的参数。 如果在编译过程中发生
"compiler internal error" 或 "signal 11" 等等,
可能你的硬体设备不是很稳定。
Kernel 无法开机
如果你的新 kernel 无法开机,或是无法侦测到你新左熊w体装置,
你可以在开机时,键入其他 kernel 的名称 (如 boot: /kernel.old),
如果连其他 kernel 都无法开机,你可以试试 kernel.GENERIC。
在用旧的 kernel 开机後,检查你的 kernel 钏w档是否有误,
修改後再重新编译一个新的 kernel。 你可以参考 /var/log/messages
中的开机记录,或是执行 dmesg(8)。
注意: 在 FreeBSD 中有另一种 file flag 来保护重要档案,
如果你无法移动或删除 /kernel,你可以执行:
# chflags noschg /kernel
如果你想保护 /kernel 避免人为疏失破坏它,请执行:
# chflags schg /kernel
Kernel 可以开机,但 ps 或是 w 发生错误
如果你更新 kernel 原始程式 (如从 2.1.0-RELEASE 升级到
2.2-CURRENT),你必须一更新 (或重新编译) 一些重要的档案, 如
ps(1)、vmstat(8)或是libkvm。