第9章 配置FreeBSD的內核
9.1概要
內核是FreeBSD操作系統的核心。它用來管理內存,執行安全控制,網絡,磁盤訪問等等。雖然現在FreeBSD可以更多地進行動態配置,但有時你還是需要重新配置和編譯你的內核。
讀完這章,你將瞭解到:
爲什麼需要建立一個定製的內核。
如何寫一個內核配置文件,或修改已存在的配置文件。
如何使用內核配置文件創建和建立一個新的內核。
如何安裝一個新內核。
如何在/dev中創建設備文件的記錄。
如何解決一些常見的問題。
9.2爲什麼要定製一個的內核?
通常,FreeBSD有一個叫做“monolithic”(高度集成)的內核。這意味着內核是一個巨大的程序,支持很多的設備,如果你想要修改內核的行爲,必須重新編譯一個新的內核,然後用新內核啓動系統。
今天,FreeBSD已經將內核的功能分成了很多的模塊,可以動態地加載和卸載內核模塊。這樣可以快速地調整內核以支持新加入的設備(如在手提計算機中的PCMCIA卡),或加入最初內核編譯時沒有加入的功能。通俗地來講,這種功能叫做KLD。
雖然這樣,作一些靜態內核的配置也是必需的。有時,由於有些功能與內核的聯繫非常緊密,所以它不能被動態地加載。另外,有些人不太願意爲實現某些功能而寫一個動態加載的內核模塊,編譯一個靜態內核可能更簡單。
定製內核基本上是每一個UNIX用戶必須經歷的一關。這樣做將會對你的FreeBSD系統帶來很多好處。不像GENERIC內核,它需要支持很廣泛的硬件設備,而定製的內核將只支持你機器的硬件設備,這樣會帶來很多好處:
快速啓動。既然系統內核只檢測你機器上的硬件,那它所花費的啓動時間將大大減少。
較少的內存使用。一個定製的內核會比GENERIC內核使用較少的內存。這一點非常重要,因爲內核在處理時必須經常使用內存。所以,一個定製的內核對於內存較少的機器來說是非常有用的。
額外的硬件支持。一個定製的內核允許你加入像聲卡之類設備的支持,而這恰恰是GENERIC內核所做不到的。
9.3 建立並安裝一個定製的內核
首先,讓我們先來看一下建立內核的目錄。所有提到的目錄都在/usr/src/sys中,也可以通過/sys訪問。有許多子目錄充當了內核的不同部分。但最重要的是/arch/conf,你可以在這兒配置內核,然後進行編譯。這裏的arch也可能是i386,alpha,pc98。在一個特殊的架構目錄中,所有的東西都是爲這個架構服務的,其他部分的代碼是與所有平臺共享的。注意一下這個目錄的邏輯結構,所有支持的硬件驅動程序、文件系統、參數選項,都放在各自的目錄下。另外,所有放在i386目錄下的是隻跟PC硬件有關的,而i386目錄之外的其他目錄,則是FreeBSD可能移植到的平臺會共享到的部分。
注意:如果你的系統沒有這個/usr/src/sys目錄,那麼內核源代碼就沒有被安裝。最快速的安裝方式是以root登陸,然後運行/stand/sysinstall,選擇configure,接着是Distributions,下來是src,最後sys。
接下來,切換到arch/conf目錄,拷貝GENERIC配置文件,並給這個文件起一個容易辨認的名稱,它就是你的內核名稱。例如:
# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL
通常,這個名稱是大寫的,如果正維護着多臺不同硬件的FreeBSD機器,以你機器的域名來命名是非常好的主意。我們把它命名爲MYKERNEL就是這個原因。
注意:你必須以root帳戶登陸再執行下面的命令,否則你會沒有權限,而導致錯誤。
現在,用你喜歡的文本編輯器編輯MYKERNEL。如果你是初學者,那唯一能用的編輯器可能就是vi,它由於太複雜而不在這兒介紹了,但在參考書目中有許多書會介紹到它。然而,FreeBSD中最容易的編輯器是ee,如果你是一個工程師,它是一個非常好的選擇。你可以很自由地改變註釋行來反映你的配置情況,或你在GERNERIC中已經做的變化。如果你在Sunos或其他BSD系統下定製過內核,那這個文件中的絕大部分將對你非常熟悉。如果你使用的是諸如DOS這樣的系統,那GENERIC配置文件看起來就非常困難,所以在下面的配置文件章節將慢慢地、仔細地進行介紹。
注意:要經常檢查文件/usr/src/UPDATING,在你執行任何修改之前,記得要用最新發布的源代碼來同步你的源代碼樹。在這個文件中所有重要的升級都要記下來。/sur/src/UPDATING總是符合你的FreeBSD源代碼版本,而且總是比手冊所說的信息更加精確。
你現在必須編譯內核的源代碼。你可能需要執行兩種方法,這依賴於你如何重新編譯內核,和你正使用的FreeBSD的版本。
如果你只安裝內核源代碼,使用方法1。
如果你運行的是FreeBSD 4.0以前的版本的話,你不需要升級到FreeBSD 4.0或更高版本,只要使用方法1。
如果你在沒有升級源代碼的情況下編譯一個新內核(也許你只想爲內核添加一個新的選項,如IPFIREWALL),可以使用任何一種方法。
如果你正在重新建立的內核作爲“make world”進程的一部分,需要使用方法2。
方法1.用“傳統方法”建立一個內核
1.運行config來產生內核源代碼。
# /usr/sbin/config MYKERNEL
2.進入建立內核的目錄。
# cd ../../compile/ MYKERNEL
3.編譯內核。
# make depend
# make
4.安裝新的內核。
# make install
方法2.用“新的方法”來建立內核
1.進入/usr/src目錄。
# cd /usr/src
2.編譯內核。
# make buildkernel KERNCONF= MYKERNEL
3.安裝新內核。
# make installkernel KERNCONF=MYKERNEL
注意:在FreeBSD 4.2和更老的版本中,你必須用KERNEL=替換KERNCONF=。2001年2月2日以後生成的4.2-STABLE就可以認出KERNCONF=了。
如果你還沒有升級源代碼樹,那你應當按順序執行:
config,make depend,make,make install
新的內核將會被拷貝到/kernel目錄下,而舊的內核將會被移到/kernel.old。現在,關閉系統,然後重新用內核啓動系統。如果發生錯誤,在這章結尾會有一些故障的解決辦法。如果新內核不能啓動,請務必讀一下有關如何恢復的章節。
注意:如果你已經加入了新的設備(如聲卡),你可能在使用之前,要先在你的/dev目錄下加入這些設備節點。
9.4配置文件
內核設置的格式是很簡單的,每一行包含了一個關鍵詞(keyword)與一個或多個參數,而大多數的設置都只包含一個參數。#號之後的文字都是註釋,會被程序忽略掉。下面的每個小節,將依次介紹每個列在GENERIC中的參數,雖然各相關主題(如網絡)的關鍵詞會放在同一小節,但是這些關鍵詞可能位於GENERIC的很多地方。詳細地列出各個選項(option),而LINT列出了絕大部分的選項(option),比起在同一目錄下的GENERIC,有更詳細的解釋。如果你不能確定某一行設定的目的是否必要,請先看看LINT。
目前內核在處理各個選項上正轉到一個比較好的模式。一般地,設置文件中的各個選項都轉換到內核程序的Makefile中,屬於CFLAGS的一個-D參數。時間一長,就造成了一個選項處理機制的問題,沒有人知道在哪個文件中參考使用了那個選項。
在新的機制中,使用#ifdef來參考選項的程序代碼是存放在由執行config時所產生的opt_foo.h。由config所產生的有效的選項清單存儲在兩個文件裏:獨立於系統架構的選項放在/sys/conf/options,與系統架構有關的選項則放在/sys/arch/conf/options.arch,其中arch的一個例子便是i386。
數字的引號方式(Quoting numbers):目前所有FreeBSD版本,包括3.x,其內核設置文件中如果有任何屬於文字形式的數字(如i386),必須用雙引號引起來,不然執行config時會出錯。
如果數字是表示數目、個數,如maxuser 64這個設置,則不要加雙引號。目前FreeBSD 4.x版本已經去掉上述限制,不論是哪種形式的數字都不需要加雙引號。本章的例子,在文字形式的數字前後仍加了雙引號(“”),如果你使用FreeBSD 4.x版本,請自動去除雙引號。
下面是一個帶有很多額外註釋的GENERIC內核配置文件的例子。這個例子與/usr/src/sys/i386/conf/GENERIC非常相似。有關內核配置的最詳細的選項,請參看/usr/src/sys/i386/conf/LINT。
#
# GENERIC -- Generic kernel configuration file for FreeBSD/i386
#
# For more information on this file, please read the handbook section on
# Kernel Configuration Files:
#
# http://www.FreeBSD.org/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.ORG/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
# $FreeBSD: src/sys/i386/conf/GENERIC,v 1.246 2000/03/09 16:32:55 jlemon Exp $
下面這個選項在每個內核中都要有:
machine i386
這是機器的架構。它可能是i386,alpha或pc98。
cpu I386_CPU
cpu I486_CPU
cpu I586_CPU
cpu I686_CPU
上面的選項指出了在你的系統中所用的CPU類型。你可以使用多個CPU類型(例如,你不能確定使用的是I586_CPU還是I686_CPU),然而,對於一個定製的內核,最好是隻指定你所擁有的CPU類型。如果你不能確定CPU類型,可以使用dmesg命令來看看你的啓動信息。
Alpha結構的機器使用下面的選項:
cpu EV4
cpu EV5
如果你正使用一臺Alpha機器,應當使用上面的CPU類型。
ident GENERIC
這是一個內核的標識符。你應該自己命名一個容易辨認的名稱,以有別於GENERIC的名稱——GENERIC。放在ident後的參數,將在你用這個內核啓動時顯示在屏幕上。如果你同時設置了幾個內核,採用不同的名稱是個不錯的主意。(例如,你想定製一個實驗性質的內核)。
maxusers 32
這個設置的大小值定義了重要的系統表(system tables)。這個數值粗略地假設你的機器同時會有多少用戶。然而,在一般情況下,你最少要設置4個以上,特別是你要執行X Window或是編譯程序。原因是maxusers值決定了系統同時可有多少個進程(process),其算法是20 + 16 * maxusers。如果你設置maxusers值是1,則你的系統只能同時存在36個進程,包括18個(或更多)系統啓動要佔去的進程。如果你執行了X Window,則又要用掉15個以上。甚至閱讀一個man page也會使用九個進程來過濾、解壓縮、然後顯示文件。設置maxusers=4,則系統可以同時有84個進程,對任何人應該都是足夠的。當你執行程序時,得到像是“proc table full”這樣的錯誤信息,或者你要建一個同時會有很多人來訪問的網站(如ftp.FreeBSD.org)時,你就要增加這個設置的值,然後重新編譯內核。
注意: maxusers這個參數並不限制可以登陸你係統的用戶數目。它只是系統中用戶可以最多執行的程序個數。有一個關鍵詞的值則真的限制了可以同時遠程連接(remote logins)的人數:pseudo-device pty 16。
# Floating point support - do not disable.
device npx0 at nexus? port IO_NPX irq 13
npx0是連接FreeBSD中浮點運算處理器的一個接口。不論你用硬件的浮點運算處理器還是使用軟件仿真,都需要這個設置。這個設置並不是可有可無的。
# Pseudo devices - the number indicates how many units to allocate.
pseudo-device loop # Network loopback
loop是一個通用的TCP/IP接口。如果你用telnet或ftp連到localhost(等同於127.0.0.1),則該連接會通過這個虛擬設備連回來。這是一定要有的設置,請不要去掉。
#makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols
options MATH_EMULATE #Support for x87 emulation
如果你的計算機沒有浮點運算處理器(386或486SX),可以加入這行,使得內核提供軟件仿真的浮點運算處理器。如果你用的是486DX或是386SX、486SX(還加裝了387、487芯片)或更高的(Pentium、Pentium II等)則不需要這行設置。
注意: 這個仿真的浮點運算處理器並不是很精確。如果你沒有浮點運算器,還需要較高的精度,可以改用GPL_MATH_EMULATE參數,這將會使用GNU的浮點運算仿真器。至於爲什麼這個仿真器不是系統默認值,是因爲GNU使用許可的關係。
options INET #InterNETworking
提供網絡支持。就算你不打算連上網絡,還是要留着這個選項。對於絕大部分的程序,這個選項是一定要有的。
options INET6 #IPv6 communications protocols
這個啓用IPv6通信協議。
options FFS #Berkeley Fast Filesystem
options FFS_ROOT #FFS usable as root device [keep this!]
最基本的硬盤文件系統。如果你要從硬盤啓動,就留着。
options MFS #Memory Filesystem
options MD_ROOT #MD is a potential root device
內存映射(Memory-mapped)文件系統。提供RAM disk,以供需要快速訪問的資料或是暫存資料用。如果你分了很大的swap空間,使用這個選項可以給你不少好處。把/tmp掛到MFS分區是一個相當好的想法,因爲不少程序都會在此暫存資料。要把/tmp掛到MFS RAM disk,可以修改/etc/fstab,加入以下一行:
/dev/ad1s2b /tmp mfs rw 0 0
現在重新啓動系統,或是鍵入mount /tmp命令:
options NFS #Network Filesystem
options NFS_ROOT #NFS usable as root device, NFS required
網絡文件系統(NFS),除非你要從網絡上的其他機器加載目錄,不然可以用 # 號註釋掉這行設置。
options MSDOSFS #MSDOS Filesystem
MS-DOS文件系統。除非你要在啓動時掛上一個DOS格式的硬盤,不然你可以放心地把這行註釋掉。如前所述,在你第一次掛上一個DOS分區時,內核將會自動加載模塊來支持它。此外,mtools是個相當不錯的軟件(可在ports裏面找到),可以讓你在訪問DOS磁盤時,不需要掛上或卸載軟盤(而且也不需要MSDOSFS的支持)。
options CD9660 #ISO 9660 Filesystem
options CD9660_ROOT #CD-ROM usable as root, CD9660 required
CD-ROM使用的ISO 9660文件系統。如果你沒有光驅,或是很少用光驅,可以註釋掉這一行(內核會在第一次加載時動態加載模塊以支持它)。音樂CD則不會用到這個文件系統。
options PROCFS #Process filesystem
進程文件系統(Process filesystem)。這是一個虛擬的文件系統,掛在/proc下,允許一些程序,像ps來讀取資料,提供你正在執行的進程的信息。
options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!]
使系統兼容4.3BSD。不要去掉這一行,不然有些程序將無法正常運行。
options SCSI_DELAY=15000 #Delay (in ms) before probing SCSI
這行設置告訴內核等待15秒鐘,以供SCSI控制器掃描你計算機上的SCSI設備。如果你只有IDE硬盤,你可以不理會這個設置,不然你可能會想要降低這個值,也許會降到五秒,以增加啓動的速度。如果你發現降低後,FreeBSD無法正確辨認你的SCSI設備,那麼你應該提高這個值,延長等待時間。
options UCONSOLE #Allow users to grab the console
允許用戶找到控制檯(console)信息,對X Window很有用。舉例來說,你可以輸入xterm -C來打開一個控制檯xterm,這個窗口將顯示任何write、talk等命令的信息,以及你發出去的信息。當然,kernel產生的信息也會在這裏出現。
options USERCONFIG #boot -c editor
這個選項允許你從啓動菜單啓動配置編輯器。
options VISUAL_USERCONFIG #visual boot -c editor
這個選項允許你從啓動菜單啓動虛擬配置編輯器。
options KTRACE #ktrace support
這個選項啓用內核進程跟蹤,在調試時很有用。
options SYSVSHM #SYSV-style shared memory
提供System V共享內存(SHM)的支持,最常用到SHM的應該是X Window的XSHM延伸,不少繪圖相關程序(像影片播放程序XAnim與Linux DOOM遊戲)會自動使用SHM來提供額外的速度。如果你要使用X Window,你最好加入這個選項。
options SYSVSEM #SYSV-style semaphores
支持System V semaphores,不常用到,只在kernel中佔用幾百個字節的空間。
options SYSVMSG #SYSV-style message queues
支持System V messages,一樣的,只佔用kernel幾百字節的空間。
注意: ipcs命令可以顯示出任何使用到上述三個System V功能的進程。
options P1003_1B #Posix P1003_1B real-time extensions
options _KPOSIX_PRIORITY_SCHEDULING
在1993 POSIX中添加的實時擴展。在ports collection中某些應用程序會用到這些(如Star Office)。
options ICMP_BANDLIM #Rate limit bad replies
這個選項啓用ICMP的帶寬限制的錯誤響應。使用這個選項可以幫助你保護你的機器免受拒絕式服務攻擊。
# To make an SMP kernel, the next two are needed
#options SMP # Symmetric MultiProcessor Kernel
#options APIC_IO # Symmetric (APIC) I/O
上面兩個選項都支持SMP。
device isa
所有FreeBSD支持的PC都需要這行設置。如果你使用IBM PS/2 (微信道架構)計算機,則你無法在該機器上執行FreeBSD。
device eisa
如果你的主機板上有EISA總線,加入這個設置。使用這個選項可以自動掃描並設置所有連接在EISA總線上的設備。
device pci
如果你的主板有PCI總線,就加入這個選項。使用這個選項可以自動掃描PCI卡,並在PCI到ISA之間建立通路。
# Floppy drives
device fdc0 at isa? port IO_FD1 irq 6 drq 2
device fd0 at fdc0 drive 0
device fd1 at fdc0 drive 1
軟盤控制器:fd0是A: 盤,fd1是B: 盤。
device ata
這個驅動器支持所有ATA和ATAPI設備。你只要在內核中加入device ata選項,就可以讓內核支持現代計算機上的所有PCI ATA/ATAPI設備。
device atadisk # ATA disk drives
這個是ATAPI磁盤驅動器所必須的。
device atapicd # ATAPI CDROM drives
這個是ATAPI CDROM驅動器所必須的。
device atapifd # ATAPI floppy drives
這個是ATAPI 軟盤驅動器所必須的。
device atapist # ATAPI tape drives
這個是ATAPI 磁帶機驅動器所必須的。
options ATA_STATIC_ID #Static device numbering
這個可以靜態分配控制器的編號,也可以動態分配設備的編號。
# ATA and ATAPI devices
device ata0 at isa? port IO_WD1 irq 14
device ata1 at isa? port IO_WD2 irq 15
上面的選項用在比較老的,非PCI的系統中。
# SCSI Controllers
device ahb # EISA AHA1742 family
device ahc # AHA2940 and onboard AIC7xxx devices
device amd # AMD 53C974 (Teckram DC-390(T))
device dpt # DPT Smartcache - See LINT for options!
device isp # Qlogic family
device ncr # NCR/Symbios Logic
device sym # NCR/Symbios Logic (newer chipsets)
device adv0 at isa?
device adw
device bt0 at isa?
device aha0 at isa?
device aic0 at isa?
SCSI控制器。可以註釋掉你係統中沒有的設備。如果你只有IDE設備,你可以把這些一起刪掉。
# SCSI peripherals
device scbus # SCSI bus (required)
device da # Direct Access (disks)
device sa # Sequential Access (tape etc)
device cd # CD
device pass # Passthrough device (direct SCSI
access)
SCSI外圍設備。也可以像上面一樣操作。
# RAID controllers
device ida # Compaq Smart RAID
device amr # AMI MegaRAID
device mlx # Mylex DAC960 family
支持RAID控制器。如果你沒有這些,可以把它們註釋掉或是刪掉。
# atkbdc0 controls both the keyboard and the PS/2 mouse
device atkbdc0 at isa? port IO_KBD
鍵盤控制器atkbdc提供AT鍵盤輸入以及PS/2指針設備的I/O服務。鍵盤驅動程序atkbd與PS/2鼠標驅動程序psm需要這個控制器,所以不要刪除它。
device atkbd0 at atkbdc? irq 1
atkbd驅動程序,與atkbdc控制器一起使用,提供連接到AT鍵盤控制器的AT 84鍵盤與AT加強型鍵盤的訪問服務。
device psm0 at atkbdc? irq 12
如果你的鼠標連接到PS/2鼠標端口,就使用這個設備驅動程序。
device vga0 at isa?
顯卡驅動。
# splash screen/screen saver
pseudo-device splash
在啓動時的啓動畫面!屏幕保護也需要這個。
# syscons is the default console driver, resembling an SCO console
device sc0 at isa?
sc0是默認的控制檯驅動程序,絕大部分全屏幕程序都通過termcap這類terminal database library來訪問控制檯,因此不論你用這個驅動程序或是VT220兼容控制檯驅動程序vt0,這中間並沒有太大差別。如果使用sc0,且你在登陸系統後,執行全屏幕程序時遇到問題,請將你的TERM設置成“scoansi”。
# Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
#device vt0 at isa?
#options XSERVER # support for X server on a vt console
#options FAT_CURSOR # start with block cursor
# If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
#options PCVT_SCANSET=2 # IBM keyboards are non-std
這是一個兼容VT220的控制檯驅動程序,並向下兼容VT100/102。在部分與sc0相沖突的筆記本計算機上,這個驅動程序運作良好。當然,當你登陸系統時,記得設置TERM參數爲vt100或是vt220。當連接到網絡上許多計算機時,這個驅動程序也常是很有用的,這是因爲許多的計算機上的termcap或是terminfo並沒有sc0的資料——而vt100的資料幾乎所有的平臺上都支持。
# Power management support (see LINT for more options)
device apm0 at nexus? disable flags 0x20 # Advanced Power Management
高級電源管理支持。使用在膝上型計算機上。
# PCCARD (PCMCIA) support
device card
device pcic0 at isa? irq 10 port 0x3e0 iomem 0xd0000
device pcic1 at isa? irq 11 port 0x3e2 iomem 0xd4000 disable
PCMCIA支持。如果你使用膝上型計算機,你需要這個。
# Serial (COM) ports
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
sio0到sio3可看作是MS-DOS系統中的COM1到COM4。如果你使用內置式的數據機,且佔用COM4,而你的系統又有COM2,則你必須修改調制解調器的IRQ爲2(IRQ 2跟IRQ 9是一樣的),這樣你才能正常使用調制解調器。部分顯示卡(特別是使用S3芯片的卡),用到0x*2e8這個I/O地址,而一些便宜的串行卡,沒辦法正確譯碼16位的I/O尋址空間,因此兩張卡會衝突,導致COM4無法正常使用。每個串行口都要有一個唯一的IRQ,所以COM3與COM4默認的IRQ將無法使用。
# Parallel port
device ppc0 at isa? irq 7
ISA-bus並行接口
device ppbus # Parallel port bus (required)
提供並行總線的支持。
device lpt # Printer
提供並口打印機的支持。
注意: 要使用並口打印機,就必須同時加入上面三行設置。
device plip # TCP/IP over parallel
這是針對並行網絡接口的驅動器。
device ppi # Parallel port interface device
普通用途的I/O (“geek port”) + IEEE1284 I/O。
#device vpo # Requires scbus and da
這是針對Iomega Zip驅動器的。它要求scbus和da的支持。最好的執行效果是工作在EPP 1.9模式。
# PCI Ethernet NICs.
device de # DEC/Intel DC21x4x (``Tulip'')
device fxp # Intel EtherExpress PRO/100B (82557, 82558)
device tx # SMC 9432TX (83c170 ``EPIC'')
device vx # 3Com 3c590, 3c595 (``Vortex'')
device wx # Intel Gigabit Ethernet Card (``Wiseman'')
多種PCI網卡驅動器。註釋或刪除你係統中沒有的設備。
# PCI Ethernet NICs that use the common MII bus controller code.
device miibus # MII bus support
MII總線支持對於一些PCI 10/100 Ethernet NIC來說是必需的。
device dc # DEC/Intel 21143 and various workalikes
device rl # RealTek 8129/8139
device sf # Adaptec AIC-6915 (``Starfire'')
device sis # Silicon Integrated Systems SiS 900/SiS 7016
device ste # Sundance ST201 (D-Link DFE-550TX)
device tl # Texas Instruments ThunderLAN
device vr # VIA Rhine, Rhine II
device wb # Winbond W89C840F
device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')
使用MII總線控制器代碼的驅動器。
# ISA Ethernet NICs.
device ed0 at isa? port 0x280 irq 10 iomem 0xd8000
device ex
device ep
# WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really
# exists only as a PCMCIA device, so there is no ISA attachment needed
# and resources will always be dynamically assigned by the pccard code.
device wi
# Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will
# work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP
# mode (the factory default). If you set the switches on your ISA
# card for a manually chosen I/O address and IRQ, you must specify
# those parameters here.
device an
# The probe order of these is presently determined by i386/isa/isa_compat.c.
device ie0 at isa? port 0x300 irq 10 iomem 0xd0000
device fe0 at isa? port 0x300
device le0 at isa? port 0x300 irq 5 iomem 0xd0000
device lnc0 at isa? port 0x280 irq 10 drq 0
device cs0 at isa? port 0x300
device sn0 at isa? port 0x300 irq 10
# requires PCCARD (PCMCIA) support to be activated
#device xe0 at isa?
ISA以太網驅動器。看看/usr/src/sys/i386/conf/LINT瞭解一下哪個卡被哪個驅動器支持。
pseudo-device ether # Ethernet support
如果你有一個以太網卡,ether是必需的。它包含了通用的以太網協議代碼。
pseudo-device sl 1 # Kernel SLIP
Sl是針對SLIP支持的。這已經完全被PPP所代替,它是早期使用的協議。
pseudo-device ppp 1 # Kernel PPP
ppp提供內核模式(kernel-mode)的PPP撥號支持。另外有一個tun則是用戶模式 (user-mode)的PPP支持,tun較有彈性且功能較多。如果你要使用這個PPP驅動程序,請參考內核模式PPP這一章節。如同sl,number設置系統最多同時能支持幾個PPP連接。
pseudo-device tun # Packet tunnel.
tun是用戶模式的PPP軟件。這個程序設置相當方便,且速度很快。它有一些特殊的功能,像是在需要連接時自動撥號(dial-on-demand)。tun後面接的數字設置系統同時能支持幾個PPP連接。參看這本書的PPP章節(第16.2)以瞭解更多信息。
pseudo-device pty # Pseudo-ttys (telnet etc)
pty是虛擬的終端機,或仿真的登陸端口(login port)。ctelnet或rlogin連接,xterm以及其他應用程序如emacs會用到pty。number設置系統的pty個數。系統默認值是16,如果你要提高同時連接數,可以適當增加這個數值,最高可達256個。
pseudo-device md # Memory “disks”
Memory disk pseudo-devices.
pseudo-device gif 4 # IPv6 and IPv4 tunneling
這個執行IPv6與 IPv4,IPv4與IPv6,IPv4與IPv4, IPv6與IPv6之間的轉換.
pseudo-device faith 1 # IPv6-to-IPv4 relaying (translation)
這個僞設備能檢測到接收到的數據包,然後把它們發送給IPv4/IPv6翻譯程序。
# The `bpf' pseudo-device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
pseudo-device bpf # Berkeley packet filter
這是Berkeley的封包過濾器。這個僞設備允許網絡接口被放在複雜的模式上,在網絡上捕獲每個封包。這些封包能被磁盤捕獲或被tcpdump程序檢查。
注意:bpf pseudo-device也可以被dhclient用來獲得默認路由的IP地址。如果你使用DHCP,不要註釋掉這行。
# USB support
#device uhci # UHCI PCI->USB interface
#device ohci # OHCI PCI->USB interface
#device usb # USB Bus (required)
#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
# USB Ethernet, requires mii
#device aue # ADMtek USB ethernet
#device cue # CATC USB ethernet
#device kue # Kawasaki LSI USB ethernet
支持多種USB設備。更多有關FreeBSD支持的設備請參考/usr/src/sys/i386/conf/LINT。
9.5建立設備的節點
幾乎內核中的每個設備在/dev目錄下都有對應的節點。這些節點看上去是些規則文件,但事實上是程序在使用對應的設備時,與內核聯繫的進入點。當你一開始安裝操作系統時,那些可執行的外殼腳本/dev/MAKEDEV就創建了幾乎所有支持的設備。然而,它並不是建立所有設備,所以當你加入對新設備的支持時,注意確信對應的節點在這個目錄下。如果不是,就加入它們。這兒是一個簡單的例子:
確信在內核中加入了IDE CD-ROM的支持。可以這樣加入:
device acd0
這意味着你應當在/dev目錄下找一些以acd0爲起點的入口,通常後面有一個字母,像c或以r開頭表示這是一個raw設備。那些文件不在那兒,必須改變/dev目錄然後鍵入:
# sh MAKEDEV acd0
當這些腳本完成後,你要找一下在/dev目錄下有acd0c和racd0c等幾個入口,表示程序已經正確執行。
以下是加入聲卡節點的例子:
# sh MAKEDEV snd0
注意:當創建完諸如聲卡這樣的設備節點時,如果其他人有權訪問你的機器,可能有必要在/etc/fbtab文件中添加這些節點來保護系統安全。可看一下fstab的聯機手冊以瞭解更多信息。
依上述的簡單程序,建立任何不在GENERIC裏的硬件設備節點。
注意: 所有的SCSI控制器都使用一樣的設備節點,所以你無須重新建立節點。另外,網卡與SLIP/PPP虛擬設備並沒有任何設備節點,所以你不必擔心怎麼建立節點。
9.6如果出現問題怎麼辦?
在定製一個內核時,可能會出現四種問題。它們是:
配置失敗
當你在內核描述中看到config命令失敗,可能在某個地方發生了一個小錯誤。幸運的是,config會顯示出錯的那一行的行號,你可以用vi編輯器做修改。例如,如果你看到:config:line 17:syntax error
可以在vi中用命令模式輸入17G來跳到17行。比較GENERIC內核或其他參考資料,以確定你打對了關鍵字。
編譯錯誤
如果編譯失敗,通常會在你的內核描述中提示一個錯誤,但config並沒有找出錯誤。另外,查看一下你的配置信息,如果你仍然無法解決這個問題,可以把你的內核配置信息發郵件到FreeBSD普通問題郵件列表<[email protected]>,它將很快地被解決。
內核無法啓動
如果你的新內核無法啓動,或無法識別你的硬件,不要擔心!幸運的是,BSD有一個解決複雜內核錯誤的很好機制。從FreeBSD的啓動loader中,選擇一個你要啓動的內核。當配置一個內核時,記得在手頭保留一個能正常啓動的內核是個好主意。
在用一個好的內核啓動後,你可以檢查一下配置文件,再設法重新建立一個內核。一個有幫助的文件是/var/log/messages文件,它記載了每個成功啓動的所有內核信息。同樣,dmesg命令會列出當前啓動中的內核信息。
注意:你在編譯內核時,確信保留着一個GENERIC或以其他名字命名的內核。你不能僅依靠kernel.old,因爲當你安裝一個新內核時,kernel.old會被上一次安裝的內核所覆蓋。所以,儘快將當前正常工作的內核移到不能正常工作的內核,可以用ps命令查一下。解開編譯安裝內核文件的正確命令是:
#chflags noschg /kernel
另外,如果你要設定內核或其他文件的訪問限制,以至它不能被移動或修改,可以用下 面的命令:
#chflags schg /kernel
內核工作,但ps根本就不工作!
如果你在系統中安裝了一個不同版本的內核,例如,在3.x系統中安裝了4.x內核,許多系統內建的命令像ps和vmstat會根本不工作。你必須重新編譯libkvm庫以及這些程序。千萬不要隨意從其他系統拷貝不同版本的內核來使用。