請注意,本文主要針對核心 2.4.xx 版本進行說明∼

什麼是核心( Kernel )
我幹嘛要更新核心
核心的版本與何處下載最新核心
開始設定核心的內容
開始編譯囉
安裝核心與 Lilo 多重開機設定
核心模組管理模組編譯, depmod, lsmod, modinfo, modprobe, insmod, rmmod,
本章習題練習

什麼是核心( Kernel )
我幹嘛要更新核心
這個『核心』是除了 BIOS 之外,一個作業系統中最早被啟動的東西,他包含了所有可以讓硬體與軟體工作的資訊,所以,如果沒有搞定核心的話,那麼你的系統肯定會有點小問題!好了,那麼是不是將『所有目前核心有支援的東西都給他編譯進去我的核心中,那就可以支援目前所有的硬體與可執行的工作啦!』,這話說的是沒錯啦,但是你是否曾經看過一個為了怕自己今天出門會口渴、會餓、會冷、會熱、會被車撞、會摔跤、會被性騷擾,而在自己的大包包裡面放了大瓶礦泉水、便當、厚外套、短褲、防撞鋼樑、止滑墊、電擊棒....等一大堆東西,結果卻累死在半路上的案例嗎?當然有!但是很少啦!我相信不太有人會這樣做!(會這麼做的人通常都已經在醫院了∼)取而代之的是會看一下天氣,冷了就只帶外套,熱了就只帶短衣、如果穿的漂亮一點又預計晚點回家就多帶個電擊棒、出遠門到沒有便利商店的地方才多帶礦泉水....說這個幹什麼!對啦!就是要您瞭解到,核心的編譯重點在於『你要你的 Linux 作什麼?』,是啦!如果沒有必要的工作,就乾脆不要加在你的核心當中了!這樣才能讓你的 Linux 跑得更穩、更順暢!這也是為什麼我們要編譯核心的最主要原因了!
 
說到這裡突然想到以前國軍研究的『經國號戰鬥機』事件,在當時,經國號裡頭的配備都是『最棒的!』包括測量儀器、瞄準配備、武器系統等等,但是呢,卻配上一部普普通通的客機用引擎!挖哩ㄌㄟ?最早期試飛的時候,經國號竟然只能『在跑道上滑行!』真是悲哀!同樣的道理, Linux 的核心也是這樣的,如果你的硬體與核心之間沒有辦法達到良好的配合,那麼 Linux 確實可能會跑得不很順暢!!
 
Linux 的核心有幾個主要的特色,除了『Kernel 可以隨時、隨各人喜好而更動』之外,Kernel 的『版本更動次數太頻繁』也是一個特點!所以囉,除非你有特殊需求,否則一次編譯成功就可以啦!不需要隨時保持最新的核心版本,而且也沒有必要(編譯一次核心要粉久的ㄋㄟ!)。話說到這裡又突然想到今天看到的一篇文章,大意是說老闆想要雇用的人會希望是 Linux 的老手,因為他們比較容易瞭解問題的所在,除此之外,如果有任何問題發生,由於其使用 Linux 是可以隨時修補漏洞的!但是如果是 Windows 的話,就得要將機器關閉,直到 MS 推出修補套件後才能再啟用∼
 
那麼是否『我就一定需要在安裝好了 Linux 之後就趕緊給他編譯核心呢?』,老實說,『並不需要的』!這是因為幾乎在每一個 distribution 當中,他們已經預設好了相當大量的模組了,所以幾乎使用者常常或者可能會使用到的資料都已經被編譯成為模組(這個『模組』的意義後面會再解釋),也因此,呵呵!我們使用者確實不太需要重新來編譯核心!尤其是『一般的使用者,由於系統已經將核心編譯的相當的適合一般使用者使用了,因此一般入門的使用者,基本上,不太需要編譯核心』。OK!那麼鳥哥閒閒沒事幹跑來寫個什麼東西?既然都不需要編譯核心還寫編譯核心的分享文章,鳥哥賣弄才學呀!?很抱歉, VBird 雖然是個『不學有術』的混混,卻也不會平白無故的寫東西要您來指教∼當然是有需要才會來編譯核心啦!編譯核心的時機可以歸納為幾大類: 另外,需要注意重新編譯核心雖然可以針對你的硬體作最佳化的步驟(例如剛剛提到的 CPU 的問題!),不過由於這些最佳化的步驟對於整體效能的影響可能還不到百分之五,因此如果是為了增加效能來編譯核心的話,基本上,效益不大!然而,如果是針對『系統穩定性』來考量的話,那麼就有絕對充分的理由來支持您重新編譯核心囉!
 
如果系統已經運行很久了,而且也沒有什麼大問題,加上我又不增加冷門的硬體設備,那麼建議就不需要重新編譯核心了!』,因為重新編譯核心的最主要目的是『想讓系統變的更穩!』既然您的 Linux 主機已經達到這個目的了,何必再編譯核心?不過,就如同前面提到的,由於預設的核心不見得適合您的需要,加上預設的核心可能並無法與您的硬體配備相配合,所以 VBird 通常都是『一安裝完 Linux ,第一個動作(在還沒有進行任何的設定之前,也沒有上網,也沒有更新套件等等,反正就是安裝完畢 Linux ,第一次進入 Shell 時!)立刻就是以最新版本的 kernel 重新編譯一個屬於我這部主機的核心!』以讓我的核心都能夠相當的符合我的硬體配備,讓系統運作的更順暢!
 
然而由於『核心的主要工作是在控制硬體!』所以編譯核心之前,請先瞭解一下您的硬體配備,與您這部主機的未來功能!由於核心是『越簡單越好!』所以只要將這部主機的未來功能給他編進去就好了!其他的就不用去理他啦!

核心的版本與何處下載最新核心
請特別留意!不同版本的核心之間,最好不要互相升級!否則及容易發生問題!例如: Red Hat 6.x 使用的是 2.2.xx 版本的核心,那麼就不要使用 2.4.xx 的核心來編譯他!如果誤用的話,很有可能造成您系統上面的服務無法正常的工作!還請特別留意呢!

開始設定核心的內容
開始編譯囉!
安裝核心與 Lilo 多重開機設定
剛剛上一個步驟就已經將核心安裝好了嗎?很抱歉!非也非也∼我們到前一步驟中,僅是將模組安裝到 /lib/modules/`uname –r` 當中,而核心編譯完成並放在 /usr/src/linux/arch/i386/boot/bzImage 而已!所以,這個時候,請將核心放置在開機核心預設放置的目錄 /boot 吧!
[root @test root]# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.4.18
在一般人的習慣中,我們還是比較喜歡將開機的核心稱做為 vmlinuz ,而由於版本不同,所以我們可以將他取名為 vmlinuz-2.4.18 這樣的檔案名稱,比較好進行確認啦!
 
核心搬移完畢之後就 OK 了嗎?當然不對囉!還記得在開機流程裡面介紹的 Linux 的開機管理員嗎?沒錯,那就是 lilo 跟 grub 囉,所以,接著下來我們要作的就是開機的設定囉?由於 lilo 與 grub 我們之前就提過了,所以這裡不詳細的介紹每個物件的內容,僅說明一下我的測試核心的規劃!通常,我都喜歡直接以硬碟開機來測試新的核心,而由於害怕新的核心沒有辦法工作 ( 註:很多時候,由於不同的 distribution 他所考慮的內容不一樣,因此,很有可能您編譯完成的核心並無法在您的 Linux distribution 上面工作的,所以,雖然他可以被編譯成功,但是我們還是得測試測試他呢! ) 因此,我都會將舊的核心繼續留下來,因為如果萬一新核心沒有辦法工作,那麼最起碼我還可以使用舊的核心繼續來管理我的 Linux 呢!這個時候就必需要有多重開機系統啦!

核心模組管理:
還記得核心的功能嗎?對啦!就是用來控制系統硬體與相關程序的東西啦!那麼在上面提到的功能裡面,我們也提到了核心可以使用『模組』的方式來動態的載入與移除所需要的模組,OK!那麼該如何載入與卸載這些模組呢?!要知道的是,在模組的載入方面,最主要的開機時即載入模組的檔案在於:
/etc/modules.conf
這個檔案,如果你有任何的新的驅動程式需要在開機的時候載入,呵呵!寫入這個檔案就對了!而核心的驅動程式寫在哪裡?呵呵!就是在底下的目錄中:
/lib/modules/核心版本/kernel/drivers (也可以寫成如下)
/lib/modules/`uname –r`/kernel/drivers
上面這兩行是一模一樣的東西,什麼?怎麼看出來的?別多說廢話了,如果忘記的話,使用 uname –r 看一下內容,再去看一下 quote 是什麼!趕緊回想一下喔!好了,那麼 /etc/modules.conf 的內容是怎樣呢?我們舉最簡單的例子好了,假設你的網路卡是早期有『惡魔卡』稱號的 D-Link 530 好了,那麼這個卡的模組其實已經被 Linux 編譯好了,他就是 via-rhine.o 這個檔案,我們又知道說網路卡的第一個代號為 eth0 ,所以呢,要讓 eth0 與 via-rhine 劃上等號( 註:那個 .o 不要寫出來! ),因此,在 /etc/modules.conf 的最後一行加入底下的文字:
alias eth0 via-rhine
如果一切順利的話,那麼開機的時候他就會自動的幫我們找到相對應的硬體與模組囉!但是如果 Linux 沒有幫我們編譯好模組呢?怎麼編譯?就使用 make 呀!請回到 RPM 與 Tarball 那一章去閱讀一下 tarball 的安裝方式!再來,如果我需要的是手動隨時加入與取消某些模組呢?呵呵,這個時候也就需要來瞭解一下模組的載入與卸載的功能囉!

本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )

2002/05/29:第一次完成
2003/02/11:重新編排與加入 FAQ