精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● FreeBSD>>安装与升级>>[手册] 如何在FreeBSD下定制核心 kernel

主题:[手册] 如何在FreeBSD下定制核心 kernel
发信人: SunGang()
整理人: zhcharles(2001-06-17 19:52:22), 站内信件
定制 FreeBSD Kernel (系统核心)

1. 为什么要定制 kernel ?

建立一个定制的 kernel 是每个 UNIX 系统管理者所必须学习的重要课题。这个过程虽然
耗时,但是将会对你的 FreeBSD 系统带来许多好处。一个定制的 kernel,只会包含支持
你硬件的驱动程序,而一个 GENERIC kernel 却包含大多数的硬件驱动程序以便在各种机
器上运行。定制的 kernel 将包含下列优点:


   1)开机时只需要花较少的时间,因为 kernel 不需花额外的时间去检测你没有的硬件
是否存在。 
   2)定制的 kernel 通常占较少的内存,这是很重要的。因为 kernel 本身是一个常
驻在内存中的程序,那些没有用到的程序 (如 GENERIC kernel) 将会占去你其他程
序运行时的内存空间。因此,在一个内存较小的机器上,建立一个定制的 kernel 
将是相当重要的。 

   3)最后,有你可以调整许多的 kernel 参数来符合你的需求,以及加入其他 (如声卡
的驱动程序) ,这些是 GENERIC kernel 所没有的。

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 无法开机 。


注意: 如果你增加新的硬件 (如声卡),你必须建立一些 device nodes 到你的 /dev 下。 

3. kernel 配置文件

这个文件的内容相当简单。每一行都包含了一个关键字以及它的参数。任何以 # 开头的
行都被视为注解而忽略。接下来会介绍 GENERIC (一般配置文件) 中所含有的关键字。
另一个配置文件 LINT 中包含绝大多数的详细关键字,LINT 中并有详细说明,如果你有
任何疑问可以参照 LINT。

传统上 kernel 配置文件中的关键字会以 -D 的方式由 CFLAGS 传递给编译程序,但是
这样做所有的文件都有可能被影响。

现在我们有了新的方法。config 这个程序会将那些关键字分门别类的放到 opt_foo.h,
这样只有相关的源程序才会参照到这些配置文件。

3.1. 一定要有的关键字

以下是你的 kernel 配置文件中一定要有的关键字。



machine ``i386''
第一个关键字是 machine,如果你是在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 
= 16或更大的值是必须的。

注意: 这个数字并不是代表你的系统可以同时登录的人数,它只是决定你的 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。


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
允许用户存取 console,对 X Windows 是很有用的。比如,你可以用 xterm -C
来存取传到 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)。 


3.3. 文件系统的参数

这些参数提供各种文件系统的支持,你一定要包含一种以上的文件系统以便开机所需。
如果你是从硬盘开机,你必须包含 FFS; 如果你用 diskless 开机 (网络开机),你必须
包含NFS。此外,你还可以将常用到的文件系统包含进去 (如 MSDOS)。但是你可以将这
些非开机必备的文件系统拿掉,FreeBSD 会利用动态载入模组 (Loadable Kernel 
Module) 在你用到文件系统时,自动将文件系统模组从 /lkm 载入使用。



options FFS
最基本的文件系统支持,如果你是从硬盘开机的,你一定需要它。

options NFS
网络文件系统(Network Filesystem),除非你想要经由网络存取 (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 中加入以下这行并重新开机或输入 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
加入 quota 的支持,可以用来限制用户能用的硬盘空间。请参阅 quota(1) 的说明
(man quota)。


3.4. 基本控制卡以及插卡

这些章节讨论 FreeBSD 的硬盘、磁带机、CD-ROM 的支持。



controller isa0
所有的 PC 都应该加入 ISA 的支持。如果你的系统是 IBM PS/2 (Micro Channel
Architecture),很抱歉现在 FreeBSD 并不支持。

controller pci0
加入 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).




3.5. SCSI 设备支持

这里讨论许多种 FreeBSD 支持的 SCSI 控制卡及外围设备。


SCSI 控制卡
以下这几行提供 SCSI 控制卡的支持,只需要加入你所需要的: 


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 中相关的说明。



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
加入 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.



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,大多数人只有一台打印机,你可以将没有
用到的删除。

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 代表同时提供网络
接口监听数目的多少。除非你想要使用网络监听的功能,否则你不需此功能。有少数网
路卡不支持此功能。



内附的 GENERIC kernel 并不包含声卡的支持,你必须参照 LINT 这个配置文件来加入
声卡的支持 (只有 LINT 包含所有声卡的支持)。



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,此外,你还需要加入options ``SBC_IRQ=5'' 的设置。 
此外,你还需要加入以下几行:

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,并加入options "SB16_DMA=6" 的设置。 

device sbmidi0 at isa? port 0x330
SoundBlaster 16 MIDI 接口。如果你有 SB16,你一定要加入此参数,?thinsp;则你的
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 给声卡使用。 

3.10. 虚拟设备 (Pseudo-devices)

虚拟设备提供一些特殊的支持,但它们并不是真正的硬件接口。有一部份的 网络相关的
虚拟设备并不在下列说明中。



pseudo-device gzip
gzip 让你可以运行被 gzip 压缩的 FreeBSD 程序,由于 /stand 中的程序都是被压缩过
的,因此加入此功能是个好主意。

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),
是可有可无的功能。



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 。

4. 建立 device nodes

几乎所有 kernel 支持的设备,都有一个在 /dev 下的 ``node'' 来相对应。这些 
nodes 看起来像是一般的文件,但是实际上应用程序可以透过这些 nodes 来存取
kernel 的数据。你可以用 shell script /dev/MAKEDEV 来帮助你建立 nodes。虽
然在安装过程中已经帮你建立一些必备的 nodes,是你一定会想再新增你所需要的
nodes,尤其是增加新功能或安装新硬件的时候。假如你想新增一台 IDE CD-ROM,
你必须在 kernel 配置文件中加入相关的设定,如

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. 发生问题的解决方法

再建立定制 kernel 时,有四种问题可能发生:



Config 发生错误
如果 config 抱怨这个错误时,你的 kernel 配置文件可能有错误, config 会指出哪
些行错了,请重新检查那些行。比方说你看到: 

config: line 17: syntax error

表示你的 kernel 配置文件的 17 行有错误,请用编辑程序修正。

Make 失败
如果运行 make 时发生错误,有可能是你的 kernel 配置文件有错误,但是 config 程
序并没有检查出来,请再检查 kernel 配置文件是否有错误,或是缺少该有的参数。如
果在编译过程中发生 "compiler internal error" 或 "signal 11" 等等,可能你的
硬件设备不是很稳定。

Kernel 无法开机 
如果你的新 kernel 无法开机,或是无法检测到你新加的硬件设备,你可以在开机
时,输入其他 kernel 的名称 (如 boot: /kernel.old),如果连其他 kernel 都无
法开机,你可以试试 kernel.GENERIC。在用旧的 kernel 开机后,检查你的 kernel
配置文件是否有误,修改后再重新编译一个新的 kernel。你可以参照 /var/log/messages
中的开机记录,或是运行 dmesg(8)。


注意: 在 FreeBSD 中有另一种 file flag 来保护重要文件,如果你无法移动或删除
/kernel,你可以运行: 
# chflags noschg /kernel

如果你想保护 /kernel 避免人为疏服破坏它,请运行: 
# chflags schg /kernel


Kernel 可以开机?ps 或是 w 发生错误
如果你更新 kernel 源程序 (如从 2.2.8-RELEASE 升级到 3.2-CURRENT),你必须一并
更新 (或重新编译) 一些重要的文件,如 ps(1)、vmstat(8)或是libkvm。

--

        笨笨的憨头
                # whois [email protected]

※ 来源:.网易 BBS bbs.netease.com.[FROM: 202.96.159.228]

[关闭][返回]