作者:陳柏菁 E-mail
第九章 模組及核心編譯

索引:
9.1 核心模組
  9.1.1 模組概述
  9.1.2 模組相關指令 ---
lsmodinsmodrmmodmodprobemodinfodepmod
  9.1.3 模組設定檔 --- /etc/modprobe.conf
9.2 核心編譯
  9.2.1 編譯核心的理由
  9.2.2 核心原始碼概述
  9.2.3 核心編譯的步驟
make menuconfigmake bzImagemake modulesmake modules_installmake install
修改 /etc/lilo.conf修改 /boot/grub/menu.lst
補充:make mrproper、make
下載新核心來進行核心升級 :make oldconfig
  9.2.4 利用 patch file 來進行核心升級



9.1 核心模組 ( Modules )

9.1.1 模組概述

當我們在 windows 上新增一個比較新的周邊裝置時,必須要安裝此硬體裝置的 driver ( 驅動程式 ),才能驅動這項裝置,而此 driver 通常是硬體廠商所提供的。那在 Linux 上頭可以使用與 windows 相同的方式來安裝 drivers 嗎 ? 當然是不行的,因為這兩種作業系統的核心設計與其運作方式都不相同。

Linux 的核心是支援驅動程式模組化的,意思就是說您可以將 driver 編譯成核心所認得的模組型態,然後再安置於指定的路徑下,這樣就可以提供核心來隨時做動態載入。所以說 Linux 的核心是允許以 modules 的方式來載入 drivers,而不必將所有 driver 都編進核心裡,如此最大的好處是當您未使用到該項裝置或功能時,核心並不會載入,需要用到時才將其做動態載入,這樣一來就可以讓我們的核心變得小而美,運作起來也比較有效率。

在 Linux 以前較不普及時,硬體廠商所提供的 drivers for Linux 比起 drivers for windows 真是少得可憐,但隨著 Linux 的漸受重視,這些硬體廠商現在大都會附上 drivers for Linux,您可以依其所附的磁碟片或光碟片內編譯模組的步驟,而能夠成功的編譯出一個核心模組出來。

用來提供核心所使用的模組是放在 /lib/modules/`uname -r`/ 這個目錄中。" uname -r " 代表的是您核心的版本:

suselinux:~ # uname -r
2.6.5-7.97-default
說明:
第一個數字 " 2 " 為核心的主版本。第二個數字 " 6 " 是次版本,也就是我們最要留意的一個數字,次版本如為奇數,表示這個核心目前尚處於實驗發展階段,次版本如為偶數,則表示此核心為一經由多次實驗結果正式對外發表的穩定版本,所以我們在做核心升級時都會去下載次版本為偶數的穩定核心。第三個數字為修正的版本。至於最後一組為副版本。

如您要下載新版的核心來編譯時,請記得新舊核心的版本差異不要過大,比如您原核心為 2.4,那就盡量不要去下載 2.6 的核心來升級,因兩核心版本間已有所差異,函式庫亦有所不同,但如果同樣是次版本的升級則是可行。

接著底下就來看看這個目錄的內容:

suselinux:~ # cd /lib/modules/`uname -r`
suselinux:/lib/modules/2.6.5-7.97-default # ls
build modules.dep modules.isapnpmap modules.usbmap
kernel modules.inputmap modules.pcimap source

在這個目錄中我們要留意 kernel 目錄及 modules.dep 檔案:

suselinux:/lib/modules/2.6.5-7.97-default/kernel # ls
arch crypto drivers fs kernel lib net security sound

這些主要目錄底下還存在一些子目錄,而至最後則是會看到很多以 .ko 做結尾的檔案,這就是所謂的模組檔案。比如:

suselinux:/lib/modules/2.6.5-7.97-default/kernel # ls fs/ext3
ext3.ko ← 這就是模組檔案,而 ext3 就稱為模組名稱。

suselinux:/lib/modules/2.6.5-7.97-default/kernel # ls net/ipv4
ah4.ko esp4.ko ip_gre.ko ipcomp.ko ipip.ko ipvs netfilter

suselinux:/lib/modules/2.6.5-7.97-default/kernel # ls drivers/net
3c501.ko 8390.ko hp-plus.ko pppoe.ko smc-ultra.ko
3c505.ko bsd_comp.ko hp.ko sis190.ko smc9194.ko
8139cp.ko e100.ko ne.ko sis900.ko sunhme.ko
8139too.ko eth16i.ko ne2k-pci.ko slip.ko via-rhine.ko

這些是網卡的模組,像 8139too.ko 就是一般的螃蟹卡模組,via-rhine.ko 則是 D-Link 的模組。

另外 drivers 目錄下的相關子目錄中還存放著很多周邊裝置的模組,您可自行進去瞧一瞧。

至於 modules.dep 是記載著模組相依性的訊息,模組之間會有相依性的存在,而這些訊息就是存在於這個檔案內。

9.1.2 模組相關指令

lsmod
: program to show the status of modules in the Linux Kernel.
  顯示目前核心有載入的模組。



insmod
simple program to insert a module into the Linux Kernel.
  如在開機過程,核心沒主動將您需要的模組載入時,於開機後可執行這個指令來將模組載入,不過使用 insmod 會考慮到相依模組的問題,所以比較麻煩一點。

指令語法insmod module-file

  注意噢,後面是指定模組檔案而非模組名稱,且須指出此模組檔案的路徑才行。

範例說明
suselinux:/lib/modules/2.6.5-7.97-default/kernel # insmod net/ipv4/netfilter/iptable_filter.ko
insmod: error inserting 'net/ipv4/netfilter/iptable_filter.ko': -1 Unknown symbol in module

→ 出現這個錯誤訊息表示此模組有相依性的問題存在。


suselinux:/lib/modules/2.6.5-7.97-default/kernel # insmod net/ipv4/netfilter/ip_tables.ko

接著執行 " lsmod " 來確定一下 ip_tables 有無被載入:

suselinux:/lib/modules/2.6.5-7.97-default/kernel # lsmod
Module Size   Used by
ip_tables 17280   0
usbserial 29040   0
parport_pc 35520   1
lp 11044   0
parport 37832   2 parport_pc,lp
via_rhine 20104   0
subfs 7424   3
ext3 108968   1

suselinux:/lib/modules/2.6.5-7.97-default/kernel # insmod net/ipv4/netfilter/iptable_filter.ko

→ 咦,居然沒有錯誤訊息,因為 ip_tables.ko 這個相依模組已經載入了啊。您可以再執行 " lsmod " 去做檢查噢。



rmmod:simple program to remove a module from the Linux Kernel.
  這是卸載模組的指令,一樣需考慮到相依性的問題。

指令語法
rmmod [-f] module-name

  當您想卸載一個正在使用的模組,可以加上 " -f " 這個參數來強迫移除,不過這可是個危險動作。

範例說明
suselinux:~ # rmmod ip_tables
ERROR: Module ip_tables is in use by iptable_filter

→ 後載入者要先移除,所以您會看到這個訊息。

suselinux:~ # rmmod iptable_filter
suselinux:~ # rmmod ip_tables

這樣就成功移除啦。



modprobe:program to add and remove modules from the Linux Kernel
  最常使用的模組載入指令 ; 與 insmod 不同的是如欲載入的模組有相依性存在時,modprobe 會先主動載入相依模組,而其所依據的檔案就是 modules.dep

指令語法 modprobe [-r] module-name
modprobe [-lc]

   如您想單純的載入模組,就不需加這些參數。

參數說明
-r 要移除模組的話,可加上這個參數。
-l 列出所有在 /lib/modules/`uname -r`/kernel 及 /lib/modules/`uname -r`/extra 中的模組。
-c 跟使用 " -l " 差不多意思,不過所顯示的資訊更為詳盡。

範例說明
suselinux:~ # modprobe iptable_filter
suselinux:~ # lsmod
Module
Size
  Used by
iptable_filter
2944
  0
ip_tables
17280
  1 iptable_filter

→ 瞧,相依模組已經被自動載入了。

suselinux:~ # modprobe -l

→ 列出所有核心能使用的模組。

suselinux:~ # modprobe -l | grep ntfs
/lib/modules/2.6.5-7.97-default/kernel/fs/ntfs/ntfs.ko

查詢 ntfs 模組是否存在。

suselinux:~ # modprobe -c
suselinux:~ # modprobe -c
| grep via_rhine
alias pci:v00001106d00003053sv*sd*bc*sc*i* via_rhine
alias pci:v00001106d00003106sv*sd*bc*sc*i* via_rhine
alias pci:v00001106d00003065sv*sd*bc*sc*i* via_rhine
alias pci:v00001106d00003043sv*sd*bc*sc*i* via_rhine



modinfo: program to show information about a Linux Kernel module.
  顯示核心模組的相關資訊,比如此模組的簡單描述 (description)、作者 (author)、授權模式 (license)、相依模組 (depends)、別名 (alias) 等等。

範例說明
suselinux:~ # modinfo iptable_filter
description: iptables filter table
author: Netfilter Core Team <coreteam@netfilter.org>
license: GPL
depends: ip_tables
supported: yes
vermagic: 2.6.5-7.97-default 586 REGPARM gcc-3.3

另外您也可以加上參數來指定要顯示的訊息,比如 -d (description)、-a (author)、-l (license)、-p ( param) 等。

suselinux:~ # modinfo -a reiserfs
Hans Reiser <reiser@namesys.com>

suselinux:~ # modinfo -l reiserfs
GPL



depmod:program to generate modules.dep and map files.
  用來建立 (更新) 模組相依性的檔案,而這個檔案就是指 /lib/modules/`uname -r`/modules.dep,這可是 modprobe 程式在載入模組時的一個主要依據的檔案。您可以在命令列上直接執行 " depmod " 或 " depmod -a " ,這樣就可以讓您的 modules.dep 保持最新的模組相依性訊息。系統預設在開機時都會自動執行這個程式。


9.1.3 模組設定檔

有關模組設定的檔案,在核心 2.4 時代為 /etc/modules.conf 或 /etc/conf.modules,到了核心 2.6 時則是設定在 /etc/modprobe.conf

在編譯核心時會同時編譯出給這個核心版本所使用的驅動程式 (modules),當您想要管理這些 modules 時,就必須配合一些工具 (程式) 來使用,而這些程式在 kernel 2.4 時是存在於 modutils 套件內,kernel 2.6 則是在 module-init-tools 套件內,不過不論是哪一版的核心,用來管理這些 modules 的工具都相同,只不過它們所讀取的模組設定檔不同而已。

/etc/modprobe.conf 的用途

  眾所皆知,modprobe 指令可以用來載入或移除一個以上的模組,但有時候因為模組相依性的問題,需要額外指派一些選項來給這些模組使用,而您就可以把需要的選項設定在 modprobe.conf 內。此外您也可以把模組的別名設定在這個檔案內。再來您還可以藉由設定這個檔案來改變在命令列上執行 modprobe 的行為。



/etc/modprobe.conf 的設定

  範例一
 
alias alias-name module-name

alias 指令可以讓我們以模組的別名來替代要載入的那個模組,比如您設定成:

alias mod my_module_name

這表示您可以執行 " modprobe mod " 來將 my_module_name 這個模組載入。

另外別名名稱中也可以包含萬用字元在內,比如:

alias mod* my_module_name

這表示您可藉由執行 " modprobe modname " 來載入 my_module_name 模組。

範例二
   
install module-name command...

install 指令是告訴 modprobe 執行後面的 command 來取代所欲載入的模組。比如您設定成:

install mod modprobe mod1 && modorpbe mod2

意思是說當您執行 " modprobe mod " 時,其實是會載入 mod1 模組,而如果 mod1 載入成功後會再繼續載入 mod2。
 
範例三
 
remove module-name command...

這跟範例二是剛好相反的用法,比如:

remove mod rmmod mod1 || rmmod mod2

這表示當您執行 " modprobe -r mod " 時,會先幫您移除 mod1 模組,如果移除失敗才移除 mod2 模組。



9.2 核心編譯

核心是 Linux 作業系統的靈魂所在,其主要工作為控制週邊硬體設備,如 cpu、記憶體、硬碟、網路卡、音效卡、… ,還有像行程管理、記憶體管理、檔案系統管理、網路功能的支援等等,進而使這些硬體設備及相關服務能發揮其功能。

由此可知,舉凡您在系統中想要存取的任何週邊裝置或者想要使用系統所提供的功能,都必須透過核心的協助才能達成您的目的。比如有某項硬體裝置或服務功能是核心所不支援的,那可想而知,您一定是無法如願的。

一般所謂的 Linux,其實指的就是這個 kernel,而 Linux distribution 即是在 kernel 以外,另外包含了套件的整合、套件管理工具等,如此便成了 Linux 的 Distribution。所以不論您目前使用的是哪種 Distributioin,都是使用 Linux 的 kernel,這是它們一致的共通點。

9.2.1 編譯核心的理由

什麼時候會想要編譯核心呢 ? 諸如前面所提,如有一項新的硬體設備,或者您想要某項特殊功能,目前作業系統的核心並不支援,這時候可能就要去下載新版的核心來進行編譯,這樣才有機會讓這個新核心認識這項裝置或提供相關服務功能 。那如果您要使用的某種裝置或功能,目前的核心就有支援,但作業系統預設的核心偏偏沒把這個項目編入核心或編成模組,那您就只需針對原來的核心進行重新編譯即可。

當我們作業系統安裝完成後,若無特殊需求,實在不需重新編譯核心,因 Distribution 的預設核心已經把很多平常可能用得到的裝置或功能幫您編入核心或編成核心模組了,實在是夠我們來使用了,但如您想純粹的練習核心編譯,倒是可以嘗試看看。

以下就針對需要進行核心編譯的理由整理如下:
  當您所使用的週邊裝置或須求的功能,預設核心是有支援的,但卻沒把該項目給編入核心或編成模組,此時就須要來重新編譯核心囉。
  若硬體設備或某項特殊功能只有新核心才支援時,就要下載新版的核心來進行升級的動作。
  對於預設核心編譯太多用不到的功能,想要將這些多餘的項目取消時,即可重編核心,不過不建議如此作,因其對整體效能並無多大助益。
 

特殊軟體須求,例如一些商業套裝軟體是以 Linux 平台為主,此時可以針對此軟體的特性而將很多不必要的項目從核心中移除,以提高此核心的整體運作效率,突顯軟體的功能,不過這可是一門專業的學問噢。


9.2.2 核心原始碼概述

核心原始碼是安置在 /usr/src/linux-2.6.5-7.97 目錄 (如果您找不到這個目錄,請檢查一下 kernel-source 套件有沒有安裝),而在 /usr/src 目錄下還有個 linux 的符號連結檔,它就是連結到這個目錄,所以您可以直接切換到 linux 目錄去看一下內容:

suselinux:/usr/src/linux # ls

COPYING MAINTAINERS arch fs ipc mm
CREDITS Makefile crypto include kernel net
Documentation README drivers init lib scripts

arch 不同平台結構的核心原始碼。(architecture)
drivers 所有各種硬體設備驅動程式的原始碼。
fs 檔案系統的原始碼。
include 建構一個系統所需要大多數的 include file。
init 核心初始化的原始碼,如您對核心原始碼有興趣,可從這個目錄下手。
ipc 有關核心程序間行程通訊的原始碼。(inter-process communication)
kernel 主要的核心原始碼 ; 其他硬體平台相關的原始碼是放在 arch/*/kernel 中。
lib 核心函式庫的原始碼 ; 其他硬體平台相關的原始碼在 arch/*/lib。
mm 有關於記憶體管理的原始碼。
net 有關於網路部分的原始碼。
scripts 包含一些在建構核心時可以使用的 scripts 工具,如 awk、tk 等。

至於 Documentation 目錄是存放關於核心的相關文件說明,比如我們在編譯核心時所遭遇的一些問題或缺失,可以找找這邊的說明。此外還要注意一個叫做 Makefile 的檔案,因為在核心編譯的過程會參考這個檔案。

9.2.3 核心編譯的步驟

您可以去官方網站下載比較新版的核心來進行編譯,也可以針對原核心來重編,而這裡我們是以原核心重新編譯為範例來做說明,至於自行下載新版核心的編譯做法,在稍後會做補充。

首先請您先切換到 /usr/src 目錄,檢查一下是否有一個符號連結檔 linux,然後看看是不是連結到存放核心原始碼的那個目錄 (linux-2.6.5-7.97),如果都沒問題的話,就將工作目錄切換至 linux 上頭,因等一下的核心編譯過程都是在此目錄下完成的。

suselinux:~ # cd /usr/src/linux

suselinux:/usr/src/linux # vi Makefile

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 5
EXTRAVERSION = -new ← 自訂核心版本為 2.6.5-new。
NAME=Zonked Quokka

再來您可先將相關目錄先行做個備份,如 /boot 及 /lib/modules/2.6.5-7.97-default,這樣萬一您執行過程出了個什麼差錯,才方便您進行還原:

suselinux:~ # cp -a /boot /boot.bck

suselinux:/lib/modules # cp -a 2.6.5-7.97-default 2.6.5-7.97-default.bck

接著下來就開始進行核心編譯囉。

步驟一:執行 make menuconfig

這個步驟主要是讓您選擇要將哪些項目編入核心,哪些項目編成核心模組,不過在此之前,請先確定 ncurses-devel 套件有安裝。

當然您也可以執行 "make config" 或 "make xconfig" 來達到同樣的目的。不過 "make config" 是採文字模式下逐行設定的方式,萬一您想往回修改時會有問題,所以一般人比較少使用 ; 而 "make xconfig" 則是在 X-WINDOW 下開啟終端機後去執行的指令,可讓我們在圖形介面下來操作,但要確定 qt3 相關套件有安裝,如 qt3-devel 等,不過這個套件有一些相依性存在,所以請您執行 YaST 來自動幫您解決這個問題。

suselinux:/usr/src/linux # make menuconfig



這裡就是開始要您做選擇的時候了,我們先熟悉一下要如何操作:

首先在主選單 (Linux Kernel Configuration) 畫面可以看到有很多項目供您做選擇,您可以用上下鍵來移動到您要做設定的項目,而在選項的右邊有個箭頭,表示該選項底下尚有一些子選項供您選擇設定。比如您選擇了 [File Systems] 並確定最底下的按鈕位置是在 [Select] 後,就可以按下 Enter 鍵來進入到裡面的設定細項:



在畫面的底下除了剛剛介紹的 [Select] 外還有 [Exit]、[Help] 兩個按鈕,您可以用 tab 鍵來做三個按鈕之間的切換 ; 而在子選單中可能有些項目還可以進入到下一層選單,操作方式與上面相同。若您在子選單中想要回到上一層選單,可先用 tab 鍵移到 [Exit],再按 Enter 鍵就行了。而如果您對某個選項不了解其涵義,可選擇 [Help] 按鈕來看裡面的相關說明。

另外您會看到選項左邊有個 < > 或 [ ] 符號,若為 < >,則大部分時間您可選擇將該選項編入核心或編成模組或不做選擇,但也有部分項目只能在模組及不選擇之間作切換,至於切換的方式使用空白鍵就行了 ; 若為 [ ],則您只能將該選項編入核心或不做選擇。[*] 及 <*> 表示編入核心,<M> 為編成模組,如不想將該選項編入核心或編成模組則保留空白即可。

在主選單最後面還有兩個選項:



當我們在設定核心選項時,有時候因為項目過多,無法一次完成,這時候為了將您目前已做好的設定保留下來,可移到 [Save Configuration to an Alternate File],接著按下 Enter 鍵後就會看到以下的畫面:



此時就看您要將剛剛所做的設定保留到哪個檔案,比如我把它存在 /root/kernel 中,這樣改天想繼續對其他的選項作設定時,就可以使用 [Load an Alternate Configuration File] 來將之前保留在 /root/kernel 檔案內的設定值套用上去,然後就可以繼續完成您未完成的部分。

了解了大致的做法後,接下來就要開始針對裡邊的選項做設定,不過先提醒大家,核心編譯的項目非常的多,您必須對您本身的硬體設備有一定程度的了解,且需知道您希望核心能支援您哪些功能,如果遇到不太清楚的項目,就使用 [Help] 來尋求幫忙囉。底下就大略介紹一下這些設定項目:

Code maturity level options →

[ * ] Prompt for development and/or incomplete code/drivers
若想進行核心的研發工作,可考慮選起來。

General setup →

[ * ] Support for paging of anonymous memory (swap)
讓核心支援 swap device 或 swap file。

[ * ] System V IPC
IPC 為 Inter-Process Communication 的簡稱。此項目主要是要讓行程之間交換資訊用的。

[ * ] BSD Process Accounting
讓核心將使用者所執行的行程資訊記載下來,可選。

[ * ] Sysctl support
您可以在重新開機時或不需要重新編譯核心下,而能動態更新核心參數,使核心擁有較大彈性。如此項目沒選擇的話,/proc/sys 會沒作用。

(14) Kernel log buffer size (16 => 64KB, 17 => 128KB)
設定核心紀錄的緩衝區大小,一般單 CPU 可使用 14 (16KB),多 CPU 時可使用 15 (32 KB)。

[ * ] Support for hot-pluggable devices
如有使用熱插拔裝置可選用,一般 hot-pluggable 裝置像 PCMCIA、USB 等。

[ * ] Kernel .config support
[ * ] Enable access to .config through /proc/config.gz
核心編譯過程會參考 .config 檔案,且將來可以藉由 /proc/config.gz 來了解核心的配置。

Loadable module support →

[ * ] Enable loadable module support
讓核心能夠支援外掛模組的載入,這當然要選囉 !

[ * ] Module unloading
能將載入的模組執行卸載的動作。

[ * ] Forced module unloading
當您執行 " rmmod -f modules-name " 時,能強迫卸載模組。

[ * ] Module versioning support (EXPERIMENTAL)
如果您要讓核心能使用其他核心所提供的模組就選起來。

[ * ] Automatic kernel module loading
讓核心能自動載入外掛模組。

Processor type and features →

Processor family (586/K5/5x86/6x86/6x86MX)
這是選擇您所使用的 CPU 類型而已。

[ * ] Generic x86 support
如果 CPU 類型是選擇 386、586 之類的,這個項目可以選起來。

[ ] Symmetric multi-processing support
這是多處理器的支援。

[ * ] Local APIC support on uniprocessors
若您單 CPU 有支援 APIC (Advanced Programmable Interrupt Controller) 就選起來,APIC 為一新型的 IRQ 控制模式,能提供 24 個 IRQ 供周邊使用。


[ * ] Machine Check Exception
讓核心啟用 CPU 上的自我診斷功能。

<M> Toshiba Laptop support
<M> Dell laptop support
若您是使用筆記型電腦才做選擇,否則不需要選。

<M> /dev/cpu/microcode - Intel IA32 CPU microcode support
<M> /dev/cpu/*/msr - Model-specific register support
<M> /dev/cpu/*/cpuid - CPU information support
如您使用的是 Intel 的 CPU,就把他選起來。

High Memory Support (off)
  ( X ) off
  ( ) 4GB
  ( ) 64GB
當您記憶體少於 1G 的話,選擇 off 即可,介於 1G 與 4G 間選 4G,4G 以上選 64G。

[ ] Math emulation
CPU 等級太低時才需選擇數值模擬。


[ * ] MTRR (Memory Type Range Register) support
有使用 X WINDOW 的話,就選起來。

Special options →

[ * ] proc/mm support

Power management options (ACPI, APM)

[ * ] Power Management support
[ ] Suspend-to-Disk Support
  ACPI (Advanced Configuration and Power Interface) Support →
如果您的 BIOS 有支援 ACPI 的話,就進去做選擇吧 !
   
  APM (Advanced Power Management) BIOS Support → 讓 BIOS 來接管 APM。
<*> APM (Advanced Power Management) BIOS support
[ ] Ignore USER SUSPEND
→ 忽略使用者暫停請求。
[ * ] Enable PM at boot time
→ 在開機時就啟動電源管理,一般不需要。
[ ] Make CPU Idle calls when idle
→ 想節省一些電源或讓 CPU 閒置時降溫,就選起來。
[ * ] Enable console blanking using
→ 若希望在螢幕閒置時畫面變成空白,以達省電功能並保護螢幕,可作選擇。
[ ] RTC stores time in GMT
→ 如您使用的是本地時間,就不用選。
[ ] Allow interrupts during APM BIOS calls
→ 一般不做選擇。
[ ] Use real mode APM BIOS call to power off
→ 電腦在關機後無法自動切斷電源時可選擇此項目。
   
  CPU Frequency scaling →
這是一項可以用來改變 CPU 頻率的設定,讓 CPU 在負載較低時可以自動調降它的頻率。

Bus options (PCI, PCMCIA, EISA, MCA, ISA) →


[ * ] PCI support
  PCI access mode (Any)
這是關於 PCI 介面裝置的支援,當然要選。

[ * ] ISA bus support
ISA 匯流排支援。如您無 ISA 介面裝置可不選。

[ ] EISA support
Extended ISA,為一加強型的 ISA 匯流排規格,由 IBM 以外的其他電腦製造商所推出,以用來對抗 IBM 的 MCA架構。

[ ] MCA support
IBM 所發展的匯流排架構,主要就是用來對抗 ISA 的,但因與 ISA 不相容再加上 EISA 的抗衡,所以實際上使用 MCA 架構的 PC 並不多見。

PCMCIA/CardBus support
如果您是使用筆記型電腦的話,請進去做選擇。
PCMCIA 為一記憶體擴充槽的規格,若您有使用 PCMCIA 及 CardBus 無線網卡的週邊,就用得到這裡的選項。

PCI Hotplug Support
如您主機板上有 PCI 熱插拔控制器可選起來,一般個人 PC 是沒有啦,通常伺服器等級的主機才可能有這類裝置。


Executable file formats →

<*> Kernel support for ELF binaries
ELF (Executable and Linkable Format) 是最常用的執行檔格式,其支援不同的操作平台。

<M> Kernel support for a.out and ECOFF binaries
a.out 是早期 UNIX 所使用的執行檔格式。

<M> Kernel support for MISC binaries
當您執行像 Java、Python、.NET 等語言所編輯的程式時,就會用到這個選項。

Device Drivers

Generic Driver Options →
Memory Technology Devices (MTD) →
MTD (Memory Technology Devices) 一般是使用在 embedded devices 上。

Parallel port support →
  <M> Parallel port support
→ 有使用到平行埠裝置就一定要選。
  <M> PC-style hardware
→ IBM 及一些 Alphas 有 PC-style parallel ports 時就要選擇,否則不選。
  <M> Multi-IO cards (parallel and serial)
→ 這個項目可以用來支援具有平行埠及序列埠的 PCI cards。
  [ * ] Support foreign hardware
→ 是否要能載入模組來支援非標準的平行埠裝置。一般我們不會做選擇。

Plug and Play support →
PnP 隨插即用的支援。

Block devices → 由於區塊裝置項目很多,故只列出一部份出來。這裡就把握一個原則:能編成模組就編成模組。
  <*> Normal floppy disk support
  <M> Parallel port IDE device support
→ 有一些外接式的 CD-ROM 及磁碟裝置是連接平行埠的話,需選起來。
 
---  Parallel IDE high-level drivers
  <M> Parallel port IDE disks
  <M> Parallel port ATAPI CD-ROMs
  <M> Parallel port ATAPI disks
  <M> Parallel port ATAPI tapes
  <M> Parallel port generic ATAPI devices
ATAPI (AT Attachment Packet Interface ) 是最廣為使用的 IDE/EIDE 設備的標準介面, 經常使用在硬碟、光碟、磁帶及其它設備上。
 
---  Parallel IDE protocol modules
  <M> ATEN EH-100 protocol
  <M> MicroSolutions backpack (Series 5) protocol
  <M> MicroSolutions backpack (Series 6) protocol
  <M> DataStor Commuter protocol
  <*> RAM disk support ← 最好編入核心。
 
(64000) Default RAM disk size
  <*> Initial RAM disk (initrd) support ← 最好編入核心。

ATA/ATAPI/MFM/RLL support →
這是儲存介面裝置及一些控制晶片組的選擇。
ATA 是目前最多人使用的磁碟機介面規格,一定要選。而 MFM ( Modified Frequency Modulation ) 是老式磁碟所使用的儲存編碼方式,新式磁碟則是使用 RLL 編碼方式來提昇存取效能。


  <*> ATA/ATAPI/MFM/RLL support
  <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
 
---  Please see Documentation/ide.txt for help/info on IDE drives
  [ ] Use old disk-only driver on primary interface
  <*> Include IDE/ATA-2 DISK support
  [ * ] Use multi-mode by default
  [ * ] Auto-Geometry Resizing support
  <M> PCMCIA IDE support
  <M> Include IDE/ATAPI CDROM support
 
---  IDE chipset support/bugfixes
  <*> generic/default IDE chipset support
  [ * ] CMD640 chipset bugfix/support
  [ * ] CMD640 enhanced support
  [ * ] Generic PCI IDE Chipset Support
  [ * ] Generic PCI bus-master DMA support
  <*> AMD and nVidia IDE support
  <*> ATI IXP chipset IDE support
  <*> Intel PIIXn chipsets support
  <*> NS87415 chipset support
  <*> VIA82CXXX chipset support
  [ * ] Other IDE chipset support

SCSI device support →
SCSI 裝置的支援,如您沒有這一類的裝置,可以不選啦。

Old CD-ROM drivers (not SCSI, not IDE)

如果您是使用舊式 CD-ROM,且為非 SCSI 或 IDE/ATAPI 介面的話,才進去做選擇。

Multi-device support (RAID and LVM) →
如果您想要做磁碟陣列或邏輯磁區管理的話,可以在裡邊做選擇。

Fusion MPT device support →
Fusion MPT 介面卡的支援,若不清楚不作選擇也無所謂。

IEEE 1394 (FireWire) support →
IEEE 1394 (FireWire) 是一種外接式的資料匯流排,為一新型的傳輸介面,傳輸速率最高達 400 Mbps。

I2O device support
I2O ( Intelligent Input/Output ) 為一新型態的輸入輸出架構,可以提高系統整體效率。若您無此項裝置就不用選擇。

Networking support
  [ * ] Networking support
    Networking options
  <*> Packet socket
  [ * ] Packet socket: mmapped IO
→ 使用 Packet 傳輸協定可以加快封包傳輸效率。
  <*> Netlink device emulation
→ 這一般是用在無磁碟機網路上。
  <*> Unix domain sockets
許多程式都會用到 socket 這項功能,否則無法正常運作,除非您的作業系統是用來作 embedded ,不然就選起來吧。

  [ * ] TCP/IP networking
→ 這個不用多說,是一定要的啦。
  [ * ] IP: multicasting
  [ * ] IP: advanced router
→ 要想將 linux 作 router 用,就選吧 !
  [ * ] IP: fast network address translation
→ 網路位址轉換,那不就是 nat,當然選啦。
  [ * ] IP: equal cost multipath
→ 多路由的環境可選擇。
  [ * ] IP: use TOS value as routing key
TOS 就是 Type Of Service ,封包的資料頭裡邊會記載著 TOS 值,這樣才曉得此封包需求為何。若此項選起來,就能夠根據不同的 TOS 值來提供不同的路由。

  [ * ] IP: verbose route monitoring
→ 讓核心提供您一些額外的路由訊息。
  [ ] IP: kernel level autoconfiguration
→ 這個與 diskless ( 無磁碟工作站 ) 有關,視您需要作選擇。
  <M> IP: tunneling
一種網路資料傳輸技術,當不同網路段使用不同協定時,就可以透過這種技術來達到資料傳送的目的。如 VPN。

  [ ] IP: ARP daemon support (EXPERIMENTAL)
→ 選起來後,核心所記載的 arp cache 將不會超過 256 筆記錄。
  [ * ] IP: TCP syncookie support (disabled per default)
→ 中斷攻擊支援,可搭配 echo "1"> /proc/sys/net/ipv4/tcp_syncookies 。
    IP: Virtual Server Configuration →
→ 如果您對 cluster 有興趣,可要進去選一下噢。
  <M> DECnet Support
  [ * ] DECnet: SIOCGIFCONF support
  [ ] DECnet: router support (EXPERIMENTAL)
  [ * ] DECnet: use FWMARK value as routing key (EXPERIMENTAL)
  <M> 802.1d Ethernet Bridging
→ 這個選起來可以讓您的 linux 主機作 bridge。
  [ * ] Network packet filtering (replaces ipchains)
    --- Network packet filtering (replaces ipchains)
  [ * ] Bridged IP/ARP packets filtering
    IP: Netfilter Configuration
→ 喜歡玩 NAT 的朋友,可是一定要選的。雖然項目很多,不過還是一個原則,能編模組就編模組。
  <*> Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)
ATM ( 非同步傳輸模式 ) 是在區網及廣域網路裡的高速網路傳輸技術。若您要加入 ATM 網路,則主機需要有 ATM 網卡,否則這裡就不需作選擇。

  <M> LAN Emulation (LANE) support
→ 存在於 ATM 網路中時需使用。
  <M> The IPX protocol
→ 若網路中有 novell 主機,那這個項目就要選。
  <M> Appletalk protocol support
→ 這是網路中有 mac 電腦時需要使用到的協定。
    QoS and/or fair queueing
→ 跟流量控制有關,若您對流量控管有興趣的話,就進去看看。
  [ * ] Network device support
    ARCnet devices
ARCnet ( Attached Resource Computer Network ) 是一種古老的區域網路 (LAN),如果您沒有 ARCnet 網卡,就不必管它。
  <M> Dummy net driver support
→ 若有使用到 SLIP 及 PPP 的話,就選起來。
  <M> Bonding driver support
→ 如果您想合併頻寬,加快效率,那您需要有支援此項目的 switch,沒有的話就不要選。
  <M> EQL (serial line load balancing) support
→ 可以合併 PPP 或 SLIP 的頻寬,但一般需要兩個 modems 及 兩條電話線。
    Ethernet (10 or 100Mbit)
→ 此處為核心所支援的 10 or 100 Mbit 的乙太網路卡,裡面項目很多,就視您需要作選擇囉。
  [ * ] Ethernet (10 or 100Mbit)
  <M> Sun Happy Meal 10/100baseT support
  [ * ] 3COM cards
→ 有使用 3 COM 網卡的話就選起來。
  <M> 3c501 "EtherLink" support
  <M> 3c505 "EtherLink Plus" support
  [ * ] Western Digital/SMC cards
→ 有使用 Western Digital 的網卡可選。
  <M> WD80*3 support
  <M> SMC Ultra32 EISA support
  [ * ] Other ISA cards
→ 如果您還在用 ISA 介面網卡的話,就選起來。
  <M> Cabletron E21xx support
  <M> NE2000/NE1000 support
→ 許多 ISA 網卡都會使用到 NE2000 相容性模組。
  <M> RealTek RTL-8139 PCI Fast Ethernet Adapter support
→ 這個就是當今最普及的螃蟹卡所使用的模組。
  <M> VIA Rhine support
→ D-Link 所使用的模組。
    Ethernet (1000 Mbit)
→ 有使用高速乙太網路卡的話,就進去選一下吧。
    Ethernet (10000 Mbit)
→ 我是跟它無緣啦,不選了。
  [* ] FDDI driver support
→ Fiber Distributed Data Interface 是高速網路 (光纖) 裡的一個資料介面,看來還是無緣。
  <M> PLIP (parallel port) support
→ Parallel Line Internet Protocol 是使用平行埠來連接兩電腦,應該很少人是這樣做的吧 !
  <M> PPP (point-to-point protocol) support
→ 若您使用 adsl 撥接上網的話,可一定要選。
  [ * ] PPP multilink support (EXPERIMENTAL)
  [ * ] PPP filtering
  <M> PPP support for async serial ports
  <M> PPP support for sync tty ports
  <M> PPP Deflate compression
  <M> PPP BSD-Compress compression
  <M> PPP MPPE compression (encryption)
  <M> PPP over Ethernet (EXPERIMENTAL)
  <M> PPP over ATM
  <M> SLIP (serial line) support
→ Serial Line Internet Protocol。如果您還在使用老舊式的數據機撥接的話就選起來。
  [ * ] CSLIP compressed headers
  [ * ] Keepalive and linefill
  [ * ] Six bit SLIP encapsulation
    Wireless LAN (non-hamradio)
→ 有使用無線網路裝置的朋友,可在這裡做做選擇。
    Token Ring devices
→ Token Ring 就是指環狀網路,如不屬於這個網路型態就不用選啦。
  [ * ] Fibre Channel driver support
→ 這又是高速網路 (光纖) 驅動程式的支援。
  <M> Emulex LightPulse IP over FC Support
  <M> Red Creek Hardware VPN (EXPERIMENTAL)
  <M> Traffic Shaper (EXPERIMENTAL)
  <M> Network console logging support (EXPERIMENTAL)
    Wan interfaces
→ 若想用 linux 來做 wan router 可以選
    PCMCIA network device support
→ 若大家跟我一樣沒使用 notebook 的話就不用理會。
    ATM drivers
→ 這裡面的選項,我都用不到。
    Amateur Radio support
→ 這是無線電裝置的支援。
    IrDA (infrared) support
→ 這是對一些紅外線裝置的支援,notebook 上或許用得到。
    Bluetooth support
→ 藍芽無線技術的支援。
  [ * ] Netpoll support for trapping incoming packets
  [ * ] Netpoll traffic trapping

ISDN subsystem
您不是存在於 ISDN 網路中,可不需理會。

Telephony Support
如果您有電話通訊卡,想在 Linux 上面玩 voice-over-ip 就選起來。

Input device support
輸入裝置的支援,比如鍵盤、滑鼠等。裡面的選項能編成模組就編吧 !

Character devices
字元裝置的支援。底下又是一堆選項,還是老話一句,盡量編成模組。

Linux InfraRed Controller
紅外線控制器的支援。

I2C support
I2C ( Inter-IC ) 是由 Philips 所發展的序列匯流排協定 ,主要用在影像設備,如電視,錄影機及電腦螢幕。

Misc devices
滑鼠裝置的支援。

Multimedia devices
支援影像、聲音配接卡。


Graphics support
顯示卡的支援就在這裡做選擇噢 ! 可不要連自己顯示卡的型號都不知啊。

Sound
這當然就是對音效卡的支援啦,好好去選一下吧 ! 不知怎麼選的話就編成模組,以防萬一哪天用得到。

USB support
USB 的支援。目前 2.6 的核心已支援相當多的 USB 型號噢。

File systems → 以下會列出很多核心所支援的檔案系統。

<*> Second extended fs support
ext2 檔案系統的支援。

[ * ] Ext2 extended attributes
[ * ] Ext2 POSIX Access Control Lists
還記得在 /etc/fstab 裡設定的 acl 及 user_xattr 這兩個 options 吧,ext2 就有支援了噢 !

[ * ] Ext2 Security Labels
<M> Ext3 journalling file system support
ext3 日誌式檔案系統的支援。

[ * ] Ext3 extended attributes
[ * ] Ext3 POSIX Access Control Lists
[ * ] Ext3 Security Labels
[ * ] JBD (ext3) debugging support
<M> Reiserfs support
SuSE 預設所使用的 ReiserFS 就在這裡。

[ ] Enable reiserfs debug mode
[ ] Stats in /proc/fs/reiserfs
[ * ] ReiserFS extended attributes
[ * ] ReiserFS POSIX Access Control Lists
[ * ] ReiserFS Security Labels
<M> JFS filesystem support
這是 IBM 的 JFS 檔案系統的支援。

[ * ] JFS POSIX Access Control Lists
[ * ] JFS DMAPI (XDSM) Support
[ ] JFS debugging
[ * ] JFS statistics
<M> XFS filesystem support
這是 SGI 的 XFS 檔案系統的支援。

[ * ] Realtime support (EXPERIMENTAL)
<M> Quota support
想設定 quota 就選起來。


<M> DMAPI support
[ * ] Security Label support
[ * ] POSIX ACL support
[ ] Debugging support (EXPERIMENTAL)
[ ] Tracing support (EXPERIMENTAL)
<*> Minix fs support
<M> ROM file system support
唯讀檔案系統支援,是用於唯讀的儲存裝置上。

[ * ] Quota support
<M> Old quota format support
<M> Quota format v2 support
<M> Kernel automounter support
這是自動掛載遠端檔案系統功能。


<M> Kernel automounter version 4 support (also supports v3)
如果您要使用更新版本的 automounter,則上面那個選項可以不選,而選擇這裡。


CD-ROM/DVD Filesystems

  <*> ISO 9660 CDROM file system support
這是標準 CD-ROM 的檔案系統。
  [ * ] Microsoft Joliet CDROM extensions
Joliet 的檔案格式是以 ISO 9660 為基礎而發展出來的,其支援長檔名及 Unicode。
  [ * ] Transparent decompression extension
  <M> UDF file system support
這是一種使用在 CDROM 及 DVD 上頭的新的檔案系統。

DOS/FAT/NT Filesystems
  <M> DOS FAT fs support
如要支援以 FAT 為基礎的檔案系統 ,就務必選起來。
  <M> MSDOS fs support
支援 MSDOS 的檔案系統,如 FAT、FAT16。
  <M> VFAT (Windows-95) fs support
支援 VFAT 的檔案系統,如 FAT32。
  <M> NTFS file system support
支援 NTFS 的檔案系統。
  [ ] NTFS debugging support
  [ ] NTFS write support

Pseudo filesystems
  [ * ] /proc file system support
這是個虛擬檔案系統,不佔您磁碟空間,而裡邊的系統相關資訊都是核心所提供的。
  [ ] /dev file system support (OBSOLETE)
  [ * ] /dev/pts Extended Attributes
  [ * ] /dev/pts Security Labels
  [ * ] Virtual memory file system support (former shm fs)
這裡是指 tmpfs 檔案系統,它可以把檔案暫時存放在虛擬記憶體之中。

Miscellaneous filesystems

這裡邊的選項看不懂也沒關係,反正都可以編成模組嘛。

Network File Systems
  <*> NFS file system support
要玩 NFS 就一定要選噢。
  [*] Provide NFSv3 client support
第三版的 NFS Client 支援。
  [ ] Provide NFSv4 client support (EXPERIMENTAL)
第四版的 NFS Client 支援。
  <M> NFS server support
要架設 NFS Server 就一定要選。
  [*] Provide NFSv3 server support
第三版的 NFS Server 支援。
  [ ] Provide NFSv4 server support (EXPERIMENTAL)
第四版的 NFS Server 支援。
  <M> SMB file system support (to mount Windows shares etc.)
要玩 SAMBA 就選起來。
  <M> NCP file system support (to mount NetWare volumes)
若您網路中不存在 novell 主機,可不必理會這個設定。
  <M> Coda file system support (advanced network fs)
Coda 是一個進階的網路檔案系統,與 NFS 類似。

Partition Types
  [ * ] Advanced partition selection
  [ * ] PC BIOS (MSDOS partition tables) support
我只選這一個。

Native Language Support
支援不同語系的編碼,反正都可以編成模組嘛,沒差。

Kernel hacking

支援核心除錯選項,這是提供給程式設計師來修改核心的功能。

Cryptographic options

這是核心所支援的加密演算法選項。

---
Load an Alternate Configuration File
載入替代檔,可以將先前設定所做的保留檔案載入。

Save Configuration to an Alternate File

編譯核心時,您可以在任何時候執行這個項目,來將目前所做得設定保留到另一個檔案去。

最後當您全部項目都設定好之後,請回到主畫面,並將按鈕移動到 [Exit]:



然後按下 Enter 鍵後就會看到詢問的訊息:



此時當然選擇 [Yes],這樣就可以把剛剛您所做的設定存放在 /usr/src/linux/.config 內。

其實執行 " make menuconfig " 、" make config " 或 " make xconfig " 的最終目的就是要產生 .config 這個檔案啦。

步驟二:執行 make bzImage

suselinux:/usr/src/linux # make bzImage

開始編譯核心。這個步驟所需時間長短,視您剛剛執行 "make menuconfig" 時將多少選項編入核心而定。如果編譯完成後,結尾未看到 "Error" 字眼而是看到 "Kernel: arch/i386/boot/bzImage is ready" 這類訊息的話,那恭喜您已經成功編譯出一個核心了,此時應可以在 /usr/src/linux/arch/i386/boot 目錄中找到 bzImage 檔案,這就是編譯完成的核心映像檔。

另外還會產生一個 System.map 檔案在這個目錄下,他是每一版核心特有的系統功能檔。

或許您也曾使用 "make zImage" 來編核心,而兩者差別在於當使用 "make zImage" 所產生出來的 kernel image 有一定的大小限制,這樣的限制是為了能在開機時將其成功載入 640K 這個記憶體區段,所以萬一您使用 "make zImage" 所產生的 kernel image 大小
超過限制的話,就考慮要使用 "make bzImage" 了,這樣所產生出來的 kernel image 才能載入到 1MB 外的記憶體區段。

步驟三:執行 make modules

suselinux:/usr/src/linux # make modules

開始編譯模組,通常這個步驟會是花您最多時間的地方,因為我們核心編譯的原則是能編模組就編模組,所以模組數量會非常的多,當然就會花不少時間啦。而所編譯好的模組目的檔會存放在 /usr/src/linux 目錄下的相關子目錄內。

步驟四:執行 make modules_install

suselinux:/usr/src/linux # make modules_install

將模組安裝在 /lib/modules/2.6.5-new 目錄中。而 2.6.5-new 這個目錄名稱就是依 Makefile 檔案中所指定的版本名稱而來的。

步驟五:執行 make install

suselinux:/usr/src/linux # make install

 這個步驟將會自動幫您把 kernel image 及 System.map 複製到 /boot 裡面,也會產生 initrd 檔案噢。如果之前您有對 /boot 做備份的話,現在就可以比較一下在執行 " make install " 之前與之後,/boot 內容的差異:

suselinux:/boot # ls -l vmlinuz-* initrd-* System*
-rw-r--r--  1 root root