.
6 October 1995.
這個(gè)略大的章節(jié)會(huì)討論如何自訂你的 FreeBSD kernel。
這個(gè)章節(jié)適合初學(xué)者以及經(jīng)驗(yàn)豐富的管理者。
5.1. 為何要自訂 kernel ?
5.2. 建立以及安裝一個(gè)自訂的 kernel
5.3. kernel 設(shè)定檔
5.3.1. 一定要有的關(guān)鍵字
5.3.2. 一般的參數(shù)
5.3.3. 檔案系統(tǒng)的參數(shù)
5.3.4. 基本控制卡以及介面卡
5.3.5. SCSI 裝置支援
5.3.6. Console,滑鼠,及 X Server 支援
5.3.7. Serial 跟 Parallel Ports
5.3.8. 網(wǎng)路
5.3.9. 音效卡
5.3.10. 虛擬裝置 (Pseudo-devices)
5.3.11. 搖桿、PC 喇叭及其他雜七雜八的
5.4. 建立 device nodes
5.5. 發(fā)生問(wèn)題的解決方法
_________________________________________________________________
5.1. 為何要自訂 kernel ?
建立一個(gè)自訂的 kernel 是每個(gè) UNIX 系統(tǒng)管理者所必須學(xué)習(xí)的重要課題。
這個(gè)過(guò)程雖然耗時(shí),但是將會(huì)對(duì)你的 FreeBSD 系統(tǒng)帶來(lái)許多好處。 一個(gè)自訂的
kernel,只會(huì)包含支援你硬體的
驅(qū)動(dòng)程式, 而一個(gè) GENERIC kernel
卻包含大多數(shù)的硬體驅(qū)動(dòng)程式以便在各種機(jī)器上執(zhí)行。 自訂的 kernel
將包含下列優(yōu)點(diǎn):
* 開(kāi)機(jī)時(shí)只需要花較少的時(shí)間,因?yàn)?nbsp;kernel 不需花額外的時(shí)間去偵測(cè)
你沒(méi)有的硬體是否存在。
* 自訂的 kernel 通常占較少的記憶體,這是很重要的。 因?yàn)?nbsp;kernel
本身是一個(gè)常駐在記憶體中的程式,那些沒(méi)有用到的 程式碼 (如 GENERIC
kernel) 將會(huì)占去你其他程式執(zhí)行時(shí)的記憶體空間。
因此,在一個(gè)記憶體較小的機(jī)器上,建立一個(gè)自訂的 kernel
將是相當(dāng)重要的。
* 最後,有你可以調(diào)整許多的 kernel 參數(shù)來(lái)符合你的需求, 以及奶J其他
(如音效卡的驅(qū)動(dòng)程式) ,這些是 GENERIC kernel 所沒(méi)有的。
_________________________________________________________________
5.2. 建立以及安裝一個(gè)自訂的 kernel
首先,我們先瀏覽一下編譯 kernel 的目錄。 所有的 kernel
原始程式都是放在 /usr/src/sys 以下的 (而通常我們會(huì)將 /sys 連結(jié) (link)
到 /usr/src/sys)。 Kernel 原始程式有許多不同的目錄,比方說(shuō)
/sys/i386/conf, 你將會(huì)把你的 kernel 設(shè)定檔放在此目錄下; 還有例如
/sys/compile, 你將會(huì)在此編譯你的 kernel。
注意: 如果你的系統(tǒng)中 沒(méi)有 /usr/src/sys, 表示你尚未安裝 kernel
原始程式,請(qǐng)參照系統(tǒng)安裝過(guò)程來(lái)安裝 kernel 原始程式。
接下來(lái),進(jìn)入 /sys/i386/conf 并且拷貝 GENERIC 檔
成為你想要的檔名。例如:
# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL
傳統(tǒng)上這個(gè)檔名都是用大寫(xiě)字母,如果你有許多的 FreeBSD 機(jī)器, 用大寫(xiě)的
hostname 來(lái)命名是區(qū)分不同機(jī)器設(shè)定的好方法。
注意: 你必須以 root 的身份執(zhí)行所有的命令,否則你會(huì)得到 "permission
denied" 的錯(cuò)誤。
現(xiàn)在,以你最習(xí)慣的編輯器編輯 MYKERNEL (如果你不知道用什麼好,
你可以試試 vi,雖然要解釋如何使用它太過(guò)雜, 但是至少大部份的 書(shū)
都會(huì)提到它。 你必須修改或新增此檔案中的設(shè)定以符合你系統(tǒng)的需求。
如果你曾經(jīng)在 SunOS 或是其他的 BSD 系統(tǒng)上建立過(guò) kernel,
那麼你將會(huì)對(duì)這個(gè) kernel 設(shè)定檔的內(nèi)容十分熟悉。
如果你較熟悉其他的作業(yè)系統(tǒng) (如 DOS),你可能會(huì)看不懂 kernel
設(shè)定檔,麻煩你仔細(xì)閱讀 kernel 設(shè)定檔 。
注意: 如果你是從較舊版本的 FreeBSD 升級(jí)上來(lái)的, 你可能必須一更新
config(8)。如果你是從 FreeBSD 原始程式升級(jí)的, 你可以在
/usr/src/usr.sbin/config 中找到 config 的原始程式。
當(dāng)你完成建立或修改 kernel 設(shè)定檔時(shí),執(zhí)行以下命令來(lái)編譯你的 kernel:
# /usr/sbin/config MYKERNEL
# cd /compile/MYKERNEL
# make depend
# make
# make install
:make depend; make; make install 可用 make depend all install 來(lái)替代
新編譯好的 kernel 將會(huì)被安裝到根目錄去 (名為 /kernel), 舊的 kernel
將會(huì)被更名為 /kernel.old。 現(xiàn)在,關(guān)閉 (shutdown) 你的系統(tǒng)并重新開(kāi)機(jī)
(reboot)。 如果重新開(kāi)機(jī)後出了什麼問(wèn)題,請(qǐng)閱讀本文最後的
發(fā)生問(wèn)題的解決方法 。 請(qǐng)記得閱讀 以免你的 kernel 無(wú)法開(kāi)機(jī) 。
注意: 如果你增s的硬體 (如音效卡), 你必須建立一些 device nodes
到你的 /dev 下。
_________________________________________________________________
5.3. kernel 設(shè)定檔
這個(gè)檔案的內(nèi)容相當(dāng)?shù)暮?jiǎn)單。每一行都包含了一個(gè)關(guān)鍵字以及它的參數(shù)。
任何以 # 開(kāi)頭的行都被視為解而忽略。 接下來(lái)會(huì)介紹 GENERIC
(一般設(shè)定檔) 中所含有的關(guān)鍵字。 另一個(gè)設(shè)定檔 LINT
中包含絕大多數(shù)的詳細(xì)關(guān)鍵字,LINT 中并有詳細(xì)說(shuō)明,
如果你有任何的疑問(wèn)可以參考 LINT。
傳統(tǒng)上 kernel 設(shè)定檔中的關(guān)鍵字會(huì)以 -D 的方式由 CFLAGS
傳遞給編譯器,但是這樣做所有的檔案都有可能被影響。
現(xiàn)在我們有了新的方法。config 這個(gè)程式會(huì)將那些關(guān)鍵字分門(mén)別類的放到
opt_foo.h,這樣只有相關(guān)的原始程式才會(huì)參考到這些設(shè)定檔。
5.3.1. 一定要有的關(guān)鍵字
5.3.2. 一般的參數(shù)
5.3.3. 檔案系統(tǒng)的參數(shù)
5.3.4. 基本控制卡以及介面卡
5.3.5. SCSI 裝置支援
5.3.6. Console,滑鼠,及 X Server 支援
5.3.7. Serial 跟 Parallel Ports
5.3.8. 網(wǎng)路
5.3.9. 音效卡
5.3.10. 虛擬裝置 (Pseudo-devices)
5.3.11. 搖桿、PC 喇叭及其他雜七雜八的
_________________________________________________________________
5.3.1. 一定要有的關(guān)鍵字
以下是你的 kernel 設(shè)定檔中一定要有的關(guān)鍵字。
machine ``i386''
第一個(gè)關(guān)鍵字是 machine,因?yàn)?nbsp;FreeBSD 現(xiàn)在只能在 386 以上的 PC
執(zhí)行,理所當(dāng)然參數(shù)是 i386。
注意: 任何包含數(shù)字的關(guān)鍵字都必須用引號(hào)匡起來(lái) (如 "i386"), 否則
config 可能會(huì)誤以為你的意思是數(shù)字 386 (三百八十六)。
cpu ``cpu_type''
第二個(gè)關(guān)鍵字是 cpu, 這些是指你的 kernel 即將支援的 CPU 種類。
它的參數(shù) cpu_type 有:
+ I386_CPU
+ I486_CPU
+ I586_CPU
+ I686_CPU
設(shè)定檔中可以有一行以上的 cpu "cpu_type" 以支援各種的 CPU, 就像
GENERIC 檔案一樣。如果你的硬體是固定的,只要包含你用的 CPU
種類就好了。 如果你使用 Intel Pentium,那你只要有 cpu
"I586_CPU" 就好了。
ident machine_name
接下來(lái)是 ident, 這是用來(lái)區(qū)別不同 kernel 用的。 你可以使用
GENERIC 這個(gè)字或是其他你喜歡的字 (如 MYKERNEL)。
你可以在開(kāi)機(jī)的時(shí)候看到這個(gè)字。 你可以替試驗(yàn)性的 kernel
取不同的名字藉以區(qū)別其它的 kernel。 要注意的是,這個(gè)字將會(huì)以
CFLAGS 的方式傳給 C 編譯器, 請(qǐng)勿使用到特殊的關(guān)鍵字如
DEBUG,以免發(fā)生不可預(yù)期的事。 如果你不知道要用那個(gè)字,你可以用
GENERIC 這個(gè)字。
maxusers number
這個(gè)數(shù)字將會(huì)決定你的 kernel 中一些資料結(jié)構(gòu)的大小。
例如你的系統(tǒng)中可以同時(shí)載入的程序 (process) 數(shù)目等於 20 + 16 *
maxusers。 對(duì)於一個(gè)使用者的環(huán)境來(lái)說(shuō),設(shè)定 maxusers = 4
大概可以符合一般需求。 然而,如果你得到 "proc table full"
的錯(cuò)誤訊息, 你必須增?maxuser 的值。如果你想執(zhí)行
X-Windows,你可能需要 maxuser = 16A更大的值是必須的。
注意: 這個(gè)數(shù)字并 不是 代表你的系統(tǒng)
可以同時(shí)上線的人數(shù),它只是決定你的 kernel 中一些資料結(jié)構(gòu)的大小。
真正影響上線人數(shù)的是 pseudo-device pty 16 。
config kernel_name root on root_device
這行指定 kernel 的名稱及位置。傳統(tǒng)上來(lái)說(shuō),kernel 的命名為
vmunix, 但是 FreeBSD 稱它為 kernel。你一定要用 kernel 當(dāng)作
kernel_name,因?yàn)樵S多程式都會(huì)去參考 /kernel 這個(gè)檔案。
這行的第二個(gè)參數(shù) root_device 指定你的 root partition 跟 kernel
放在哪顆硬碟上。 一般來(lái)說(shuō),用 SCSI 硬碟的系統(tǒng)使用 sd0,用 IDE
硬碟的使用 wd0。
_________________________________________________________________
5.3.2. 一般的參數(shù)
這些參數(shù)提供檔案系統(tǒng)及其它的功能支援。
options MATH_EMULATE
這個(gè)參數(shù)讓 kernel 用軟體的方式模擬浮點(diǎn)運(yùn)算,如果你的 CPU
不含浮點(diǎn)運(yùn)算器 (或沒(méi)有 387),你就必須打開(kāi)此參數(shù)。
注意: FreeBSD 所提供的一般浮點(diǎn)模擬器并沒(méi)有十分準(zhǔn)確,
如果你沒(méi)有浮點(diǎn)運(yùn)算器卻又需要最好的準(zhǔn)確度,你可以是用
GPL_MATH_EMULATE 來(lái)使用較優(yōu)秀的 GNU 浮點(diǎn)模擬。 因?yàn)?nbsp;GNU
版權(quán)的關(guān),因此不以它來(lái)當(dāng)作內(nèi)定的模擬器。
options ``COMPAT_43''
提供 4.3BSD
的相容模式,有些程式需要這個(gè)參數(shù),所以請(qǐng)一定要打開(kāi)。
options BOUNCE_BUFFERS
ISA 以及以 ISA 相容模式運(yùn)作的 EISA 介面卡只能對(duì) 16MB
以下的記憶體做 DMA(Direct Memory
Access)。這個(gè)參數(shù)用緩區(qū)的方式使得這些介面卡 可以 DMA 存取
16MB 以上的記憶體。 通常使用 ISA SCSI 卡又有超過(guò) 16MB
的人才需要此參數(shù), 打開(kāi)此參數(shù)會(huì)使得系統(tǒng)稍微慢一點(diǎn)。
options UCONSOLE
允許使用者?ampcirc;取 console,對(duì) X Windows 是很有用的。
舉例來(lái)說(shuō),你可以用 xterm -C來(lái)?ampcirc;取傳到 console 上的 talk
、write 以及 system log 的訊息。
options SYSVSHM
這個(gè)參數(shù)提供 System V 共享記憶體 (shared memory) 的支援。
最常使用 SYSVSHM 的是 X Windows 的 XSHM 功能 (如使用 xanim,
Linux DOOM 等),因?yàn)樗梢蕴岣邎?zhí)行速度。如果你使用 X Windows
或是電子告欄 (BBS),你一定要打開(kāi)此參數(shù)。
options SYSVSEM
提供 System V semaphores 的支援,雖然不常用到,但是它只占一點(diǎn)點(diǎn)
kernel 的空間。
options SYSVMSG
提供 System V messages 的支援,雖然不常用到,但是它只占一點(diǎn)點(diǎn)
kernel 的空間。
注意: ipcs(1) 這個(gè)命令會(huì)列出正在使用以上三種 SYSV 的功能 的程序
(process)。
_________________________________________________________________
5.3.3. 檔案系統(tǒng)的參數(shù)
這些參數(shù)提供各種檔案系統(tǒng)的支援,你一定要包含一種以上的檔案系統(tǒng)
以便開(kāi)機(jī)所需。 如果你是從硬碟開(kāi)機(jī),你必須包含 FFS; 如果你用 diskless
開(kāi)機(jī) (網(wǎng)路開(kāi)機(jī)),你必須包含 NFS。
此外,你還可以將常用到的檔案系統(tǒng)包含進(jìn)去 (如 MSDOS)。
但是你可以將這些非開(kāi)機(jī)必備的檔案系統(tǒng)拿掉,F(xiàn)reeBSD 會(huì)利用動(dòng)態(tài)載入模組
(Loadable Kernel Module) 在你用到檔案系統(tǒng)時(shí),自動(dòng)將檔案系統(tǒng)模組從 /lkm
載入使用。
options FFS
最基本的檔案系統(tǒng)支援,如果你是從硬碟開(kāi)機(jī)的,你一定需要它。
options NFS
網(wǎng)路檔案系統(tǒng)(Network Filesystem?ampcirc;,除非你想要經(jīng)由網(wǎng)路存取
(mount)其他工作站的檔案,否則你不需要它。
options MSDOSFS
MS-DOS 檔案系統(tǒng)。除非你每次開(kāi)機(jī)都要使用 MSDOS 檔案系統(tǒng),
不然你可以將他拿掉,系統(tǒng)會(huì)在你使用到 MSDOS 檔案系統(tǒng)時(shí), 自動(dòng)用
LKM 將 MSDOS 檔案系統(tǒng)支援載入。 除此之外,你也可以使用
mtools來(lái)存取 DOS 的軟碟, 這并不需要有 MSDOS 檔案系統(tǒng)的支援。
options ``CD9660''
ISO 9660 是 CD-ROM 的檔案系統(tǒng),如果你只是偶爾用到 CD-ROM,
你可以將它拿掉,系統(tǒng)會(huì)在使用到 CD-ROM 時(shí)自動(dòng)以 LKM 載入。
此外,用 CD-ROM 聽(tīng) Audio CD 不需要 CD9660 的支援。
options PROCFS
Process 檔案系統(tǒng)。這是一個(gè)對(duì)映記憶體中執(zhí)行程序的虛擬檔案系統(tǒng),
許多系統(tǒng)工具如 ps 需要 PROCFS。
options MFS
記憶體映對(duì)檔案系統(tǒng) (Memory-mapped Filesystem)。
這基本上是一個(gè)為了達(dá)到快速暫存用的 RAM disk, 當(dāng)你有許多 swap
空間的時(shí)候是很有用的。 一個(gè)掛上 (mount) MFS 的好地方是 /tmp,
因?yàn)樵S多程式會(huì)利用 /tmp 建立暫時(shí)檔案。 以下是將 MFS 掛上 /tmp
的方法: 在 /etc/fstab 中奶J以下這行并重新開(kāi)機(jī)或鍵入 mount
/tmp。
/dev/wd1s2b /tmp mfs rw 0 0
注意: 將 /dev/wd1s2b 替換成你的 swap partition, 你的 swap partition
在 /etc/fstab 中看起來(lái)是這樣的:
/dev/wd1s2b none swap sw 0 0
注意: 再來(lái),MFS 無(wú)法以 LKM 載入, 一定要將它連結(jié)在 kernel 中。
options QUOTA
奶J quota 的支援,可以藉以限制使用者能用的硬碟空間。 請(qǐng)參閱
quota(1) 的說(shuō)明 (man quota)。
_________________________________________________________________
5.3.4. 基本控制卡以及介面卡
這些章節(jié)討論 FreeBSD 的硬碟、磁帶機(jī)、CD-ROM 的支援。 對(duì)於 SCSI 卡 跟
網(wǎng)路卡 我們將在另一章節(jié)討論。
controller isa0
所有的 PC 都應(yīng)該奶J ISA 的支援。如果你的系統(tǒng)是 IBM PS/2 (Micro
Channel Architecture),很抱歉現(xiàn)在 FreeBSD 并不支援。
controller pci0
奶J PCI (含 PCI Plug) 的支援。
controller fdc0
軟碟控制卡: fd0 是 ``A:'' 磁碟,fd1 是 ``B:'' 磁碟。 ft0
是接在軟碟控制卡上的 QIC-80 磁帶機(jī)。
注意: QIC-80 磁帶機(jī)需要 ft(8) 程式的支援。
controller wdc0
這是主要 (primary) IDE 控制卡的支援。 wd0 跟 wd1 是第一臺(tái)
(primary) 跟第二臺(tái) (slave) 硬碟。 wdc1 是次要 (secondary) IDE
控制卡, 提供第三臺(tái)及第四臺(tái)硬碟 (或者是 IDE ATAPI CD-ROM)
的支援。
controller wcd0
提供 IDE ATAPI CD-ROM 的支援,需要 wdc0 或 wdc1
的支援。此外,你還需要 options ATAPI, ATAPI_STATIC 的參數(shù)。
device npx0 at isa? port ``IO_NPX'' irq 13 vector npxintr
npx0 是 FreeBSD 浮點(diǎn)運(yùn)算的呼叫介面,不管你有沒(méi)有
浮點(diǎn)運(yùn)算器,這個(gè)參數(shù)都是 必要 的。
device wt0 at isa? port 0x300 bio irq 5 drq 1 vector wtintr
Wangtek 跟 Archive QIC-02/QIC-36 磁帶機(jī)的支援。
專屬介面 CD-ROM 的支援
以下這些是所謂的 專屬介面 CD-ROM。
他們使用專屬的控制卡或是音效卡,他們 不是 IDE 或 SCSI 的
CD-ROM。他們大多數(shù)是單倍速或雙倍速的老機(jī)種。
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 裝置支援
這個(gè)章節(jié)討論許多種 FreeBSD 支援的 SCSI 控制卡及周邊裝置。
SCSI 控制卡
以下這幾行提供 SCSI 控制卡的支援,只需要奶J你所需要的:
controller bt0 at isa? port ``IO_BT0'' bio irq ? vector btintr
大多數(shù)的 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''
這個(gè)參數(shù)使得 kernel 在開(kāi)機(jī)時(shí)會(huì)先等待 15 秒, 再偵測(cè) SCSI
周邊裝置,有些速度慢的周邊 (如 CD-ROM) 需要較長(zhǎng)的初始時(shí)間。
controller scbus0
如果你有任何的 SCSI 裝置,你就需要這個(gè)參數(shù)。
device sd0
支援 SCSI 硬碟。
device st0
支援 SCSI 磁帶機(jī)。
device cd0
支援 SCSI CD-ROM。
請(qǐng)注意這個(gè) 0 并不是說(shuō)只支援一臺(tái)或是 SCSI-ID 0,
無(wú)論有多少裝置都被支援的。
如果你想要指定 SCSI ID 或是 LUN,請(qǐng)參閱 LINT 中相關(guān)的說(shuō)明。
_________________________________________________________________
5.3.6. Console,滑鼠,及 X Server 支援
你一定要在以下兩種顯示驅(qū)動(dòng)程式中選一種。 大多數(shù)的程式經(jīng)由終端函式庫(kù)
(如 termcap)控制顯示, 不管你選哪一種都應(yīng)該能執(zhí)行。
device sc0 at isa? port ``IO_KBD' tty irq 1 vector scintr
sc0 是內(nèi)定的顯示驅(qū)動(dòng)程式,它是模擬 SCO console 的。
使用的時(shí)候,將你的環(huán)境變數(shù) TERM 設(shè)定成 "scoansi" 或 "cons25"。
device vt0 at isa? port ``IO_KBD'' tty irq 1 vector pcrint
這是 VT200 相容的顯示驅(qū)動(dòng)程式,通常是用來(lái)給那些不能用 sc0
的機(jī)器用的。使用的時(shí)候?qū)⒛愕沫h(huán)境變數(shù)設(shè)成 "vt100" 或 "vt200"。
options ``PCVT_FREEBSD=210''
設(shè)定 vt0 程式在 FreeBSD 2.1.0 以上的系統(tǒng)執(zhí)行。
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 上),你并不需要這項(xiàng)參數(shù)。
device psm0 at isa? port ``IO_KBD'' conflicts tty irq 12 vector
psmintr
使用 PS/2 mouse.
_________________________________________________________________
5.3.7. Serial 跟 Parallel Ports
幾乎所有的機(jī)器都有這東西,如 印表機(jī) 或是 Modem 撥接 等等。
device sio0 at isa? port ``IO_COM1'' tty irq 4 vector siointr
sio0 到 sio3 是四個(gè) seiral ports (即 COM1 到 COM4)。 如果你的
COM4 有內(nèi)接 Modem,而 COM2 有接 serial 裝置, 你必須將 Modem 的
IRQ 改成 2 (IRQ 2 就是 IRQ 9)。 如果你有 multiport serial
卡,請(qǐng)閱讀 sio(4)的資料。 有些顯示卡 (如某些 S3 的卡) 使用
0x*2e8 的 IO Address, 而有些便宜的 serial 卡沒(méi)有完全支援
16-bit IO Address, 這些會(huì)互相突而使得 COM4 失效。 每個(gè)
serial port 都需要有一個(gè)獨(dú)立的 IRQ (除了 Multiport 卡),
所以內(nèi)定給 COM3 跟 COM4 的 IRQ 是不能使用的。
device lpt0 at isa? port? tty irq 7 vector lptintr
lpt0 到 lpt2 是三個(gè)印表機(jī)的 port,
大多數(shù)人只有一臺(tái)印表機(jī),你可以將沒(méi)有用到的移除。
_________________________________________________________________
5.3.8. 網(wǎng)路
FreeBSD,跟一般 UNIX 一樣,非常重視網(wǎng)路。
因此,就算你沒(méi)有網(wǎng)路卡,也請(qǐng)注意那些撥接服務(wù)支援。
options INET
網(wǎng)路的支援。就算你不需要網(wǎng)路,你還是需要此參數(shù),
許多程式至少需要 loopback 網(wǎng)路 (即,連接自己的電腦),
所以這是必要的。
Ethernet 網(wǎng)路卡
以下是網(wǎng)路卡的支援,如果你沒(méi)有網(wǎng)路卡,你可以跳過(guò)。
device de0
Digital Equipment DC21040 PCI Ethernet 網(wǎng)路卡
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 網(wǎng)路卡
device fea0 at isa? net irq ? vector feaintr
DEC DEFEA EISA FDDI 網(wǎng)路卡
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 網(wǎng)路卡
device zp0 at isa? port 0x300 net irq 10 iomem 0xd8000 vector
zpintr
3Com PCMCIA Etherlink III
注意: 你必須更改某些網(wǎng)路卡 (如 NE2000) 的 port 或 IRQ,因?yàn)檫@些卡的
port/IRQ 并沒(méi)有一定的標(biāo)準(zhǔn)。
pseudo-device loop
loop 是 TCP/IP 的通用 loopback 裝置。 如果你 telnet 或 ftp
localhost,他們將會(huì)經(jīng)由 loopback 連接。這是必須的。
pseudo-device ether
當(dāng)你有網(wǎng)路卡的時(shí)候你才需要 ether。
pseudo-device sl number
sl 提供 SLIP (Serial Line Internet Protocol)
的支援。SLIP一經(jīng)幾乎被 PPP 所取代,因?yàn)?nbsp;PPP 功能較強(qiáng)。其參數(shù)
number 代表同時(shí) SLIP 連接數(shù)目的個(gè)數(shù)。 關(guān)於 SLIP
的更多資料,請(qǐng)參閱 SLIP Client 或 SLIP Server 。
pseudo-device ppp number
ppp 提供 kernel-mode PPP (Point-to-Point Protocol)
的支援。另外還有一種 user-mode PPP (tun)
提供連線時(shí)更多的彈性,以及自動(dòng)連接的功能。 如果你依然想用
kernel-mode PPP,請(qǐng)閱讀 kernel-mode PPP 。 如同 sl 一樣,其參數(shù)
number 代表同時(shí)連接 PPP 的數(shù)目。
pseudo-device tun number
tun 提供 user-mode PPP 的支援。 這個(gè)模式的 PPP
相當(dāng)容易設(shè)定,而且連線速度快。
而且他還包含更多的新功能,如欲連線時(shí)自動(dòng)撥號(hào)連線,
停滯一段時(shí)間後自動(dòng)斷線。其參數(shù) number 代表同時(shí)連接 PPP 的數(shù)目。
請(qǐng)閱讀 user-mode PPP 以獲得更多的資訊。
pseudo-device bpfilter number
Berkeley 封包過(guò)濾器 (packet filter)。
提供網(wǎng)路監(jiān)聽(tīng)的功能,這些網(wǎng)路上的資料可經(jīng)由 tcpdump(1)
處理顯示,以增進(jìn)網(wǎng)路安全的目的。 其參數(shù) number
代表同時(shí)提供網(wǎng)路介面監(jiān)聽(tīng)數(shù)目的多少。
除非你想要使用網(wǎng)路監(jiān)聽(tīng)的功能,否則你不需此功能。
有少數(shù)網(wǎng)路卡不支援此功能。
_________________________________________________________________
5.3.9. 音效卡
內(nèi)附的 GENERIC kernel 并不包含音效卡的支援, 你必須參考 LINT
這個(gè)設(shè)定檔來(lái)奶J音效卡的支援 (只有 LINT 尼t(yī)所有音效卡的設(shè)定)。
controller snd0
標(biāo)準(zhǔn)音效呼叫介面,所有的音效卡 (除了 pca 外) 都需要此參數(shù)。
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), 你必須將設(shè)定中的
irq 7 改成 irq 5, 并且移除 conflicts,此外,你還需要奶Joptions
``SBC_IRQ=5'' 的設(shè)定。
此外,你還需要奶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" 的設(shè)定。
device sbmidi0 at isa? port 0x330
SoundBlaster 16 MIDI 介面。如果你有 SB16,
你一定要奶J此參數(shù),?ampthinsp;則你的 kernel 將無(wú)法完成編譯。
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,你需要此參數(shù)。 此外,你可以用 playmidi 來(lái)播放
MIDI 音效 (在 ports 收集里)。
device mpu0 at isa? port 0x330 irq 6 drq 0
獨(dú)立的 Roland MPU-401 音效卡。
device uart0 at isa? port 0x330 irq 5 vector ``m6850intr''
獨(dú)立的 6850 UART MIDI 介面。
device pca0 at isa? port ``IO_TIMER1'' tty
利用 PC 喇叭模擬數(shù)位音效,此音效的效果很差, 而且要花不少 CPU
時(shí)間,你應(yīng)該要知道這點(diǎn)。 在你沒(méi)有音效卡時(shí)才考慮此功能。
注意: 你還可以閱讀 /usr/src/sys/i386/isa/sound/sound.doc。
此外,你還必須建立相關(guān)的 device nodes 給音效卡使用。
_________________________________________________________________
5.3.10. 虛擬裝置 (Pseudo-devices)
虛擬裝置提供一些特殊的支援,但它們并不是真正的硬體介面。 有一部份的
網(wǎng)路相關(guān)的 虛擬裝置并不在下列說(shuō)明中。
pseudo-device gzip
gzip 讓你可以執(zhí)行被 gzip 壓縮的 FreeBSD 程式,由於 /stand
中的程式都是被壓縮過(guò)的, 因此奶J此功能是個(gè)好主意。
pseudo-device log
log 提供系統(tǒng)記錄 (system log) 的功能, 這是必須的。
pseudo-device pty number
pty 代表 ``虛擬終端機(jī) (pseudo-terminal)'' 或上線人數(shù)的多少。
許多程式如 telnet、rlogin、xtermx 和 emacs
等都會(huì)使用它。GENERIC kernel 內(nèi)定只有 16 的 ttys,
你可能會(huì)想要將它提高到 32 或 64 以上。
pseudo-device snp number
監(jiān)看裝置 (Snoop device)。提供你監(jiān)看其他 tty 的資訊 (使用
watch(8) 命令),這牽涉到系統(tǒng)安全以及
使用者隱私權(quán)的問(wèn)題,是可有可無(wú)的功能。
pseudo-device vn
Vnode 驅(qū)動(dòng)程式。允許將一個(gè)檔案利用 vnconfig(8) 當(dāng)成一個(gè)
partition 來(lái)使用。通常拿來(lái)建立 floppy disk image 或充當(dāng) swap
裝置 (如跟 MS Windows 共享 swap file),是可有可無(wú)的功能。
_________________________________________________________________
5.3.11. 搖桿、PC 喇叭及其他雜七雜八的
本章及討論 FreeBSD 支援的其他雜七雜八的裝置, 這些都是 GENERIC kernel
所沒(méi)有的功能。 你可能會(huì)想?yún)⒄?nbsp;LINT 設(shè)定檔的內(nèi)容。
device joy0 at isa? port ``IO_GAME''
PC 搖桿的支援。
pseudo-device speaker
支援 IBM BASIC 格式的 PC 喇叭音效。 有些有趣的程式 (如
/usr/sbin/splrtest、/usr/games/piano) 會(huì)使用到它。
有關(guān) PC 喇叭的的數(shù)位音效請(qǐng)參閱 pca0 。
_________________________________________________________________
5.4. 建立 device nodes
幾乎所有 kernel 支援的裝置,都有一個(gè)在 /dev 下的 ``node''
來(lái)相對(duì)應(yīng)。這些 nodes 看起來(lái)像是一般的檔案,
但是實(shí)際上應(yīng)用程式可以透過(guò)這些 nodes 來(lái)存取 kernel 的資料。 你可以用
shell script /dev/MAKEDEV 來(lái)幫助你建立 nodes。
雖然在安裝過(guò)程中已經(jīng)幫你建立一些必備的 nodes,
是你一定會(huì)想再新增你所需要的
nodes,尤其是增s功能或安裝新硬體的時(shí)候。 假A想新增一臺(tái) IDE
CD-ROM,你必須在 kernel 設(shè)定檔中奶J相關(guān)的釧w,如G
controller wcd0
這表示你必須看看在 /dev 下有沒(méi)有 wcd0 的 nodes。 比方說(shuō)是
wcd0c、rwcd0c 等等。 假設(shè)沒(méi)有這些 nodes,你必須建立它們:
# cd /dev; sh MAKEDEV wcd0
當(dāng)這個(gè) script 執(zhí)行完畢時(shí),你應(yīng)該會(huì)看到 wcd0c 或 rwcd0c 等 nodes。
又例如新增音效卡的 nodes:
# cd /dev; sh MAKEDEV snd0
這樣將會(huì)建立音效卡所需的 nodes。
_________________________________________________________________
5.5. 發(fā)生問(wèn)題的解決方法
再建立自訂 kernel 時(shí),有四種問(wèn)題可能發(fā)生:
Config 發(fā)生錯(cuò)誤
如果 config 抱怨這個(gè)錯(cuò)誤時(shí),你的 kernel 設(shè)定檔可能有錯(cuò)誤,
config 會(huì)指出哪些行錯(cuò)了,請(qǐng)重新檢查那些行。 比方說(shuō)你看到:
config: line 17: syntax error
表示你的 kernel 設(shè)定檔的 17 行有錯(cuò)誤,請(qǐng)用編輯器修正。
Make 失敗
如果執(zhí)行 make 時(shí)發(fā)生錯(cuò)誤,有可能是你的 kernel 設(shè)定檔有錯(cuò)誤,
但是 config 程式并沒(méi)有檢查出來(lái),請(qǐng)?jiān)贆z查 kernel
設(shè)定檔是否有錯(cuò)誤, 或是缺少該有的參數(shù)。 如果在編譯過(guò)程中發(fā)生
"compiler internal error" 或 "signal 11" 等等,
可能你的硬體設(shè)備不是很穩(wěn)定。
Kernel 無(wú)法開(kāi)機(jī)
如果你的新 kernel 無(wú)法開(kāi)機(jī),或是無(wú)法偵測(cè)到你新左熊w體裝置,
你可以在開(kāi)機(jī)時(shí),鍵入其他 kernel 的名稱 (如 boot: /kernel.old),
如果連其他 kernel 都無(wú)法開(kāi)機(jī),你可以試試 kernel.GENERIC。
在用舊的 kernel 開(kāi)機(jī)後,檢查你的 kernel 釧w檔是否有誤,
修改後再重新編譯一個(gè)新的 kernel。 你可以參考 /var/log/messages
中的開(kāi)機(jī)記錄,或是執(zhí)行 dmesg(8)。
注意: 在 FreeBSD 中有另一種 file flag 來(lái)保護(hù)重要檔案,
如果你無(wú)法移動(dòng)或刪除 /kernel,你可以執(zhí)行:
# chflags noschg /kernel
如果你想保護(hù) /kernel 避免人為疏失破壞它,請(qǐng)執(zhí)行:
# chflags schg /kernel
Kernel 可以開(kāi)機(jī),但 ps 或是 w 發(fā)生錯(cuò)誤
如果你更新 kernel 原始程式 (如從 2.1.0-RELEASE 升級(jí)到
2.2-CURRENT),你必須一更新 (或重新編譯) 一些重要的檔案, 如
ps(1)、vmstat(8)或是libkvm。