自訂 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。