8.4 重新調配、編譯 kernel

首先對 kernel 相關目錄作快速介紹。 這裡所提到的所有目錄都在 /usr/src/sys 內, 也可以用 /sys 這個 symbolic link 來連到這。 這裡的許多子目錄分別擺放 kernel 的各組成部分,但對打造 kernel 影響最重要的目錄是 arch/conf, 這裡是可以針對需求來修改自訂 kernel 相關設定。 此外,還有在編譯 kernel 過程中會暫時擺放的 compile 目錄。 剛講到的 arch 可以是右列架構之一: i386alphaamd64ia64powerpcsparc64pc98(在日本較流行的另一種 PC 硬體架構)。 在各特定硬體架構目錄的東西,只搭配相對應的硬體架構而已。 而其餘的原始碼則是與硬體架構無關,可以在所有 FreeBSD 可裝的平台上共用。 整體目錄架構都是有邏輯可循,像是各項有支援的硬體設備、檔案系統, 以及相關選項通常都會擺在它們自己的子目錄內。

本章所用到的例子,都是你使用 i386 架構的機器。 請依實際情況,對相關目錄作調整即可。

Note: 若您系統上 沒裝 /usr/src/sys 目錄, 也就是說沒裝 kernel source code 的話,那麼最簡單安裝方式就是以 root 權限來執行 sysinstall, 接著請選 Configure,然後選 Distributions 接著為 src 再選 base 最後選 sys。 若不喜歡用 sysinstall 而且手邊有 “正式的” FreeBSD 光碟可以用的話, 那麼也可以用以下指令來安裝:

# mount /cdrom
# mkdir -p /usr/src/sys
# ln -s /usr/src/sys /sys
# cat /cdrom/src/ssys.[a-d]* | tar -xzvf -
# cat /cdrom/src/sbase.[a-d]* | tar -xzvf -

接下來,切換到 arch/conf 目錄, 複製 GENERIC 設定檔為你想稱呼的新 kernel 名稱。 例如:

# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL

通常,命名方式都是大寫。如果你負責維護許多不同硬體架構的 FreeBSD 機器的話,那麼照該機器名稱(hostname)來命名會是比較明智。 上面例子中之所以命名為 MYKERNEL 就是因為這緣故。

Tip: 建議不要把改過的 kernel 設定檔直接放在 /usr/src。 因為若編譯遇到其他問題時, 直接砍掉 /usr/src 再重練, 可能會是比較乾脆的選擇之一。 一旦真的砍了之後,你可能幾秒之後才會醒悟到: 你同時也砍掉自己改的 kernel 設定檔。 此外,也不要直接修改 GENERIC,因為下次你 更新 source tree時, 它會被新版覆蓋,而相關修改也將隨之而逝。

你也可考慮把 kernel 設定檔改放到其他地方,然後再到 i386 目錄內建個指向它的 symbolic link。

舉例:

# cd /usr/src/sys/i386/conf
# mkdir /root/kernels
# cp GENERIC /root/kernels/MYKERNEL   
# ln -s /root/kernels/MYKERNEL

現在,就開始用自己喜歡的編輯器來修改 MYKERNEL。 若才剛裝好 FreeBSD 而已,唯一可用的編輯器很可能是 vi 了,由於它的用法很多種,礙於篇幅將不詳細介紹, 你可在 參考書目 內找到相關書籍。 不過,FreeBSD 也提供另一個更好用的編輯器,它叫做 ee,對新手而言,這可能是蠻好的選擇。 你可以任意修改檔案內的相關註解以說明相關設定為何, 或者其他想改的 GENERIC 設定內容。

若你有在 SunOS™ 或者其他種 BSD 作業系統下進行編譯 kernel 的經驗, 那麼應該已經很熟悉本篇所介紹的大部分步驟。 換句話說,若您之前用的是 DOS 這類作業系統,那麼 GENERIC 設定檔的內容就可能比較難懂些,沒關係, 我們將在下面的 kernel 設定 會循序漸進地介紹。

Note: 若有從 FreeBSD 計劃去 更新你的 source tree 的話, 則切記在進行任何升級之前,務必要察看 /usr/src/UPDATING。 這檔會介紹在更新過程中的重大議題或要注意的事項。 由於 /usr/src/UPDATING 是對應於你機器上目前的 FreeBSD source code 版本,因此會提供比本手冊更新的內容。

現在開始來編譯 kernel 吧。

編譯 Kernel

  1. 請切換至 /usr/src 目錄:

    # cd /usr/src
    
  2. 編譯 kernel:

    # make buildkernel KERNCONF=MYKERNEL
    
  3. 安裝新 kernel:

    # make installkernel KERNCONF=MYKERNEL
    

Note: 要有完整的 FreeBSD source tree 才能編譯 kernel。

Tip: 預設情況下,在編譯自訂 kernel 時,全部的 kernel modules 也會一起重編。 若要快速升級 kernel, 或是只想重編所需的 kernel module,那麼在編譯 kernel 前要先改一下 /etc/make.conf,比如:

MODULES_OVERRIDE = linux acpi sound/sound sound/driver/ds1 ntfs

上面該設定值為所希望重編的 kernel module 列表。

WITHOUT_MODULES = linux acpi sound/sound sound/driver/ds1 ntfs

而上面這設定值則為不要編入的 kernel module 列表。 若想更瞭解其他 kernel 編譯的相關變數,請參閱 make.conf(5) 說明。

新的 kernel 會複製到 /boot/kernel 目錄內的 /boot/kernel/kernel,而舊的則移至 /boot/kernel.old/kernel。 現在呢,先關機,然後就會以新 kernel 重開機 若有問題的話,本章後面會介紹一些疑難雜症來協助你。 若新 kernel 無法開機的話,請參閱 這裡 以恢復系統運作。

Note: 至於開機過程的其他相關檔案、設定,比如 loader(8) 及其設定,則放在 /boot。 Third party 或自訂的 kernel modules 則會放在 /boot/kernel,不過, 應注意要保持 kernel module 與 kernel 是否有同步, 這點很重要,否則會導致不穩或出問題。

本文及其他文件,可由此下載:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

若有 FreeBSD 方面疑問,請先閱讀 FreeBSD 相關文件,如不能解決的話,再洽詢 <questions@FreeBSD.org>。
關於本文件的問題,請洽詢 <doc@FreeBSD.org>。