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.ISO8859-1/books/handbook/kernelconfig-config.html## The handbook is also available locally in /usr/