FreeBSD
內核是FreeBSD系統的核心。它用來進行內存管理,安全控制,網絡,磁盤訪問等等。而有時你需要重新配置和編譯你的內核。讀完這一章,你將知道以下內容:
* 為什麼需要建構一個定制的內核.
* 怎麼樣寫一個內核配置文件,或修改一現有的配置文件.
* 怎麼樣使用內核配置文件創造並構建一新內核.
* 怎麼樣安裝一個新內核.
* 在需要的情況下,怎麼樣在/dev 中創建設備文件.
* 出問題後,如何解決所出現的問題.
----------------------------------------------------------------------
9.2 為什麼要構建一個定制的內核?以前,freebsd的內核是一個宏內核。這意味著,內核是一個支持固定數量設備的大型程序。如果你想改變內核的行為,就必須從新編譯內核,並用新內核從新啟動系統。.
如今,freebsd內核正快速向一模塊化方向遷移;也就是說核由模塊組成,內核功能由模塊實現,我們能根據需要隨時加載或卸載功能模塊。這使得內核能迅速識別新硬件(如筆記本電腦上的PCMCIA卡),能容易的在內核中加入最初編譯的內核所不具備的功能。這就是所說的模塊化內核。通俗的講,就是KLDs。.
盡管如此,仍然有必要做一些靜態的內核編譯。因為在某些情況下,功能性相互交叉,無法實現動態加載;也有可能就是還沒有人寫出實現這種功能的內核可動態加載的模塊.
構建一個定制的內核幾乎是每一個UNIX 用戶都該有的重要能力之一。這樣做雖然會消耗一定的時間,但它將會對你的FreeBSD 系統帶來很多好處。定制的內核將只包含對你PC的硬件設備的支持,這點不象需支持很廣泛的硬件設備的GENERIC 內核。它會帶來許多好處:* 更短的啟動時間。因為內核只檢測你機器上有的硬件,那麼系統啟動所需的時間將大大減少。
* 較少的內存使用量。一個定制的內核通常會比GENERIC 內核使用更少的內存。這一點很重要,因為內核必須始終駐留實存,占用內存。所以,一個定制的內核對於內存較少的機器來說尤為重要.
* 額外的硬件支持。一個定制的內核允許你為 聲卡等不為GENERIC 內核所支持的設備提供支持.
----------------------------------------------------------------------
9.3 建立並安裝一個定制的內核首先,我們粗略浏覽一下構建內核的目錄。所有提及的目錄都是相對於/usr/src/sys 而言的,它們也可以通 過/sys 訪問。這裡的子目錄代表內核的不同部分。但對我們而言,最重要的是/arch/conf ,在這兒你可以定 制內核的配置,然後進行編譯,它是所譯內核的存放地。這裡的arch 也可能是i386,alpha,或pc98(pc硬件的 一種體系,在日本比較流行) 。在一個特殊的體系結構目錄內的所有代碼是這個體系結構所獨有的;其它部 分的代碼是所有平台共享的。注意一下目錄的邏輯結構,所有支持的設備、文件系統和選項,等都在它們各自 的子目錄下。FreeBSD 5.x及以後的版本已經支持sparc64,還有一些其它平台的支持正在開發中。
注意:如果你的系統沒有/usr/src/sys 目錄,這表明內核源代碼就沒有被安裝。最容易的安裝方式是以root 的身份運行/stand/sysinstall ,然後選擇configure->Distributions->src->sys。要是你不喜歡用sysinstall,但有freebsd的官方安裝盤,那麼你可 以用以下的命令安裝源代碼:
# mount /cdrom# mkdir -p /usr/src/sys# ln -s /usr/src/sys /sys# cat /cdrom/src/ssys.[a-d]* | tar -xzvf -
接著,切換到arch/conf 目錄,拷貝GENERIC 文件,並命名成你所希望的內核的名稱。例如:
# cd /usr/src/sys/i386/conf# cp GENERIC MYKERNEL
通常,這個名稱是大寫的,如果正維護著多台不同硬件的FreeBSD 機器,以你機器的域名來命名是非常好的主意。我們把它命名為MYKERNEL做為例子。
技巧:把內核配置文件保存在/usr/src目錄下不是一個好的習慣。因為如果定制內核出錯的話,只需要刪除/usr/src目錄,然後從新開始。但當你這樣做之後,你會意識到你已經刪除了你的內核定制文件。不要直接編輯GENERIC,因為它可能會在下次同步源碼樹時被覆寫,自然你的內核的更改也就沒啦。
你該把你的配置文件放在別處,然後在i386中建個符號鏈接指向該配置文件;
例如:
# cd /usr/src/sys/i386/conf# mkdir /root/kernels# cp GENERIC /root/kernels/MYKERNEL # ln -s /root/kernels/MYKERNEL
注意:必須要以root身份執行以上還有以下的命令,否則會出現權限不夠的錯誤。
現在,用你喜歡的文本編輯器編輯MYKERNEL 。如果你是初學者,那唯一能用的編輯器可能就是vi,在這兒介紹它的使用就太復雜,不介紹了,但在參考書目中有許多書會介紹到它。然而,FreeBSD 提供了更易使用的編輯器是ee, ee是初學者的上選。你可以很自由地改變注釋行來反映你的配置情況,或和GERNERIC 的不同之處。
如果你定制Sunos 或其它BSD 系統內核的經驗,那麼這個文件中的很多內容你可能非常熟悉。如果你以前使用的是諸如DOS 之類的系統,那GENERIC 配置文件就看起來非常困難,所以在下面的配置文件章節將慢慢地、仔細地進行介紹。
注意: 在執行任何更新之前,在要用最新發布的源代碼來同步你的源代碼樹時,確信始終檢查/usr/src/UPDATING文件。在這個文件中升級freebsd所有重要問題都指出來了。/sur/src/UPDATING 總是適合你FreeBSD 源代碼的版本,因此對於新信息比手冊所說更加准確。
現在該開始編譯內核代碼了。有兩種方法實現內核的編譯,使用哪一種方法依賴於你重建內核的原因以及你的freebsd的版本。
* 如果僅安裝了內核源代碼,那麼時候使用方法1.
* 如果你使用的FreeBSD 是4.0 之前的版本,並且沒有使用make world procedure升級到4。0或以上版本,則使用方法1.
* 如果編譯內核,而沒有升級源代碼(多半是僅僅為增加一個新的特性,如IPFIREWALL),那麼你可以隨便用哪種方法
* 如果你正重建的內核是make world過程的一部分,那麼使用方法2。
方法1:使用傳統方法構建內核
1. 運行config來產生內核代碼。
# /usr/sbin/config MYKERNEL
2. 進入構建目錄。 它在運行上述命令後產生。
# cd ../compile/MYKERNEL
對5。0之前版本的freebsd,使用以下命令:
# 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
注意: 在freebsd4。2及之前版本裡,需要用KERNEL=. 4.2-STABLE代替KERNCONF=;在2001年2月2日之前不能識別KERNCONF=。
如果你還沒有通過任何方法升級你的源代碼樹(沒有運行CVSup, CTM, 沒有使用anoncvs),那你應當按如下順序執行:config,make depend,make,make install
新的內核將會被拷貝到根(/)目錄下,文件名為kernel,而舊的內核將會被重命名為kernel.old 。現在,重新系統以使用新的內核。如果發生錯誤,在這章結尾會有一些故障的解決辦法。一旦你的新內核不能啟動,請務必讀有關如何恢復的章節。
注意:從freebsd5。0起,內核和它們的模塊一起被安裝在 /boot/kernel,舊內核被備份成/boot/kernel.old。 其它和啟動進程相關的文件如loader(8) 及配置也被放在/boot裡。 第三方模塊或 定制的模塊被放在/boot/modules裡, 用戶應該意識到保持模塊和編譯的內核的同步非常重要. 模塊不和編譯的內核同步,可以會引起不穩定或錯誤。
注意:如果加入了任何新的設備(如聲卡),並且你使用的是4.x及之前的版本,你可能需要在使用之前,先在/dev 目錄下加入這些設備節點。具體的做法,可以看本章創建設備節點部分。
----------------------------------------------------------------------
9.4 配置文件內核設置的格式是很簡單的,每一行包含了一個關鍵詞(keyword) 與一個或多個參數, 而大多數的設置都只包含一個參數。#號之後的文字都是注釋,會被程序忽略掉。下面的幾個小節,將依次介紹每個列在GENERIC 中的關鍵詞(keyword),雖然有些相關主題(如網絡)的關鍵詞會放在同一小節,但是這些關鍵詞可能位於GENERIC 的很多地方。詳細的各個選項(option)列表,可以看和GENERIC文件同一目錄下的LINT文件;它列出了絕大部分可能的設備及其選項(options),且有更詳細的注釋。如果你不能確定某一行設定的目的是否必要,請先看LINT。
注意:在5。x及其以後的版本裡,LINT文件將不復存在。在NOTES文件中有和體系結構相關的參數說明。一 些不依賴於特定體系結構的參數可以在/usr/src/sys/conf/NOTES文件中查看。在這裡回顧一下這些參數也許 比較明智。
下面是一個帶有很多額外注釋的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/doc/en_US ... onfig-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 ../../conf/NOTES and NOTES files.# If you are in doubt as to the purpose or necessity of a line, check first# in NOTES.## $FreeBSD: src/sys/i386/conf/GENERIC,v 1.380 2003/03/29 13:36:41 mdodd Exp $
下面這個選項在每個內核中都要有:
machine i386
它指明了機器的硬件體系結構。它必須是i386, pc98, sparc64, alpha, ia64, amd64,和powerpc當中的一 種。
cpu I486_CPUcpu I586_CPUcpu I686_CPU
上面的選項指出了在你的系統中所用的CPU 類型。你可以使用多個CPU 類型(例如, 你不確信你使用的是I586_CPU 還是I686_CPU), 然而,對於一個定制的內核,最好是只指定你所擁有的CPU 類型。如果你不能確定你的CPU 類型,你可以通過/var/run/dmesg.boot文件中的你的啟動信 息來確定。
freebsd對386級別的cpu的支持代碼仍然存在於內核源代碼中,但默認情況下它並未啟用(STABLE 和CURRENT 版都是)。這意味著要在一386機器上安裝freebsd,有以下方式可行:
* 先安裝一個舊版的freebsd,然後從源代碼進行系統重建,具體方法見第9章第3節.
* 通過使用預編譯的/usr/obj,在新機型上編譯userland和內核,而安裝在386機器上。(具體方法21章5節).
* 創建你自己的包含對386cpu支持的FreeBSD安裝光盤這幾種方法中,第一種是最簡單的,但是它需要你的386上有比較大的空閒磁盤空間,而這一點比較難滿足。
The first of these options is probably the easiest of all, but you willneed a lot of disk space on a 386-class machine which may be difficult tofind.
ident GENERIC
ident 是一個內核的標識符。你應該把它改成想給內核取的名字,例如,如果一直是按照以上的說明做的,那 麼該改為MYKERNEL。放在ident 後的參數,將在你用這個內核啟動時顯示在屏幕上。給新內核起個和通常核( 比如你想建實驗性質的kernel)不同的名稱是個不錯的做法。注意:象machine 與cpu 這兩個設置。如果你的內核名稱包含數字,請記得用雙引號把它括起來。內核名稱將會使用-D 參數傳給編譯器,所以不要用像DEBUG 或是其它可能干擾編譯器的機器、CPU 名稱,如vax 。
maxusers n
maxusers值的大小定義了重要的系統表的大小。這個數值大概地和你機器的同時使用者的數量相等。
從freebsd4。5起,如果它被設置為0,那麼系統會自動進行調整。在5。x中,如果這個值沒有指定,那麼它默 認是0。如果你使用的4。5之前的版本,或者你想自己定義它的大小,那麼它起碼要設置為4 個以上,特別是 你要執行X Window 或是編譯程序。因為maxusers 值決定了系統最大可同時運行的進程數(processes),算 法是20 + 16 * maxusers 。如果你設置maxusers 值是1,則你的系統只能同時存在36 個進程 ,包括18 個(或更多)系統啟動要占去的進程數; 如果你使用了X Window ,則又要用至少15 個進程。甚至閱讀一個man page 也會使用九個processes 來進行過濾、解壓縮、然後顯示文件。設置maxusers=64 ,則系統可以同時有1044 個processes ,這樣差不多對所有應用都足夠的了 。當你執行程序時,出現“proc table full ”這樣的錯誤信息,或者你要建一個同時會有很多人來訪問的網站(如ftp.freebsd.org) 時,你就要增加這個設置的值,然後重新編譯內核。
注意: maxuser 這個參數並不限制可以登陸你系統的用戶的數目。它只是設置一些表的大小來合理的評估系統 可能的最大用戶數,以及它們每個人所能有的最多的進程數。有一個關鍵詞(pseudo-device)的值則真的限 制了可以同時遠程連接(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
這是一個通用的TCP/IP 接口。如果你用telnet 或ftp 連到localhost( 等同於127.0.0.1) ,則該連接會通過這個虛擬設備連回來。這是一個必需的設置。
以下內容或多或少都有選項。它們下面或之後的信息可供參考。
#To statically compile in device wiring instead of /boot/device.hints#hints "GENERIC.hints" #Default places to look for devices.
在freebsd5。x及其更新版本中,文件device.hints用於設置設備驅動程序參數。默認情況下 loader將字系統 啟動時檢查/boot/device.hints文件。如果直接把這些隱含參數內容編譯到內核中,那麼就沒有必要在/boot 中創建一個device.hints。
#makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols
為節約所需空間,通常freebsd內核構建進程並不產生從編譯到鏈接產生目標內核過程中的調試信息。如果你 正測試 -CURRENT 分支的內核或者你想開發屬於自己的freebsd內核,那你就不該注銷掉這行。它使用 -g選 項,使得代碼在被gcc處理時產生調試信息。如果你在使用傳統的方法構建內核,那麼config -g 選項也可實現該功能 (具體情況參考9章3小節).
options MATH_EMULATE #Support for x87 emulation
如果你的計算機沒有浮點運算處理器(386 或486SX) ,這行將使得內核提供軟件仿真的浮點運算處理器。如果 你用的是486DX 或是386SX 、486SX( 還加裝了387 、487芯片)或更高的(Pentium 、Pentium II 等)則不需 要這行設置。
注意: 這個仿真的運算處理器並不是很精確。如果你沒有浮點運算器,但需要較高的精度,你可以改用GPL_MATH_EMULATE 參數,這將會使用GNU 的浮點運算仿真器。因為GNU 使用許可的關 系,這個仿真器不是系統默認值。
在5.x中,運算模擬器默認並不被支持,因為在舊的cpu中,沒有實際浮點運算器的是相當少見的。在許多情 況下,並不被GENERIC 內核支持,除非使用了附加選項。
options INET #InterNETworking
網絡支持。即使你不打算連上網絡,也要留著這個選項。對於大量的程序,需要至少有個loopback網絡(例如 :用pc創建網絡鏈接)。所以這個選項基本上是強制的。
options INET6 #IPv6 communications protocols
這個啟用IPv6 通訊協議
options FFS #Berkeley Fast Filesystemoptions FFS_ROOT #FFS usable as root device [keep this!]
最基本的硬盤文件系統。要從硬盤啟動,就得留著它。
注意: 在FreeBSD 5.X中, FFS_ROOT 已不是必須的了。
options UFS_ACL #Support for access control lists
這個選項目前只在5。x中可以使用,它使內核支持訪問控制。這依賴於使用於使用UFS2 及其附加特性;具體 特性在節 10.13有詳細敘述。默認支持訪問控制列表(ACLs), 如果以前在文件系統上使用了訪問控制列表, 那麼最好不要去除該它,因為去除,很可能出現無法預知的問題。
options UFS_DIRHASH #Improve performance on big directories
這個選項可以在有大量目錄文件時,加快磁盤操作速度,而代價就時使用更大的內存。它對大型服務器,或 交互式工作站比較有用,而如果是個小型的系統,如一個防火牆,則沒必要使用它,因為額外的內存使用換來 的是磁盤速度的一點點提升。
options SOFTUPDATES #Enable FFS Soft Updates support
使內核支持Soft Updates, 以加快磁盤的寫入速度。要真正使用該功能,還得打開分區的相應參數。通過 mount命令的輸出,可以看到磁盤的 soft-updates 是否已經打開。如果沒打開,則可通過tunefs(對現有的 文件系統)或newfs(對新文件系統)命令進行調整以實現對soft-updates的支持。
options MFS #Memory Filesystemoptions 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 命令:
注意: 在5.X中, 使用md-backed UFS 文件系統 替代MFS(配置memory-backed 文件系統的有關資料在 mdconfig 和mdmfs的手冊頁裡,在12章10節也有)。 因此MFS選項在5。x中已經沒有了。
options NFS #Network Filesystemoptions NFS_ROOT #NFS usable as root device, NFS required
網絡文件系統,若不需要通過TCP/IP掛載其它UNIX機器的文件系統,可以用 # 號注釋掉這行設置。
options MSDOSFS #MSDOS Filesystem
MS-DOS 文件系統。除非要在啟動時掛上一個DOS 格式分區,否則你可以放心地把這行注釋掉。如前所述,在 第一次掛上一個DOS 分區時,內核將會自動加載模塊來支持它。此外,mtools 是個相當不錯的軟件(可在 ports 裡面找到), 它支持不用掛入或卸載,就可訪問DOS 軟盤(而且也不需要MSDOSFS 的支持)。
options CD9660 #ISO 9660 Filesystemoptions CD9660_ROOT #CD-ROM usable as root, CD9660 required
CD-ROM 使用的ISO 9660 文件系統。如果你沒有光驅,或是很少用光驅,可以注釋掉這一行(在第一次掛CD-ROM時,內核會動態加載模塊以支持它)。音樂CD 則不需要用到這個文件系統。
options PROCFS #Process filesystem
process file system。這是一個虛擬的文件系統,掛在/proc 下,允許程序(如ps) 獲取有關正在執行的進 程的信息。在5.x中,PROCFS已經不是那麼的重要了,因為很多調試和監視工具已經能在無PROCFS的情況下工 作。 另外,要在5.X-CURRENT下用PROCFS,還必須有PSEUDOFS的支持:
options PSEUDOFS #Pseudo-filesystem framework
在FreeBSD 4.X中,沒有PSEUDOFS。在5。x中,默認將不使用進程文件系統,這一點不象freebsd4.x。
options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!]
使系統兼容4.3BSD 。掉這一行,有些程序將無法正常運行。
options COMPAT_FREEBSD4 #Compatible with FreeBSD4
5.x的i386及Alpha版,需要這個選項來支持一些為舊版系統編譯的調用了舊版接口的軟件。推薦在所有可能 運行舊應用程序的i386和Alpha 系統(僅5.x中)中保留此選項;但在ia64 和Sparc64? 平台裡不需要該選\項。
options SCSI_DELAY=15000 #Delay (in ms) before probing SCSI
這行設置使內核等待15 秒鐘,以供SCSI 控制器掃描你計算機上的SCSI 設備。如果只有IDE 硬盤,則可不理會這個設置,另外,也可降低這個值,比如降到五秒,以加快啟動的速度。如果你發現降低後,FreeBSD 無法正確辨認你的SCSI 設備,那麼你該提高這個值,延長 等待時間。
options UCONSOLE #Allow users to grab the console
允許使用者獲取控制台,對X Window 用戶很有用。舉例來說,你可以輸入xterm -C 來打開一個xterm終端 ,這個窗口將顯示任何write 、talk 等命令的信息,以及其它你收到的信息。當然, kernel 輸出的信息也會在這裡出現。
注意: 在FreeBSD 5.X中, UCONSOLE 已經不使必要選項。
options USERCONFIG #boot -c editor
這個選項允許你從啟動菜單啟動配置編輯器。
options VISUAL_USERCONFIG #visual boot -c editor
這個選項允許你從啟動菜單啟動可視化的配置編輯器。
注意: 從FreeBSD 5.0 開始,USERCONFIG選項和新的device.hints方式沖突。具體內容可以看7章5節。
options KTRACE #ktrace(1) support
這個選項啟用內核進程跟蹤,在調試時很有用。
options SYSVSHM #SYSV-style shared memory
提供System V Shared memory的支持,最常用到它的應該是X Window 的XSHM 擴展,不少繪圖相關程序會自動使用它來提供額外的速度。如果你要使用X Window ,你最好加入這個選項。
options SYSVSEM #SYSV-style semaphores
System V semaphores的支持,一般用不到,但它只在kernel 中占用幾百個字節的空間。
options SYSVMSG #SYSV-style message queues
System V messages的支持,一樣的,只占用kernel 幾百字節的空間。
注意: ipcs 命令可以顯示出所有使用到上述三個System V 功能的processes 。
options P1003_1B #Posix P1003_1B real-time extensionsoptions _KPOSIX_PRIORITY_SCHEDULING
在1993 POSIX 中添加的實時擴展。在ports中有些應用程序會用到它們(比如Star Office )。
注意: 在 FreeBSD 5.X中, 此項功能已經被 _KPOSIX_PRIORITY_SCHEDULING 選項所取代,並且P1003_1B也不 再是必選項了。
options ICMP_BANDLIM #Rate limit bad replies
這個選項啟用基於帶寬限制的ICMP 的錯誤響應。你使用這個選項可以幫助你保護你的機器免受拒絕式服務攻擊。
注意: FreeBSD 5.X, 已經默認支持這種功能,而不需要有ICMP_BANDLIM選項。
# 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 ( 微信道架構,MCA)計算機,FreeBSD提供的支 持就比較有限 。有關對MCA的支持,可以從/usr/src/sys/i386/conf/LINT找到答案。
device eisa
如果你的主機板上有EISA 總線,加入這個設置。使用這個選項可以自動掃描並設置所有連接在EISA 總線上的設備。
device pci
如果你的主板有PCI 總線, 就加入這個選項。使用這個選項可以自動掃描PCI卡,並在PCI 到ISA 之間建立通路。
device agp
提供AGP顯卡支持. 有AGP或AGP GART口的主板需要。
# Floppy drivesdevice fdc0 at isa? port IO_FD1 irq 6 drq 2device fd0 at fdc0 drive 0device fd1 at fdc0 drive 1
軟盤控制器:fd0 是A: 盤,fd1 是B: 盤。
device ata
提供所有ATA 和ATAPI 設備支持。你只要在內核中加入一個ata 選項,就可以讓內核支持現代計算機上的所有 PCI ATA/ATAPI 設備。
device atadisk # ATA disk drives
ATAPI 磁盤驅動器所必須,前提是有device ata項。
device atapicd # ATAPI CDROM drives
ATAPI CDROM 驅動器所必須,前提是有device ata項。
device atapifd # ATAPI floppy drives
ATAPI 軟盤驅動器所必須,前提是有device ata項。
device atapist # ATAPI tape drives
ATAPI 磁帶機驅動器所必須,前提是有device ata項。
options ATA_STATIC_ID #Static device numbering
它使得靜態地分配控制器的編號(比如,舊的驅動器),當然設備的編號也可以動態分配。
# ATA and ATAPI devicesdevice ata0 at isa? port IO_WD1 irq 14device ata1 at isa? port IO_WD2 irq 15
上面的選項用在比較老的,非PCI 的系統中。
# SCSI Controllersdevice ahb # EISA AHA1742 familydevice ahc # AHA2940 and onboard AIC7xxx devicesdevice amd # AMD 53C974 (Teckram DC-390(T))device dpt # DPT Smartcache - See LINT for options!device isp # Qlogic familydevice ncr # NCR/Symbios Logicdevice sym # NCR/Symbios Logic (newer chipsets)
device adv0 at isa?device adwdevice bt0 at isa?device aha0 at isa?device aic0 at isa?
SCSI 控制器。注釋掉你系統中沒有的設備。如果你只有IDE 設備,你可以把這些全部刪掉。
# SCSI peripheralsdevice scbus # SCSI bus (required)device da # Direct Access (disks)device sa # Sequential Access (tape etc)device cd # CDdevice pass # Passthrough device (direct SCSIaccess)
SCSI外圍設備。注釋掉你系統中沒有的設備。如果你只有IDE設備,你可以把這些全部刪掉。
# RAID controllersdevice ida # Compaq Smart RAIDdevice amr # AMI MegaRAIDdevice mlx # Mylex DAC960 family
RAID 控制器支持。如果你沒有,可以把它們注釋掉或是刪掉。
# atkbdc0 controls both the keyboard and the PS/2 mousedevice 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 saverpseudo-device splash
啟動畫面!屏保也需要它。
# syscons is the default console driver, resembling an SCO consoledevice sc0 at isa?
sc0 是默認的控制台驅動,類似於SCO地控制台。絕大部分全屏幕程序都通過termcap這類terminal database library 來訪問console ,因此用這個驅動程序或是VT220 兼容的console 驅動程序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 的console 驅動程序,並向下兼容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) supportdevice carddevice pcic0 at isa? irq 10 port 0x3e0 iomem 0xd0000device pcic1 at isa? irq 11 port 0x3e2 iomem 0xd4000 disable
PCMCIA 支持。只用於筆記本電腦上。
# Serial (COM) portsdevice sio0 at isa? port IO_COM1 flags 0x10 irq 4device sio1 at isa? port IO_COM2 irq 3device sio2 at isa? disable port IO_COM3 irq 5device sio3 at isa? disable port IO_COM4 irq 9
這四個串口,可看作是MS-DOS 系統中的COM1 到COM4 。
注意:如果你的內貓占用COM4,並且串口占用COM2, 則你必須修改調制解調器的IRQ為2(IRQ 2 跟IRQ 9 是 一樣的),這樣你才能在freebsd中正常使用調制解調器。如果你用的時multiport的串口卡,則應該參考sio的 man手冊。部分顯示卡(特別是使用S3 芯片的),用到I/O 地址0x*2e8 ,而一些便宜的串行卡,不能正確譯碼16 位的I/O 尋址空間,因此它們會沖突,導致COM4 無法正常使用。
每個串行口都要有一個唯一的IRQ(除非你用的時支持共享中斷的multiport卡) ,所以COM3 與COM4 默認的 IRQ 無法使用。
# Parallel portdevice ppc0 at isa? irq 7
ISA總線 並行接口
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 網卡來說是必需的,也就是那些使用類似MII傳輸方式操作的 網卡。 加miibus驅動到內核配置中,以實現對普通miibus API的支持及所有的PHY驅動,包括一種不能被特 定驅動明確處理的PHY的通用驅動。
device dc # DEC/Intel 21143 and various workalikesdevice rl # RealTek 8129/8139device sf # Adaptec AIC-6915 (``Starfire'')device sis # Silicon Integrated Systems SiS 900/SiS 7016device ste # Sundance ST201 (D-Link DFE-550TX)device tl # Texas Instruments ThunderLANdevice vr # VIA Rhine, Rhine IIdevice wb # Winbond W89C840Fdevice xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')
驅動,使用MII 總線控制器代碼。
# ISA Ethernet NICs.device ed0 at isa? port 0x280 irq 10 iomem 0xd8000device exdevice 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 0xd0000device fe0 at isa? port 0x300device le0 at isa? port 0x300 irq 5 iomem 0xd0000device lnc0 at isa? port 0x280 irq 10 drq 0device cs0 at isa? port 0x300device 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
僅有以太網卡時才需要。它包含了通用的以太網協議代碼。
pseudo-device sl 1 # Kernel SLIP
Sl 是對SLIP 提供支持的。這已經完全被PPP 所代替,ppp更易於配置,更適合modem-to-modem的連接,功能 也更強大。s1後面的數值設置系統支持多少個SLIP同時連接。pseudo-device ppp 1 # Kernel PPP
使內核支持PPP 撥號連接。另外有一個tun 則是用戶模式的PPP工具,tun 較有彈性且功能較多。如果你要使 用這個PPP 驅動程序,請參考內核模式PPP 這一章節。ppp後面的數字設置系統能支持幾個PPP 同時連接。
pseudo-device tun # Packet tunnel.
用戶模式的PPP 軟件需要。tun 後面接的數字設置系統同時能支持幾個PPP 連接。參看本書用戶模式PPP 以 節以獲得更多信息。
pseudo-device pty # Pseudo-ttys (telnet etc)
pty 是虛擬終端,或仿真的登陸入口 。Ctelnet 或rlogin 連接、xterm 以及其它應用程序如Emacs 會用到pty 。number 設置系統要創建的pty 個數。如果有同時有超過16個xterm窗口或者 是遠程登陸,那麼你可以適當增加這個數值,最高可達256 個。
pseudo-device md # Memory ``disks''
內存磁盤 pseudo.
pseudo-device gif
or
pseudo-device gif 4 # IPv6 and IPv4 tunneling
它執行IPv6 與 IPv4,IPv4 與IPv6, IPv4 與IPv4, IPv6 與IPv6 之間的轉換. 從FreeBSD 4.4開始,設備gif設備使自動繁殖(``auto-cloning'')的,應該使用第一個例子(沒有指定gif 數值的) 。 早期的FreeBSD需要指定數值。
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.4.1 大內存配置 (PAE:物理內存擴展)大內存的機器是特指內存數超過4G(被用戶和內核邏輯地址總和所限)的機器。為解決這個問題,Intel在 Pentium Pro及其之後的CPU中加入了36位物理地址空間尋址能力。
加入了PAE功能的Intel Pentium Pro及其後的cpu允許內存最大可配置到64G。FreeBSD(4。x系列從4。 9RELEASE開始,5.X系列從5.1-RELEASE開始)通過內核配置參數PAE提供這種容量擴展支持。由於年存儲體系 結構的局限性,多於和少於4g沒多少差別; 超過4g的那部分內存只是添加到可用內存池裡。
要加入PAE支持,只要在內核配置文件中加入如下一行即可:
options PAE
注意: FreeBSD 中的PAE支持只對Intel IA-32 處理器有效。另外,FreeBSD中的PAE支持還沒有經過廣泛 的測試, 應該和其它stable版的特性一樣看做是beta級別的。
FreeBSD中的PAE支持有以下一些局限:
* 進程沒辦法訪問超過4g的內存。
* 由於構建模塊和內核的框架(framework)的不同,KLD不能在使用了PAE的內核中使用。
* 不使用bus_dma接口設備驅動,在使用了PAE支持的內核上,可能引起data corruption,並且不被推薦 使用此類驅動。因此,在支持PAE的5。x中,內核將拒絕所有對PAE而言無法識別的驅動。
* 有些系統參數能依據總的可用內存調節系統內存資源的使用。 這些微調不需要依據PAE系統的內存大 小來分配。舉一個kern.maxvnodes sysctl的例子,它控制了內核最大允許的vnodes數。 調整它以及其它類似 參數需要慎重考慮,以設置為一個合理的數值。
* 也許應該增大內核虛擬地址空間或者說是減少所有對內核資源的嚴重消耗,以避免KVM不夠用。內核參 數KVA_PAGES 能用來增加KVA空間的大小.
對於所關心的性能及穩定性的問題,可以查看tuning的man手冊。pae的man手冊有FreeBSD的PAE支持最新信息 。
----------------------------------------------------------------------
9.5 Making Device Nodes注意:5。0或其後續版本的用戶應該略過這一節。因為它們使用devfs來自動的分派設備節點。
幾乎內核中的每個設備在/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 常規問題郵件列表,它將很快地被解決。
安裝新內核失敗:
如果內核編譯成功,但安裝失敗(make install 或是 make installkernel 命令失敗),第一件要檢查的事情就是你的系統運行的安全級別是否是 1或更高。內核的安裝需要移除內核的不可變信號 量,並用新內核的不可變信號量代替。而securelevel 1或更高時,是不允許任何對系統不可變信號量的改變 ,內核的安裝需要在securelevel 0或更低時才能完成。
內核無法啟動:
如果你的新內核無法啟動,或無法識別你的硬件,不要擔心!幸運的是,FreeBSD 有一個很棒的從錯誤內核恢復的機制。簡單的說就是,從FreeBSD 的啟動loader 中,選擇一個你要使用的內核。在 系統時間從10開始倒計時時,按下除Enter 之外的任何鍵, 輸入unload然後輸入 boot kernel.old, 或者其 它任何能准確引導的內核的文件名字.當配置一個內核時,記得在手頭保留一個能正常啟動的內核是個好主意 。
在用一個好的內核啟動後,你可以檢查一下你的配置文件,再設法重新建立一個內核。看看/var/log/messages 文件會比較有幫助,它記錄了每次成功啟動的所有內核信息。同樣,dmesg 命令會列出當前啟動中的內核信息。
注意: 你在編譯內核時,確信手頭保留著一個GENERIC 或其它名字的不會被下次構建所覆蓋的內核。你不 能僅依靠kernel.old, 因為當你安裝一個新內核時,kernel.old 會被最後一次安裝的內核(也許就是無法正 常工作的)所覆蓋。所以,盡快將當前正常工作的內核移到適當的內核位置,否則ps等命令不會正常工作。 解開編譯安裝內核文件的正確命令是:
# chflags noschg /kernel
如果該命令無效,可能是你的系統的安全級別大於0。可在 /etc/rc.conf中把kern_securelevel設置成 -1, 然後從啟系統. 在新內核成功後,你可以把它再改回去。另外,如果你要設定內核或其它文件的訪問限制,以使它不能被移動或修改,可以用下面的命令:
# chflags schg /kernel
在5。x中,內核不和系統不可變信號量安裝在一起。所以這對追查所遇問題來源使無濟於事的。
內核工作,但ps 根本就不工作:
如果你安裝了一個不同版本的內核到系統,例如,在3.x 系統中安裝了4.x 內核,許多系統內建的命令象ps 和vmstat 會根本不工作。你必須重編譯libkvm 庫以及這些程序。千萬不要隨意從其它系統拷貝不同版本的內核來使用。