Chapter 7. 編譯核心

Table of Contents
7.1. 安裝核心原始碼
7.2. 義大利式的鍵盤配置
7.3. 重新編譯核心
7.4. 產生核心設定檔
7.5. 設定核心
7.6. 產生 dependencies 和重新編譯
7.7. 如果發生錯誤

大部分的 NetBSD 使用者,不論早晚都將會編譯一個個人化的核心。 這帶給你許多好處:

7.1. 安裝核心原始碼

安裝程式 Sysinst 並不會將核心原始碼 複製到硬碟上,因此它們必須被手動地安裝。核心原始碼檔案位於 source/sets 目錄且命名為 syssrc.tgz

# gzip -dc syssrc.tgz | (cd / ; tar xvf -)
    

請耐心等待:這個作業會花費數分鐘,因為這個壓縮檔包含成千個檔案。 原始碼會位於 /usr/src/sys;會有一個 鍊結 sys 指向這個目錄。所以底下的作業會有 相同的效果:

# cd /usr/src/sys
# cd /sys
    

在完成解壓縮之後,你可以移除不需要的架構所在目錄,以保留 硬碟空間。cd/sys/arch 並且刪除你不需要的目錄。在 i386 平台為例,你可以只保留 i386 目錄。對其他的平台而言,可能需要保留不只一個目錄。

在原始碼完成安裝以後,你便可以建立個人化核心:這並沒有 你想像中的困難。事實上,建立新的核心只需四到五個步驟, 將會在以下的段落中做描述。

7.2. 義大利式的鍵盤配置

在編譯核心以前,義大利使用者應該考慮修改預先定義的鍵盤配置 來使用義大利式的鍵盤,這已經定義在原始碼的檔案 /sys/dev/pckbc/wskbdmap_mfii.c 中了。 在預先定義的鍵盤配置中,一些對程式設計者有用的字元被遺失了 (例如,左箭頭和右箭頭等)這是一個可選擇的配置:

static const keysym_t pckbd_keydesc_it[] = {
...
KC(8),   KS_7,          KS_slash,       KS_braceleft,
KC(9),   KS_8,          KS_parenleft,   KS_bracketleft,
KC(10),  KS_9,          KS_parenright,  KS_bracketright,
KC(11),  KS_0,          KS_equal,       KS_braceright,
KC(12),  KS_apostrophe, KS_question,    KS_grave,
KC(13),  KS_igrave,     KS_asciicircum, KS_asciitilde,
KC(26),  KS_egrave,     KS_eacute,      KS_bracketleft, KS_braceleft,
KC(27),  KS_plus,       KS_asterisk,    KS_bracketright,KS_braceright,
...
    

預先的配置定義了這些對照表:

KeysCharacter
Alt Gr + 7{
Alt Gr + 8[
Alt Gr + 9]
Alt Gr + 0}
Alt Gr + '`
Alt Gr + ì~
Alt Gr + é[
Alt Gr + +]
Shift + Alt Gr + è{
Shift + Alt Gr + +}

終端機驅動程式: 從版本 1.4 開始,NetBSD使用了 wscons, 跨平台的終端機驅動程式來處理螢幕,鍵盤和滑鼠。 先前的版本則使用 pcconspcvt。詳細說明請看 Chapter 12

7.3. 重新編譯核心

要重新編譯核心,你必須安裝編譯程式集 (comp.tgz)

核心編譯的基本步驟

  1. 建立/修改核心設定檔

  2. 設定核心

  3. 產生 dependencies

  4. "Make" 核心

  5. 安裝核心

7.4. 產生核心設定檔

Note: 這裡描述的目錄是以 i386 為例的。其他平台的使用者必須 至換成適當的目錄(通常是 arch 底下 的子目錄)。

核心設定檔定義了被核心支援的裝置種類,數目和特性,就如同 有數個核心設定選項一樣。核心設定檔位於 /sys/arch/i386/conf 目錄。最簡單 的建立方法是複製一個現有的並編輯它:在大部分的平台上, 通常最好的選擇是 GENERIC 設定檔。在此設定檔中,有許多的 註解來描述選項;更詳盡的說明在 options(4) 線上手冊中。

# cd /sys/arch/i386/conf/
# cp GENERIC MYKERNEL
# vi MYKERNEL
    

核心名稱: 基於歷史,核心設定檔的名稱都是大寫。

修改核心設定檔,基本上包含三個作業:

  1. 包含/不包含在核心中支援的硬體裝置(例如,如果不需要, SCSI 支援可以移除)

  2. 打開/關閉在核心中支援的特徵(例如,打開 NFS client 支援, 打開 Linux 模擬功能, ...)

  3. 更改核心參數。

凡是行開頭具有 "#" 符號的便是被標記的;被標記的 行表示被關閉支援,要打開支援則要移除標記字元。最好使用 標記行來關閉支援而不要刪除該行;我們以後便可以利用解除 標記來打開它們。

dmesg 指令的輸出可以被用來決定哪一行 應該被關閉。每一行的型態為:

<XXX> at <YYY>
    

XXX 和 YYY 兩者都必須設定在核心設定檔中。在建立最小化設定時, 你可能需要做一些試驗,在不具有 SCSI 和 PCMCIA 的桌上型電腦, 可以將核心的大小減半。

你應該也檢查不需要的選項是否被關閉。每一個選項都有簡短的 註解描述它們,對了解該選項是很有幫助的。需多選項在 options(4) 中都有更詳盡的敘述。你應該設定正確的選項來支援 各種鍵盤配置和區域性的時間。例如,在義大利:

options RTC_OFFSET=-60
...
options PCKBD_LAYOUT="KB_IT"
    

adjustkernel Perl script 可以在 被找到。 http://www.feyrer.de/Misc/adjustkernel, 分析了 dmesg 的輸出並自動地產生 最小化的核心設定檔。你需要在系統上安裝 Perl 來執行。 要安裝新的軟體請參考 Chapter 8。 如果你現在要安裝 Perl,下載預先編譯好的 package perl-5.00404.tgz 並執行以下指令:

# pkg_add perl-5.00404.tgz
    

現在 Perl 被安裝及設定好了,可以開始使用:真是非常簡單...

你現在可以執行 script:

# cd /sys/arch/i386/conf
# perl adjustkernel GENERIC > MYKERNEL
    

我已經試過這個 script 而且它的效果非常好,減少了我許多 手動的編輯工作。要注意的是這個 script 只設定了有效的裝置: 你仍然必須手動地增加其他的選項(例如,Linux 模擬,...)

7.5. 設定核心

當你完成核心設定檔的修改以後(我們將稱它為 MYKERNEL),你可以鍵入以下指令:

# config MYKERNEL
    

如果 MYKERNEL 沒有錯誤,則 config 程式將會建立必要的檔案 來編譯核心,否則,我們必須修正錯誤並再一次地執行 config 程式。

7.6. 產生 dependencies 和重新編譯

用以下指令來產生 Dependencies 和編譯核心:

# cd ../compile/MYKERNEL
# make depend
# make
    

編譯會因為發生錯誤而停止;會有種種的原因但是大多數發生 的錯誤是核心設定檔沒有通過 config 的 檢驗。有時候錯誤的原因是因為硬體問題(大多因為 RAM): 編譯的工作比其他的應用程式的執行更加耗費硬體資源。另一個 典型的錯誤是:選項 B 被打開但是所需要的另一個選項 A 沒有打開。

完成編譯需花費幾分鐘到幾小時,視硬體而定。 請看以下的範例:

CPURAM (MB)Approx. time
486 DX2 50201 hour
P1669615 minutes
PIII1285 minutes
68030/2584 hours

make 指令最後會在編譯目錄中產生 netbsd 檔案:在儲存原先的核心後,這個檔案應該被複製到根目錄底下。

# mv /netbsd /netbsd.old
# mv netbsd /
    

個人化的設定可以縮減核心的大小。在以下的例子中, netbsd.old 是原先安裝的核心而 netbsd 是新的核心。

-rwxr-xr-x  1 root  wheel  1342567 Nov 13 16:47 /netbsd
-rwxr-xr-x  1 root  wheel  3111739 Sep 27 01:20 /netbsd.old
    

在重開機後將會使用新核心:

# reboot
    

7.7. 如果發生錯誤

當重開機後,可能會發生心核心並不如預期般的運作或 甚至不能開機。別擔心:如果這個情況發生,只要利用之前保留的 核心來重開機並移除新的(最好重開機在"單一使用者" 模式)