FreeBSD 使用手冊
Prev | Chapter 8 設定 FreeBSD Kernel | Next

# 8.4 重新調配、編譯 kernel

首先對 kernel 相關目錄作快速介紹。 這裡所提到的所有目錄都在 `/usr/src/sys` 內， 也可以用 `/sys` 這個 symbolic link 來連到這。 這裡的許多子目錄分別擺放 kernel 的各組成部分，但對打造 kernel 影響最重要的目錄是 ``arch`/conf`， 這裡是可以針對需求來修改自訂 kernel 相關設定。 此外，還有在編譯 kernel 過程中會暫時擺放的 `compile` 目錄。 剛講到的 `arch` 可以是右列架構之一： `i386`、`alpha`、 `amd64`、`ia64`、 `powerpc`、`sparc64`、 `pc98`(在日本較流行的另一種 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 是否有同步， 這點很重要，否則會導致不穩或出問題。

Prev | Home | Next
探測系統硬體 | Up | kernel 設定檔解說

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

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