本文已不再維護,更新文章請參考此處
我們在前面的幾個章節介紹了 Linux 其實指的就是核心而已,而整個 Linux 的世界當中, 最重要的也就是核心了!他控制了您的伺服器的所有硬體,也控制了所有的您想要的功能, 例如軟體磁碟陣列(RAID)、各種介面卡的驅動模組、防火牆的新增功能等等。透過管理您的 Linux 核心,將可讓您的伺服器跑得更加的順暢,也更穩定您的伺服器所提供的相關服務呢! 此外,為了讓硬體驅動程式與相關的核心功能修訂容易,所以 Linux 核心是支援『模組化』的,也就是說,您核心所想要的功能可以『後來才加掛上去』喔! 那麼如何加掛上去呢?這就需要瞭解一下所謂的『模組』了!當然,連同模組的相關指令就得也要會用囉!^_^

1. 前言:
  1.1 什麼是核心( Kernel )
  1.2 我幹嘛要更新核心
  1.3 核心的版本與何處下載最新核心
2. 核心原始碼的取得與升級:
  2.1 取得原本的 distributions 提供的 kernel source
  2.2 取得最新的核心
  2.3 保留原本設定:利用 patch 升級核心原始碼
  2.4 核心目錄下的次目錄資訊
3. 設定核心的編譯設定 (Makefile)
  3.1 如何編輯核心的 Makefile
  3.2 核心的內容與模組設定:
    a. CPU 的類型選擇雙 CPU 的選擇項目, 高記憶體支援
    b. 電源管理CPU 自動降頻功能選項
    c. PCI 匯流排與 PCI Express 支援
    d. 核心的網路功能IPv4, IPv6, 防火牆功能, 特殊網路功能
    e. 硬體驅動程式主機 IDE 晶片選擇, SCSI 支援, SATA 支援, RAID 與 LVM 支援,
      網路卡支援, 撥接必須之 PPP, AGP 顯示卡晶片組, 顯示卡晶片組, USB 晶片組
    f. 檔案系統(filesystem)EXT2/EXT3, Quota, MSDOS/NTFS, NFS/Samba...
4. 核心的編譯與安裝
  4.1 編譯的流程
  4.2 模組安裝時的注意事項:
  4.3 安裝舊版與新版的核心成多重開機系統
5. 額外(單一)模組編譯:
  5.1 單一模組編譯: depmod
  5.2 核心模組管理: lsmod, modinfo, modprobe, insmod, rmmod...
6. 本章習題練習:
7. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23899

前言:
我們在第一章 Linux 是什麼裡面就談過 Linux 其實指的是核心! 這個『核心 (kernel)』是整個作業系統的最底層,他負責了整個硬體的驅動, 以及各個核心工具的提供,包括防火牆機制、是否支援 LVM 或 Quota 等檔案系統等等, 這些都是核心所負責與提供的!也就因為如此,所以開機過程當中,除了 MBR 之外, 第一個讀入系統記憶體當中的,就是核心檔案。

如果你還記得開機流程裡面提到的相關資訊的話, 那麼就知道,基本上,核心就是用來控制您的硬體系統的,您想要硬體幫您達成的任何工作, 都得要透過『核心』來幫您達成啊!換句話說,如果您的『核心』並沒有支援您的某項硬體設備, 也就是核心無法『認識』您的某項硬體,呵呵!那麼該硬體也就無法在這樣的核心底下工作了!


什麼是核心( Kernel )
這已經是整個 Linux 基礎的最後一篇了,所以,底下這些資料您應該都要『很有概念』才行∼ 不能只是『好像有印象』∼∼好了,那就複習一下幾個名詞吧!

  • Kernel:
  • 還記得我們在前面的 BASH shell 部分提到過:電腦真正在工作的東西其實是『硬體』, 例如數值運算要使用到 CPU、資料儲存要使用到硬碟、圖形顯示會用到顯示卡、 音樂發聲要有音效晶片、連接 Internet 可能需要網路卡等等。那麼如何控制這些硬體呢? 那就是核心的工作了!也就是說,你所希望電腦幫你達成的各項工作, 都需要透過『核心』的幫助才行! 當然囉,如果你想要達成的工作是核心所沒有提供的, 那麼你自然就沒有辦法透過核心來控制電腦使他工作囉!

    舉例來說,如果你想要有某個網路功能 ( 例如核心防火牆機制 ) , 但是你的核心偏偏忘記加進去這項功能,那麼不論你如何『賣力』的設定該網路套件,很抱歉! 不來電?換句話說,你想要讓電腦進行的工作,都必須要『核心有支援』才可以 !!這個標準不論在 Windows 或 Linux 這幾個作業系統上都相同! 如果有一個人開發出來一個『全新的硬體』,目前的核心不論 Windows 或 Linux 都不支援,呵呵!那麼不論你用什麼系統,哈哈! 這個硬體都是英雄無用武之地啦!那麼是否瞭解了『核心』的重要了呢?沒錯! 所以我們才需要來瞭解一下如何編譯我們的核心啦!

    那麼核心到底是什麼啊?講了這麼多??其實核心就是系統上面的一個檔案而已, 這個檔案包含了驅動主機各項硬體的偵測程式與驅動模組,在 開機流程分析 章節當中,我們也提到這個檔案被讀入主記憶體的時機是:
    1. BIOS
    2. MBR 載入 Loader ( Linux 中的 Lilo 或 Grub 或 SPFdisk等等 )
    3. 藉由 Loader 的輔助,載入核心檔案到主記憶體當中,此時核心檔案解壓縮後, 會開始偵測硬體的各項配備,並載入適當的驅動模組來讓硬體生效;
    4. 在硬體準備妥當後,載入第一支程式 init ,並藉由 /etc/inittab 的設定來確認預設 run level;
    5. 經由 /etc/inittab 及 run level 來決定執行的各項啟動的 scripts ;
    6. 開始執行 login 或 X Window 等待登入等。
    看到了嗎?第三個步驟時,我們的系統就可以經由 loader 來將核心載入主記憶體當中, 並且開始偵測分析硬體,載入適當的驅動程式,整個主機就可以待命,讓使用者來執行相關的程式了。 這個核心檔案通常被放置成 /boot/vmlinuz ,不過也不見得, 因為一部主機上面可以擁有多個核心檔案,只是開機的時候僅能選擇一個來載入而已。 甚至我們也可以在一個 distribution 上面放置多個核心,然後以這些核心來做成多重開機呢!

  • 核心模組:
  • 還記得我們之前談到開機流程分析時,提到的核心模組吧? 既然核心檔案都已經包含了硬體偵測與驅動模組,那麼什麼是核心模組啊? 要注意的是,現在的硬體更新速度太快了,如果我的核心比較舊, 但我換了新的硬體,那麼,這個核心肯定無法支援!怎麼辦?重新拿一個新的核心來處理嗎? 開玩笑∼核心的編譯過程可是很麻煩的∼

    所以囉,為了這個緣故,我們的 Linux 很早之前就已經開始使用所謂的模組化設定了! 亦即是將一些不常用的類似驅動程式的咚咚獨立出核心,編譯成為模組, 然後,核心可以在運作的過程當中載入這個模組到核心的支援當中。 如此一來,我在不需要更動核心的前提之下,只要編譯出適當的驅動模組,並且載入他, 呵呵!我的 Linux 就可以使用這個硬體啦!簡單又方便!!

    那我的模組放在哪裡啊??可惡!當然一定要知道的啦!就是 /lib/modules/`uname -r`/ 當中啦!

  • 核心編譯:
  • 剛剛上面談到的核心其實是一個檔案,那麼這個檔案怎麼來的?呵呵∼ 當然是透過原始碼 (source code) 編譯而成的啊!因為核心是直接被讀入到主記憶體當中的, 所以當然要將他編譯成為系統可以認識的資料才行!也就是說, 我們必須要取得核心的原始碼,然後利用 Source code 與 Tarball 章節當中提到的編譯概念來達成核心的編譯才行啊!(這也是本章的重點啊! ^_^)

  • 關於驅動程式與核心的問題
  • 既然核心與硬體是息息相關的,那麼是否意味著每次有廠商推出新版本的硬體時, 我們都需要『重新編譯核心』啊?好加在!並不需要的喔!因為我們 Linux 的核心相當的具有彈性,他是支援模組化的,也就是說,只要新硬體可以推出搭配核心的驅動模組( 也就是大家口頭上常常講的『驅動程式』 ),那麼我們只要將該模組掛載入核心,核心就可以支援該硬體啦!

    但是,很多朋友還是常常感到困惑,就是 Linux 上面針對最新硬體的驅動程式總是慢了幾個腳步, 所以覺得好像 Linux 的支援度不足!其實不可以這麼說的,為什麼呢?因為在 Windows 上面,對於最新硬體的驅動程式需求,基本上, 也都是廠商提供的驅動程式才能讓該硬體工作的,因此,在這個『驅動程式開發』的工作上面來說, 應該是屬於硬體發展廠商的問題,因為他要我們買他的硬體, 自然就要提供消費者能夠使用的驅動程式啦!所以,如果大家想要讓某個硬體能夠在 Linux 上面跑的話,那麼似乎可以發起一人一信的方式,強烈要求硬體開發商發展 Linux 上面的驅動程式!這樣一來,也可以促進 Linux 的發展呢!


    我幹嘛要更新核心
    這個『核心』是除了 BIOS 之外,一個作業系統中最早被啟動的東西, 他包含了所有可以讓硬體與軟體工作的資訊,所以,如果沒有搞定核心的話, 那麼你的系統肯定會有點小問題!好了,那麼是不是將『 所有目前核心有支援的東西都給他編譯進去我的核心中, 那就可以支援目前所有的硬體與可執行的工作啦!』!

    這話說的是沒錯啦,但是你是否曾經看過一個為了怕自己今天出門會口渴、會餓、會冷、會熱、會被車撞、 會摔跤、會被性騷擾,而在自己的大包包裡面放了大瓶礦泉水、便當、厚外套、短褲、防撞鋼樑、止滑墊、 電擊棒....等一大堆東西,結果卻累死在半路上的案例嗎?當然有!但是很少啦!我相信不太有人會這樣做! ( 會這麼做的人通常都已經在醫院了∼ ) 取而代之的是會看一下天氣,冷了就只帶外套, 熱了就只帶短衣、如果穿的漂亮一點又預計晚點回家就多帶個電擊棒、 出遠門到沒有便利商店的地方才多帶礦泉水....

    說這個幹什麼!對啦!就是要您瞭解到,核心的編譯重點在於『你要你的 Linux 作什麼?』,是啦!如果沒有必要的工作,就乾脆不要加在你的核心當中了!這樣才能讓你的 Linux 跑得更穩、更順暢!這也是為什麼我們要編譯核心的最主要原因了!
    說到這裡突然想到以前國軍研究的『經國號戰鬥機』事件,在當時, 經國號裡頭的配備都是『最棒的!』包括測量儀器、瞄準配備、武器系統等等,但是呢, 卻配上一部普普通通的客機用引擎!挖哩ㄌㄟ?最早期試飛的時候, 經國號竟然只能『在跑道上滑行!』真是悲哀!同樣的道理, Linux 的核心也是這樣的,如果你的硬體與核心之間沒有辦法達到良好的配合,那麼 Linux 確實可能會跑得不很順暢!! Linux 的核心有幾個主要的特色,除了『Kernel 可以隨時、隨各人喜好而更動』之外,Kernel 的『版本更動次數太頻繁』也是一個特點!所以囉,除非你有特殊需求, 否則一次編譯成功就可以啦!不需要隨時保持最新的核心版本,而且也沒有必要 ( 編譯一次核心要粉久的ㄋㄟ! ) 。話說到這裡又突然想到今天看到的一篇文章,大意是說老闆想要雇用的人會希望是 Linux 的老手,因為他們比較容易瞭解問題的所在,除此之外,如果有任何問題發生,由於其使用 Linux 是可以隨時修補漏洞的!但是如果是 Windows 的話,就得要將機器關閉,直到 MS 推出修補套件後才能再啟用∼

    那麼是否『我就一定需要在安裝好了 Linux 之後就趕緊給他編譯核心呢?』, 老實說,『並不需要的』!這是因為幾乎在每一個 distribution 當中,他們已經預設好了相當大量的模組了, 所以幾乎使用者常常或者可能會使用到的資料都已經被編譯成為模組,也因此,呵呵! 我們使用者確實不太需要重新來編譯核心!尤其是『一般的使用者, 由於系統已經將核心編譯的相當的適合一般使用者使用了,因此一般入門的使用者,基本上, 不太需要編譯核心』。

    OK!那麼鳥哥閒閒沒事幹跑來寫個什麼東西?既然都不需要編譯核心還寫編譯核心的分享文章, 鳥哥賣弄才學呀!?很抱歉,鳥哥雖然是個『不學有術』的混混,卻也不會平白無故的寫東西要您來指教∼ 當然是有需要才會來編譯核心啦!編譯核心的時機可以歸納為幾大類: 另外,需要注意重新編譯核心雖然可以針對你的硬體作最佳化的步驟 ( 例如剛剛提到的 CPU 的問題! ) ,不過由於這些最佳化的步驟對於整體效能的影響是很小很小的, 因此如果是為了增加效能來編譯核心的話,基本上,效益不大!然而,如果是針對『系統穩定性』來考量的話, 那麼就有充分的理由來支持您重新編譯核心囉!

    如果系統已經運行很久了,而且也沒有什麼大問題, 加上我又不增加冷門的硬體設備,那麼建議就不需要重新編譯核心了!』, 因為重新編譯核心的最主要目的是『想讓系統變的更穩!』既然您的 Linux 主機已經達到這個目的了,何必再編譯核心?不過,就如同前面提到的, 由於預設的核心不見得適合您的需要,加上預設的核心可能並無法與您的硬體配備相配合, 此時才開始考慮重新編譯核心吧!
    早期鳥哥是強調最好重新編譯核心的一群啦!不過,最近這個想法改變了∼ 既然原本的 distribution 都已經幫我們考慮好如何使用核心了,那麼, 我們也不需要再重新的編譯核心啦!尤其是 distribution 都會主動的釋出新版的核心 RPM 版本, 所以,實在不需要自己重新編譯的!當然啦,如同前面提到的, 如果您有特殊需求的話,那就另當別論嚕! ^_^ 然而由於『核心的主要工作是在控制硬體!』所以編譯核心之前, 請先瞭解一下您的硬體配備,與您這部主機的未來功能!由於核心是『 越簡單越好!』所以只要將這部主機的未來功能給他編進去就好了! 其他的就不用去理他啦!


    核心的版本與何處下載最新核心
    既然這一章的內容要討論的是如何編譯核心,那麼我們就來聊一聊核心的版本吧!

  • 核心的版本:
  • 由於不同的核心版本之間,使用的函式庫並不相同,所以,我們必須要知道自己的 Linux 核心版本之後,才能夠取用最新支援的核心版本來編譯新的核心啊!那麼要在哪裡找到這個核心的資訊呢? 應該還記得那個 uname 查看的資訊吧!沒錯!就是他了,可以使用其功能來查詢目前在工作的核心版本:
    [root@linux ~]# uname -r
    2.6.13-1.1532_FC4
    # 因為鳥哥的 FC4 已經升級核心多次,所以這個版本應該與你的不同!
    
    看到了吧!那個東西就是核心版本的資訊啦!好了!我們依照 RPM 版本的先例,也來談一談 kernel 的版本吧!基本上, kernel 的版本可以區分為:
      [主版本].[次版本].[釋出版本(release)]-[修改版本]
    整個版本的定義當中,最需要注意的是前兩個,亦即主版本與次版本。 相同的[主][次]版本,代表他使用的函式庫是差不多的,所以,可以直接升級到較高的[釋出版本]上。 值得注意的是,由於核心功能的增加速度實在太快了,一般商業用戶與一般使用者, 根本不需要很多的測試中的功能,因此,[主][次]版本中,依據[次版本]的奇偶數, 又分為底下兩種版本:
    • 如果[次版本]是奇數的話,例如 2.3, 2.5 等等,那表示他是一個『 測試性質功能的核心版本 』, 這種核心通常是在推出穩定版本的核心之前,用來給 developer ( 核心維護更新測試者!) 測試用的!雖然功能較為強大,但是由於是屬於測試性質,所以可能會有些許的 bugs 也說不定;

    • 如果[次版本]是偶數的話,例如 2.4, 2.6 等等,那表示他是一個經過測試之後才釋出的 『穩定核心版本,這種核心較為穩定不容易出錯, 比較適合一般個人或者是商業使用!
    所以啦!我們要升級的時候,大多就是使用那種偶數的核心版本啦!不過這裡還是要再提一遍!就是『 2.4 與 2.6 是兩個具有相當大差異的核心版本, 兩者之間使用到的函式庫基本上已經不相同了,所以在升級之前,如果您的核心原本是 2.4.xx 版,那麼就升級到 2.4.xx 版本的最新版,不要由 2.4.xx 直接升級到 2.6.xx 版,否則到時可能會欲哭無淚∼∼』, 這個問題在討論區一再地被提起!這裡再次說明!
    為什麼不能從 2.4 升級到 2.6 呢?其實還是可以啦!只是過程很複雜! 我們知道軟體 (packages) 是架構在系統核心上面來進行編譯、安裝與執行的, 也就是說,這些 packages 與核心之間,是有相關性的!這些 packages 會用到很多核心提供的功能。 但是不同的[主][次]版本之間,他們提供的功能架構差異太大,因此,若你由 2.4 升級到 2.6 的話, 那麼絕大部分的軟體『都需要重新再編譯!』這樣瞭解為何不要在不同的版本間升級了吧? 此外,2.4.xx 與 2.6.xx 的比較中,並不是 2.6.xx 就一定比 2.4.xx 還要新,因為這兩種版本同時在進行維護與升級的工作!如果有興趣的話,可以前往 Linux 核心網站 http://www.kernel.org 一看究竟,您就可以瞭解目前的核心變動情況了!

    基本上,目前最新的 distributions ,包括 FC, SuSE, Mandriva 等等,都使用 2.6 的核心, 所以,您可以直接由 http://www.kernel.org 下載最新的 2.6.xx 版本的核心來嘗試編譯啊!目前 (2005/11/20) 鳥哥可以查到的最新版本是 2.6.14-2 , 底下我們將主要以這個版本來測試。另外,由於較新的核心版本可能會多出一些選項, 因此若有不同的項目也沒有關係!稍微查看一下說明內容就可以瞭解啦!

    例題:什麼是『釋出版本』?
    答:
      由於核心的新功能增加太快,為了要統合這些功能,因此,每隔一段時間的穩定性測試後, 這些新功能才會被放到原本的核心內,最後被推出。而為了與前一個核心原始碼作區別, 所以就被加上一個數字較高的『釋出版本』數字了。
    例題:那什麼是『修改版本』?
    答:
      由於原本的核心原始碼可能有點 bugs 在裡面,經過程式開發人員的程式碼修改後 (debug), 再重新推出的一個類似加強版的意思。基本功能是不變的,只是有問題的地方被克服而已。

  • 核心下載地點:
  • Linux 的核心目前是由其發明者 Linus Torvalds 所屬團隊在負責維護的, 而其網站在底下的站址上,在該網站上可以找到最新的 kernel 資訊!不過,美中不足的是目前的核心越來越大了 ( linux-2.6.14.2.tar.bz2 這一版,這一個檔案大約 37MB 了! ),所以如果你的 ISP 連外很慢的話, 那麼使用台灣的映射站台來下載不失為一個好方法:

    核心原始碼的取得與升級
    既然核心是個檔案,要製作這個檔案給系統使用則需要編譯,既然要有編譯,當然就得要有原始碼啊! 那麼原始碼怎麼來?除了剛剛前一個小節提到的,需要注意核心的版本之外,還有哪些要注意的事項??


    取得原本的 distributions 提供的 kernel source
    事實上,各大主要 distributions 在推出他們的產品時,其實已經都附上了核心原始碼了! 以我們的 FC4 為例,你如果有安裝工具程式的話,那麼應該就可以利用 rpm 找到套件名稱為 kernel-devel 的套件,那就是我們的核心原始碼了(這個套件名稱在各個不同的版本上頭都不一樣! 所以,您應該要使用 rpm -qa | grep kernel 來尋找喔!)。如果還是找不到,那表示你沒有安裝啊! 此時,拿出原版光碟,一片一片去 mount 且搜尋一下,肯定可以找到的啦! 然後安裝他就好了!

    既然要重新編譯,那麼幹嘛還要使用原本 distributions 釋出的原始碼啊?真沒創意∼ 話不是這麼說,因為原本的 distribution 釋出的原始碼當中,含有他們設定好的預設設定值, 所以,我們可以輕易的就瞭解到當初他們是如何選擇與核心及模組有關的各項設定項目的參數值, 那麼就可以利用這些可以配合我們 Linux 系統的預設參數來加以修改,如此一來, 我們就可以『修改核心,調整到自己喜歡的樣子』囉!而且編譯的難度也會比較低一點!


    取得最新的核心
    雖然使用原本的 source code 來重新編譯核心比較方便,但是,如此一來, 新硬體所需要的新驅動程式,也就無法藉由原本的核心原始碼來編譯啊! 所以囉,如果是站在要更新驅動程式的立場來看,當然使用最新的核心會比較好啊!

    取得最新的核心版本,上一個小節已經講過了,請自行前往 http://www.kernel.org 去下載吧!


    保留原本設定:利用 patch 升級核心原始碼
    如果你曾經自行以最新的核心版本來編譯過核心,那麼你的系統當中應該已經存在前幾個版本的核心原始碼, 以及上次你自行編譯的參數設定值才對。如果您只是想要更新到最新版本的核心, 原本的參數設定值並不要進行大幅度的修改,那麼該如何是好?

    呵呵!每一次核心釋出時,除了釋出完整的核心壓縮檔之外,也會釋出『該版本與前一版本的差異性 patch 檔案』, 關於 patch 的製作我們已經在 原始碼與 tarball 章節當中提及, 您可以自行前往參考。這裡僅是要提供給您的是,每個核心的 patch 僅有針對前一版的核心來分析而已, 所以,萬一你想要由 2.6.10 升級到 2.6.14 的話,那麼你就得要下載 2.6.11, 2.6.12, 2.6.13 及 2.6.14 的 patch file ,然後『依次』一個一個的去進行 patch , 才能夠升級到 2.6.14 喔!這個重要!不要忘記了。

    在進行完 patch 之後,你可以直接檢查一下原本的設定值,如果沒有問題, 就可以直接編譯,而不需要再重新的選擇核心的參數值,這也是一個省時間的方法啊! 至於 patch file 的下載,同樣是在 kernel 的相同目錄下,尋找檔名是 patch 開頭的就是了。


    核心目錄下的次目錄資訊
    假設你已經有安裝了核心的原始碼,以 FC4 為例,他的預設核心原始碼放置在 /usr/src/kernels/2.6.11-1.1369_FC4-i686/ 這個目錄下,在該目錄下,基本上有這幾個目錄:
    arch	:與硬體平台有關的項目,例如 CPU 的等級等等;
    crypto	:核心所支援的加密的技術,例如 md5 或者是 des 等等;
    drivers	:一些硬體的驅動程式,例如顯示卡、網路卡、PCI 相關硬體等等;
    fs	:核心所支援的 filesystems ,例如 vfat, reiserfs, nfs 等等;
    lib	:一些函式庫;
    net	:與網路有關的各項協定資料,還有防火牆模組 (net/ipv4/netfilter/*) 等等;
    sound	:與音效有關的各項模組;
    
    每個目錄底下也都含有很多不同的次目錄,例如 drivers 目錄下就含有 net, sound, usb, pci, vedio... 等等多到數不清的次目錄,這些目錄底下還是含有相關的硬體驅動模組等等∼呵呵∼想要完整的瞭解是很難的啦! 例如,核心使如何讓工作排到 CPU 去執行的?核心是如何存取實體記憶體與 Swap ? 核心是如何讀取各不同的 filesystems 等等,如果有興趣的話, 那麼最新核心檔案解壓縮之後,都會有個 Documentation 的目錄, 可以進去查閱各個相關的說明啊! ^_^


    設定核心的編譯設定 (Makefile)
    就如同我們在原始碼與 tarball 的章節當中提到的, 由於各個主機硬體都不相同,所以當然需要針對我們的主機環境來選擇可以編譯的項目啦!那就是 Makefile 的編輯。但是核心的資料實在多到不行∼所以,核心有提供不少的工具來讓我們簡單的進行參數的設定喔!


    如何編輯核心的 Makefile
    在這一章當中,鳥哥假設你是以 http://www.kernel.org 這個核心官方網站下載最新的核心版本來編譯的, 鳥哥下載的是 2.6.14-2 版,下載的完整網址在: 如果你是以 FC4 系統預設的核心原始碼來重新編譯, 那麼請自行安裝 kernel-devel 這個套件,以及前往 /usr/src/kernels/ 目錄下, 找到核心原始碼;如果您之前已經以下載的核心檔案編譯過核心, 那麼請依序下載各 patch 檔案,然後請自行參考 patch 的用法以及找到相關的路徑吧!反正,這一章當中,我假設您與我一樣, 使用的是最新版的核心就是了。

    假設你下載之後將整個檔案放置到 /root 內,那麼首先請解壓縮吧!
    [root@linux ~]# cd /usr/src
    [root@linux src]# tar -jxvf /root/linux-2.6.14.2.tar.bz2
    # 這個時候就會產生一個 /usr/src/linux-2.6.14.2 的目錄,該目錄就是 source code。
    # 不過,這個目錄下有個 README 的檔案務必參考,此外,
    # 還有個 Documentation 的目錄,也可以仔細的看一看喔!
    
    [root@linux src]# cd linux-2.6.14.2
    [root@linux linux-2.6.14.2]# make mrproper
    # 這個過程在刪除一些以前留下來的 .o 檔案。
    
    特別留意一下,核心的原始碼最好不要直接放置到 /usr/src/linux 這個目錄, 這是因為該目錄是很多的軟體讀取核心功能的目錄,如果你將這個新核心放置到 /usr/src/linux 下時, 可能會讓某些軟體讀到錯誤的核心檔案。因此,您才可能看到目前的核心原始碼都放到 /usr/src/kernels/ 目錄下 (FC4 的預設放置目錄)。 所以,我們新的核心主要建議您還是放置到 /usr/src/ 目錄下, 但是目錄名稱保持 linux-2.6.14.2 即可,不必更名為 linux 囉!這點重要!

    另外,在進行核心的參數設定之前,務必要執行『 make mrproper 』這個項目, 還記得原始碼的編譯過程吧?編譯過程會有 *.o 的目標檔案對吧! 那這些 *.o 必須要先刪除啊!否則可能會產生舊的資料啊!這個要注意。

    另外,其實我們也知道,整個原始碼的編譯過程當中,那個 Makefile 佔有舉足輕重的地位的! 這是因為我們的 make 取用的參數資料都是記錄在 Makefile 檔案當中啊! 所以囉,你必須要確定你的系統已經安裝了 make, gcc 等等的編譯套件, 否則是無法進行編譯的。此外,核心的 Makefile 沒有辦法像一些軟體一樣, 簡單的使用 ./configure 就能夠自動的偵測主機。這是因為每個人對於核心的要求都不一樣嘛! 好了,那麼如何建立 Makefile 啊?難道要手動去編輯??當然不是啦! 我們可以透過核心提供的功能,就是那個 make menuconfig 來達成喔! 還有一些早期的編譯流程,不過不好用,所以鳥哥就不介紹了。我這裡推薦您使用 make menuconfig 來進行核心參數的挑選。這是因為很多的伺服器本來就可能沒有 X Window , 加上 make menuconfig 也可以作類似圖形化介面的選單模式,可以隨時作參數的選擇, 方便又好用! ^_^。只要在 /usr/src/linux-2.6.14.2 目錄下,輸入『make menuconfig』 就可以出現如下的畫面喔!

    核心編譯工作前的參數挑選
    圖、核心編譯工作前的參數挑選

    看到上面的圖是之後,你會發現主要分為兩大畫面,一個是大框框內的反白光柱,另一個則是底下的小框框, 裡面有 select, exit 與 help 三個選項的內容。這幾個元件的用法如下: 基本上建議只要『上下左右 空白 及 Enter 』這六個按鍵就好了!不要使用 Esc ,否則一不小心就有可能按錯的!另外,關於整個核心的內容選擇上面,建議您可以這樣思考: 總之,盡量保持核心小而美,剩下的,就編譯成為模組,尤其是『需要考慮到未來擴充性』, 像鳥哥之前認為螃蟹卡就夠我用的了,結果,後來竟然網站流量大增,鳥哥只好改換 3Com 的網路卡。 不過,我的核心卻沒有相關的模組可以使用∼因為.....鳥哥自己編譯的核心忘記加入這個模組了。 最後,只好重新編譯一次核心的模組,呵呵!真是慘痛的教訓啊!


    核心的內容與模組設定
    由上面的圖示當中,我們知道核心的可以選擇的項目有很多啊! 光是第一面,就有 17 個項目,每個項目內還有不同的細項!哇!真是很麻煩啊∼ 而每個項目其實都可能有 <Help> 的說明,所以,如果看到不懂的項目, 務必要使用 Help 查閱查閱!好了,底下我們就一個一個項目來看看如何選擇吧!


  • Code maturity level options(核心的 code 開發維護)
  • 這個項目主要在設計您的核心是否要支援一些尚未測試的很完整功能。 一般來說,我們是一般用戶,不是 kernel 的開發維護者,所以,當然不需要額外的功能啦! 所以,鳥哥這裡的選擇是比較保守的 (不使用額外功能),也因為如此, 所以底下的很多項目當中,可能不會出現一些較為特殊的選項喔!這個要注意! 鳥哥的選擇如下:
    [ ] Prompt for development and/or incomplete code/drivers
    # 這個可選可不選∼不過,鳥哥這裡是不選擇的啦!
    

  • General setup
  • 這個項目則是關於核心的一般設定,包括核心的附加版本資訊等等,都可以在這裡設定。
    ()  Local version - append to kernel release
    [ ] Automatically append version information to the version string (NEW)
    	# 上面這兩個都與核心的附加版本有關。例如 FC4 的核心版本為
    	# 2.6.14-1.1637_FC4 ,後面那個 1.1637_FC4 就是那個附加版本啦!
    [*] Support for paging of anonymous memory (swap)
    	# 這個與 swap 的使用有關!當然要選擇啦
    [*] System V IPC
    	# IPC 是 Inter Process Communication 的簡寫,這個與一個 programs
    	# 可以被多人同時啟用有關,所以務必要選擇才行!
    [*] BSD Process Accounting
    [ ]   BSD Process Accounting version 3 file format
    [*] Sysctl support
    	# 這個就是在產生 /proc/sys 的支援!務必選擇!
    [*] Auditing support
    [*]   Enable system-call auditing support
    	# 上面這兩個是額外核心功能 (如 SELinux) 載入時所需要的設定!務必選擇
    --- Support for hot-pluggable devices
    [*] Kernel Userspace Events
    	# 讓核心能夠監聽使用者的動作。舉例來說, USB 裝置的連線與否等等的即時裝置。
    [ ] Kernel .config support
    ()  Initramfs source file(s)
    [ ] Configure standard kernel features (for small systems)  --->
    
    這裡的項目主要都是針對核心與程式之間的相關性來設計的,基本上, 保留預設值即可!除非您想要編輯屬於自己的附加版本,那麼在上表的第一項按下 Enter 後, 就可以輸入一些資訊了。不要隨便取消上面的任何一個項目, 可能會造成某些程式無法被同時執行的困境喔!


  • Loadable module support
  • 還記得我們上頭曾經提過模組這個玩意兒吧!如果你要核心能夠支援模組即時載入某些核心功能的話, 那麼這裡面的設定就顯的很重要了!因為他涉及是否支援模組載入啊!
    [*] Enable loadable module support
    [*]   Module unloading
    [*]   Source checksum for all modules
    [*]   Automatic kernel module loading
    
    不用想太多,全部都選擇吧!


  • Processor type and features
  • 這個就與您的 CPU 有關啦!我的主機裝備的是 P-III 的 CPU ,所以就選擇相關的即可。 你要依據你自己的主機來設計喔!不要胡亂選擇啊!
    Subarchitecture Type (PC-compatible)  --->
    	(X) PC-compatible    <==這裡是次目錄
    	( ) AMD Elan
    	( ) Voyager (NCR)
    	( ) NUMAQ (IBM/Sequent)
    	( ) SGI 320/540 (Visual Workstation)
    	# 這裡在選擇主機的硬體類型。我們使用 PC 相容的主機啊!選這個就對了。
    
    Processor family (Pentium-III/Celeron(Coppermine)/Pentium-III Xeon)  --->
    	( ) 386         <==這裡是次目錄
    	( ) 486
    	( ) 586/K5/5x86/6x86/6x86MX
    	( ) Pentium-Classic
    	( ) Pentium-MMX
    	( ) Pentium-Pro
    	( ) Pentium-II/Celeron(pre-Coppermine)
    	(X) Pentium-III/Celeron(Coppermine)/Pentium-III Xeon
    	( ) Pentium M
    	( ) Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon
    	( ) K6/K6-II/K6-III
    	( ) Athlon/Duron/K7
    	( ) Opteron/Athlon64/Hammer/K8
    	( ) Crusoe
    	( ) Efficeon
    	( ) Winchip-C6
    	( ) Winchip-2
    	( ) Winchip-2A/Winchip-
    	( ) GeodeGX1
    	( ) CyrixIII/VIA-C3
    	( ) VIA C3-2 (Nehemiah)
    	# 這裡則是 CPU 的等級,我使用的是 P-III ,您得要選擇自己的啊!
    
    [*] Generic x86 support
    	# 對 x86 的 CPU 架構支援較佳。
    [*] HPET Timer Support
    [ ] Symmetric multi-processing support
    	# 如果您使用兩顆 CPU 以上的系統,這裡『務必』要選擇!否則不用選
        Preemption Model (No Forced Preemption (Server))  --->
    	(X) No Forced Preemption (Server)
    	( ) Voluntary Kernel Preemption (Desktop)
    	( ) Preemptible Kernel (Low-Latency Desktop)
    	# 這裡與 CPU 的效能有關。如果您想要作一個伺服器的核心,選擇第一個!
    	# 否則,為了穩定,最好選擇第二項。
    
    [*] Local APIC support on uniprocessors
    [*]   IO-APIC support on uniprocessors
    	# 單顆 CPU 的環境中,這個項目可以選擇起來,讓 CPU 具有
    	# Advanced Programmable Interrupt Controller 的功能啊!
    [*] Machine Check Exception
    	# 讓 Pentium 系列的 CPU 可以在偵測到 kernel 有問題時,立刻回應到終端介面
    < >   Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4
    < > Toshiba Laptop support
    < > Dell laptop support
    	# 上面這三個就得要看看你的系統是否支援啦!基本上,可以設定成 M 啦!
    [ ] Enable X86 board specific fixups for reboot
    <M> /dev/cpu/microcode - Intel IA32 CPU microcode support
    <M> /dev/cpu/*/msr - Model-specific register support
    <M> /dev/cpu/*/cpuid - CPU information support
    	# 因為我的是 P-III CPU 啊,所以這裡當然選擇成模組即可!
        Firmware Drivers  --->
           < > BIOS update support for DELL systems via sysfs (NEW)
           < > Dell Systems Management Base Driver (NEW)
    	# 如果你的系統是 Dell 的,那麼上面記得編成模組!鳥哥不需要∼
        High Memory Support (4GB)  --->
    	( ) off
    	(X) 4GB
    	( ) 64GB
    	# 這個重要!一般來說,我們對於主機的要求是 RAM 越大越好(一般情況下);
    	# 但是,原本的核心支援僅到 1GB 的記憶體,所以,這裡要加大!
    	# 一般的個人電腦主機,或者是 X86 主機,通常只要 4GB 就夠了,
    	# 除非是特殊的工業用主機才可以額外插到 4GB 以上的記憶體!
    	# 如果這裡選擇成 off 的話,那麼您的記憶體最大只能被捉到 1GB 。
    
    [*] Allocate 3rd-level pagetables from highmem
    	# 這個與 High Memory Support 有關,如果你的記憶體支援到 4GB,這裡可以加入
    [ ] Math emulation
    	# 這個與 CPU 是否具有浮點運算單元有關。目前我們的 CPU (586 以上)
    	# 都已經內建了浮點運算單元了,所以這裡可以不要選啦!
    [*] MTRR (Memory Type Range Register) support
    	# 這玩意兒可以讓 CPU 具有讀取記憶體特殊區塊的能力,尤其在高效能的 AGP
    	# 與相關的 PCI/AGP 匯流排進行資料傳輸時,可以增進不少效能。
    	# 選擇這個項目後,會產生 /proc/mtrr ,我們的 X 會讀取這個咚咚喔。
    [ ] Boot from EFI support (EXPERIMENTAL)
    [*] Enable seccomp to safely compute untrusted bytecode
    	# 這個項目通常要加,不過,如果是嵌入式系統的話,可以不加入!
        Timer frequency (250 HZ)
    	# 這個項目則與核心針對某個事件立即回應的速度有關。一般來說,
    	# 如果是一般桌上電腦,那麼反應時間可以調整的快速一點,因為不會有其他事件。
    	# 如果是主機,由於同一時間點可能有多人連線進來,啟發的事件太多了,所以,
    	# 這個反應時間反而要調慢一點,會比較穩定,而且效能也不差。通常保留預設值
    	# 250 就很好了。
    

  • Power management options (ACPI, APM)
  • 這部分則是電源管理,主要的內容有底下這些:
    [ ]   Power Management Debug Support
    [ ] Software Suspend
    	# 這個與將目前的環境暫存在 swap 當中有關。萬一你想要將目前的資料暫存,
    	# 因為系統可能必須要關機一陣子,那麼這個項目可以選擇。不過,
    	# 由於可能會有一些問題,所以不建議您使用這個功能(主機也很少用到!)
        ACPI (Advanced Configuration and Power Interface) Support  --->
    	# 這個電源管理模組雖然可以管理你的電源,不過,卻會增加核心約 70K ,所以
    	# 對嵌入式系統來說,可能需要考慮考慮。至於 desktop/server 當然就選擇啊!
    	[*] ACPI Support
    	[*]   Sleep States
    	[*]     /proc/acpi/sleep (deprecated)
    	# 如果要啟動 ACPI 的支援,那上面這幾個幾乎都是必要的!
    	<M>   AC Adapter
    	<M>   Battery
    	<M>   Button
    	<M>   Video
    	# 這幾個則只要編譯成為模組即可,因為桌上型與伺服器用不到。
    	# 他主要大該都是針對筆記型電腦來設計的! ^_^
    	<*>   Fan
    	<*>   Processor 
    	<*>     Thermal Zone
    	# 每一部主機都有的 CPU/風扇 等,當然也可以編譯進核心,也可以設定成模組。
    	<M>   ASUS/Medion Laptop Extras
    	<M>   IBM ThinkPad Laptop Extras 
    	<M>   Toshiba Laptop Extras
    	(2001) Disable ACPI for systems before Jan 1st this year
    	[ ]   Debug Statements
    	[*]   Power Management Timer Support
    
        APM (Advanced Power Management) BIOS Support  --->
    	<*> APM (Advanced Power Management) BIOS support
    	[ ]   Ignore USER SUSPEND
    	[ ]   Enable PM at boot time
    	[*]   Make CPU Idle calls when idle
    	[ ]   Enable console blanking using APM
    	[*]   RTC stores time in GMT 
    	[ ]   Allow interrupts during APM BIOS calls
    	[ ]   Use real mode APM BIOS call to power off 
    	# 由於鳥哥比較少使用電源管理,所以,我這裡大多使用預設值而已。
    
        CPU Frequency scaling  --->
    	# 什麼?可以經過核心修改 CPU 的運作頻率?哈哈!沒錯!是這樣!
    	# 不過,在說明檔當中也提及,還需要啟動底下的 dynamic cpufreq governor
    	# 才可以順利的啟動這個項目。當然,如果你不願意的話,這裡可以取消。
    	[*] CPU Frequency scaling
    	[*]   Enable CPUfreq debugging
    	<M>   CPU frequency translation statistics
    	[*]     CPU frequency translation statistics details
    	# 如果想要啟動在休眠時, CPU 自動降頻的功能,上面都給他設定好吧!
    	      Default CPUFreq governor (userspace)  --->
    		( ) performance
    		(X) userspace
    		# 休眠時 CPU 頻率的考量,是以效能為主,還是您可以手動修改
    		# 既然要自動降頻,當然不以效能為考量∼所以選 userspace 吧!
    
    	<*>   'performance' governor
    	<M>   'powersave' governor
    	---   'userspace' governor for userspace frequency scaling 
    	<M>   'ondemand' cpufreq policy governor
    	<M>   'conservative' cpufreq governor
    	# 上面這幾個則是在載入哪些調節器(governor) ∼
    	---   CPUFreq processor drivers
    	<M>   ACPI Processor P-States driver
    	< >   AMD Mobile K6-2/K6-3 PowerNow!
    	<M>   AMD Mobile Athlon/Duron PowerNow!
    	< >   Cyrix MediaGX/NatSemi Geode Suspend Modulation
    	<*>   Intel Enhanced SpeedStep
    	[*]     Use ACPI tables to decode valid frequency/voltage pairs
    	[*]     Built-in tables for Banias CPUs
    	<*>   Intel Speedstep on ICH-M chipsets (ioport interface)
    	<M>   Intel Pentium 4 clock modulation
    	<*>   Transmeta LongRun
    	< >   VIA Cyrix III Longhaul
    	# 上面這幾個就與 CPU 的型號有關啦!我用的是 P-III,
    	# 所以,不相關的資料我直接將他編成模組而已!
    	---   shared options
    	[ ]   /proc/acpi/processor/../performance interface (deprecated)
    	[ ]   Relaxed speedstep capability checks
    
    	# 其實,這個項目主要是在主機 Idle 的時候,透過 CPU 本身的功能,
    	# 然後讓系統可以自動的降頻的一個選項啦! ^_^
    
    老實說,由於鳥哥的 Linux 機器主要都是站在 Server 的角度,所以我的機器都是全年無休的。 在這樣的條件下,我老是選擇不要使用電源管理的說∼ @_@。不過,如果是站在桌上型電腦的角度, 呵呵∼啟動電源管理這可是很棒的選項,因為.....電費越來越貴了∼ 能省則省啊! ^_^ 另外,絕大部分的選項都可以編譯成為模組啊!只是會花去一些編譯的時間就是了。


  • Bus options (PCI, PCMCIA, EISA, MCA, ISA)
  • 這個項目則與匯流排有關啦!分為最常見的 PCI,還有筆記型電腦常見的 PCMCIA 插卡啊!詳細的資料有這些:
    --- PCI support
          PCI access mode (Any)  --->
    [ ]   PCI Express support
    	# 這個重要!如果你的主機板有支援較新的 PCI-Express 顯示卡的話,
    	# 這裡請務必要勾選∼鳥哥的主機板太舊了,用的是 AGP 顯示卡,所以這裡不選!
    [ ]   Message Signaled Interrupts (MSI and MSI-X)
    [*]   Legacy /proc/pci interface
    [ ]   PCI Debugging
    [*] ISA support
    [ ]   EISA support
    	# 這個是比 PCI 還要更早的匯流排插槽,一般來說,
    	# 最好還是保留 ISA 插槽比較妥當點∼
    [ ] MCA support
    < > NatSemi SCx200 support
        PCCARD (PCMCIA/CardBus) support  --->
    	< > PCCard (PCMCIA/CardBus) support
    	[ ]   Enable PCCARD debugging
    	< >   16-bit PCMCIA support
    	[ ]     PCMCIA control ioctl (obsolete)
    	---   32-bit CardBus support
    	---   PC-card bridges
    	< >   CardBus yenta-compatible bridge support
    	< >   Cirrus PD6729 compatible bridge support
    	< >   i82092 compatible bridge support
    	< >   i82365 compatible bridge support
    	< >   Databook TCIC host bridge support
    	# 這個是 PC 卡,一般來說,桌上型電腦不會有這種卡的存在,
    	# 所以,鳥哥通常是不選擇∼不過,如果你的主機是筆記型電腦,
    	# 這裡可就得要選擇了!否則很多插卡就不能被使用啊!切記切記!
    
        PCI Hotplug Support  --->
    	# 這個是進階功能,可以不用理他!
    
    PCI 插槽是重要的,因為幾乎所有的介面卡都是插在 PCI 插槽上面的。 此外,這個設定項目裡面有個比較有趣又重要的地方,那就是 PCI-E (PCI Express) 的設定項目了!如果你的主機板是最近買的,而且你的顯示卡是 PCI-E 的話, 這個項目就務必要編入核心才行!否則顯示卡會捉不到的!


  • Executable file formats
  • 這裡必須要勾選才行喔!因為是給 Linux 核心運作執行檔之用的資料! 除了第一項必須要編成核心功能之外,其他兩項是可以編譯成為模組的啦!
    [*] Kernel support for ELF binaries
    <M> Kernel support for a.out and ECOFF binaries
    <*> Kernel support for MISC binaries
    

  • Networking
  • 這個項目是相當相當相當 * n 重要的選項,因為他還包含了防火牆相關的項目! 就是未來在伺服器篇會談到的防火牆 iptables 這個資料啊!所以,千萬注意了!
    --- Networking support
          Networking options  --->
    	# 就是這個光啊!裡面的資料全部都是重要的防火牆項目!
    	# 在這裡面的項目當中,如果可以編成模組,盡量將他編成模組!
    	<*> Packet socket
    	# 唯獨這個項目務必要編進核心裡面!因為他是防火牆啊!
    	[*]   Packet socket: mmapped IO
    	<*> Unix domain sockets
    	<*> IPsec user configuration interface
    	<M> PF_KEY sockets
    
    	# 底下是 TCP/IP 的設定,大多是 IPv4 ,只要保留預設值就很 OK 了!
    	[*] TCP/IP networking
    	[*]   IP: multicasting
    	[*]   IP: advanced router
    	        Choose IP: FIB lookup algorithm (choose FIB_HASH if unsure) 
    	[*]   IP: policy routing
    	[*]     IP: use netfilter MARK value as routing key
    	[*]   IP: equal cost multipath
    	[ ]     IP: equal cost multipath with caching support (EXPERIMENTAL)
    	[*]   IP: verbose route monitoring
    	[ ]   IP: kernel level autoconfiguration
    	<M>   IP: tunneling
    	<M>   IP: GRE tunnels over IP
    	[*]     IP: broadcast GRE over IP
    	[*]   IP: multicast routing
    	[*]     IP: PIM-SM version 1 support
    	[*]     IP: PIM-SM version 2 support
    	[*]   IP: TCP syncookie support (disabled per default)
    	<M>   IP: AH transformation
    	<M>   IP: ESP transformation
    	<M>   IP: IPComp transformation
    	<M>   IP: tunnel transformation
    	<*>   INET: socket monitoring interface
    	[ ]   TCP: advanced congestion control
    
    	      IP: Virtual Server Configuration  --->
    		# 這個項目則主要與 cluster 有關∼裡面保留預設值即可!
    
    	# 這底下則與 IPv6 ,新一代的 IP 協定有關!同樣做成模組!
    	<M>   The IPv6 protocol
    	[*]     IPv6: Privacy Extensions (RFC 3041) support
    	<M>     IPv6: AH transformation
    	<M>     IPv6: ESP transformation
    	<M>     IPv6: IPComp transformation
    	---     IPv6: tunnel transformation
    	<M>     IPv6: IPv6-in-IPv6 tunnel
    
    	# 底下就重要啦!就是我們一直講一直講的防火牆啦! ^_^
    	[*] Network packet filtering (replaces ipchains)  --->
    		--- Network packet filtering (replaces ipchains)
    		[ ]   Network packet filtering debugging
    		[*]   Bridged IP/ARP packets filtering
    		<M>   Netfilter netlink interface
    
    		      IP: Netfilter Configuration  --->
    			<M> Connection tracking (required for masq/NAT)
    			[*]   Connection tracking flow accounting
    			[*]   Connection mark tracking support
    			[ ]   Connection tracking events
    			<M>   Connection tracking netlink interface
    			<M>   FTP protocol support
    			<M>   IRC protocol support
    			<M>   TFTP protocol support
    			<M>   Amanda backup protocol support
    			<M>   PPTP protocol support
    			<M> IP Userspace queueing via NETLINK (OBSOLETE)
    			<M> IP tables support (required for filtering/masq/NAT)
    			<M>   limit match support
    			<M>   IP range match support
    			<M>   MAC address match support
    			<M>   Packet type match support
    			<M>   netfilter MARK match support
    			<M>   Multiple port match support
    			<M>   TOS match support
    			<M>   recent match support
    			<M>   ECN match support
    			<M>   DSCP match support
    			<M>   AH/ESP match support
    			<M>   LENGTH match support
    			<M>   TTL match support
    			<M>   tcpmss match support
    			<M>   Helper match support
    			<M>   Connection state match support
    			<M>   Connection tracking match support
    			<M>   Owner match support
    			<M>   Physdev match support
    			<M>   address type match support
    			<M>   realm match support
    			<M>   SCTP protocol match support
    			<M>   DCCP protocol match support
    			<M>   comment match support
    			<M>   Connection mark match support
    			<M>   Connection byte/packet counter match support
    			<M>   hashlimit match support
    			<M>   string match support
    			<M>   Packet filtering
    			<M>     REJECT target support
    			<M>   LOG target support
    			<M>   ULOG target support (OBSOLETE)
    			<M>   TCPMSS target support
    			<M>   NFQUEUE Target Support
    			<M>   Full NAT
    			<M>     MASQUERADE target support
    			<M>     REDIRECT target support
    			<M>     NETMAP target support
    			<M>     SAME target support
    			<M>   Packet mangling
    			<M>     TOS target support
    			<M>     ECN target support
    			<M>     DSCP target support
    			<M>     MARK target support
    			<M>     CLASSIFY target support
    			<M>     TTL target support
    			<M>     CONNMARK target support
    			<M>   raw table support (required for NOTRACK/TRACE)
    			<M>     NOTRACK target support
    			<M> ARP tables support
    			<M>   ARP packet filtering
    			<M>   ARP payload mangling
    
    		      Bridge: Netfilter Configuration  --->
    			# 這個項目內容也一樣,全部編成模組!
    
    	# 底下同樣的,可能的話就編譯成為模組啊!
    	<M> 802.1d Ethernet Bridging
    	<M> 802.1Q VLAN Support
    	< > DECnet Support
    	< > ANSI/IEEE 802.2 LLC type 2 Support
    	<M> The IPX protocol
    	[ ]   IPX: Full internal IPX network
    	<M Appletalk protocol support
    	[*]   Appletalk interfaces support
    	<M>     Apple/Farallon LocalTalk PC support 
    	<M>     COPS LocalTalk PC support
    	[*]       Dayna firmware support
    	[*]       Tangent firmware support
    	<M>     Appletalk-IP driver support
    	[*]       IP to Appletalk-IP Encapsulation support
    	[*]       Appletalk-IP to IP Decapsulation support
    	[*] QoS and/or fair queueing  --->
    	<M> Firewall based classifier
    	<M> U32 classifier
    	[*]   U32 classifier performance counters
    	[*] classify input device (slows things u32/fw)
    	[*] Use nfmark as a key in U32 classifier
    	<M> Special RSVP classifier
    	<M> Special RSVP classifier for IPv6
    	[*] Extended Matches
    	(32)  Stack size
    	<M>   Simple packet data comparison
    	<M>   Multi byte comparison
    	<M>   U32 hashing key
    	<M>   Metadata
    	<M>   Textsearch
    	[*] Traffic policing (needed for in/egress)
    	    Network testing  --->
    
    # 底下則是一些特殊的網路設備,例如紅外線啊、藍牙啊!
    # 如果不清楚的話,就使用模組吧!除非你真的知道不要該項目!
    [ ]   Amateur Radio support  --->
    <M>   IrDA (infrared) subsystem support  --->
    <M>   Bluetooth subsystem support  --->
    <M>   Generic IEEE 802.11 Networking Stack
    [ ]     Enable full debugging output
    <M>     IEEE 802.11 WEP encryption (802.1x)
    <M>     IEEE 802.11i CCMP support
    <M>     IEEE 802.11i TKIP encryption
    
    在這個設定項目當中,很多東西其實我們在基礎篇還沒有講到, 因為大部分的參數都與網路、防火牆有關!由於防火牆是在啟動網路之後再設定即可, 所以絕大部分的內容都可以被編譯成為模組,而且也建議您編成模組! 有用到才載入到核心即可啊!


  • Device Drivers
  • 這個是所有硬體裝置的驅動程式庫!哇!光是看到裡面這麼多內容,鳥哥頭都昏了∼ 不過,為了您自己的主機好,建議你還是得要一個項目一個項目的去挑選挑選才行∼ 這裡面的資料就與您主機的硬體有絕對的關係了!
    Generic Driver Options  --->
    	# 與韌體有關,保留預設值即可!
    
    Connector - unified userspace <-> kernelspace linker  --->
    Memory Technology Devices (MTD)  --->
    	# 上面這兩個不知道會不會用到的資料,暫時可以編譯成為模組即可!
    
    Parallel port support  --->
    	<M> Parallel port support
    	<M>   PC-style hardware
    	<M>     Multi-IO cards (parallel and serial)
    	<M>   Support for PCMCIA management for PC-style ports
    	[*] IEEE 1284 transfer modes
    	# 平行序列埠,呵呵!與印表機相關性挺高的!編譯成為模組即可!
    
    Plug and Play support  --->
    	[*] Plug and Play support
    	# 不囉唆,這個當然要選擇啊!
    
    Block devices  --->
    	# 這裡面與儲存裝置有關,全部給他編成模組!當然,確定不需要的,
    	# 就不要編譯咯!
    
    ATA/ATAPI/MFM/RLL support  --->
    	# 底下的設定你可以保留預設值,來讓核心支援較為完整!
    	# 不過,既然我們已經知道主機的硬體與主機板的晶片,當然可以作一些選擇囉!
    	<*> 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
    	[ ]     Support for SATA (deprecated; conflicts with libata SATA driver)
    		# 這個不要選!因為 SATA 的新的驅動程式是包含在 SCSI 中的!
    	[ ]     Use old disk-only driver on primary interface
    	<*>     Include IDE/ATA-2 DISK support
    	[*]     Use multi-mode by default
    	<M>     PCMCIA IDE support
    	<*>     Include IDE/ATAPI CDROM support
    	<*>     Include IDE/ATAPI FLOPPY support
    		# 上面這兩個就必選!讓核心主動支援 CDROM 與軟碟!
    
    	<M>     SCSI emulation support
    	[ ]     IDE Taskfile Access
    	---     IDE chipset support/bugfixes
    	<*>     generic/default IDE chipset support
    	[*]     CMD640 chipset bugfix/support
    	[*]       CMD640 enhanced support
    	[*]     PNP EIDE support
    		# 上面這幾個也可以挑選起來,尤其會比較適合 Pentium 的主機!
    
    		# 底下這幾個則主要與主機板的晶片組有關啊!
    	[*]     PCI IDE chipset support
    	[*]       Sharing PCI IDE interrupts support
    	[ ]       Boot off-board chipsets first support
    	<*>       Generic PCI IDE Chipset Support
    	<*>       RZ1000 chipset bugfix/support
    	[*]       Generic PCI bus-master DMA support
    			# 底下這幾個請特別挑選一番!
    	[ ]         Force enable legacy 2.0.X HOSTS to use DMA
    	[*]         Use PCI DMA by default when available
    	[ ]           Enable DMA only for disks
    	< >         AEC62XX chipset support
    	< >         ALI M15x3 chipset support
    	[ ]           ALI M15x3 WDC support (DANGEROUS)
    	< >         AMD and nVidia IDE support
    	< >         ATI IXP chipset IDE support
    	< >         CMD64{3|6|8|9} chipset support
    	< >         Compaq Triflex IDE support
    	< >         CY82C693 chipset support
    	< >         Cyrix/National Semiconductor CS5530 MediaGX chipset support
    	< >         HPT34X chipset support
    	< >         HPT36X/37X chipset support
    	< >         National SCx200 chipset support
    	<*>         Intel PIIXn chipsets support
    	<*>         IT821X IDE support
    	< >         NS87415 chipset support
    	<*>         PROMISE PDC202{46|62|65|67} support
    	[ ]           Special UDMA Feature
    	<*>         PROMISE PDC202{68|69|70|71|75|76|77} support
    	[*]           Enable controller even if disabled by BIOS
    	< >         ServerWorks OSB4/CSB5/CSB6 chipsets support
    	< >         Silicon Image chipset support
    	< >         SiS5513 chipset support
    	< >         SLC90E66 chipset support
    	< >         Tekram TRM290 chipset support
    	< >         VIA82CXXX chipset support
    	[ ]     Other IDE chipset support
    	[ ]     IGNORE word93 Validation BITS
    	# 因為我的是 Intel 晶片組的主機板,所以全部無關的我都沒有選擇。
    	# 不過,為了您自己好∼其實,上面絕大部分的資料都給他做成模組比較妥當!
    
    SCSI device support  --->
    # 不論你有沒有 SCSI 裝置,你都必須要啟動 SCSI 的支援!理由有二:
    # 1. 因為 USB 裝置用的就是模擬 SCSI 啊!
    # 2. 因為 SATA 的設定項目就在這裡面!
    	< > RAID Transport Class
    	<M> SCSI device support
    	[*]   legacy /proc/scsi/ support
    	---   SCSI support type (disk, tape, CD-ROM)
    	<M>   SCSI disk support
    	<M>   SCSI tape support
    	<M>   SCSI OnStream SC-x0 tape support
    	<M>   SCSI CDROM support
    	[*]     Enable vendor-specific extensions (for SCSI CDROM)
    	<M>   SCSI generic support
    	<M>   SCSI media changer support
    	---   Some SCSI devices (e.g. CD jukebox) support multiple LUNs
    	[*]   Probe all LUNs on each SCSI device
    	[*]   Verbose SCSI error reporting (kernel size +=12K)
    	[*]   SCSI logging facility
    	      SCSI Transport Attributes  --->
    	      SCSI low-level drivers  --->
    		# 在這個項目當中,都保留預設值即可不過,
    		# 如果你有 SATA 的硬碟,請確認底下已經編譯起來了!
    		<M> Serial ATA (SATA) support
    		<M>   AHCI SATA support
    		<M>   ServerWorks Frodo / Apple K2 SATA support
    		<M>   Intel PIIX/ICH SATA support
    		<M>   Promise SATA TX2/TX4 support
    		<M>   Pacific Digital SATA QStor support
    		<M>   VIA SATA support
    		<M>   VITESSE VSC-7174 SATA support
    	      PCMCIA SCSI adapter support  --->
    
    Old CD-ROM drivers (not SCSI, not IDE)  --->
    Multi-device support (RAID and LVM)  ---> 
    	# 還記得不久之前才談過的 LVM 吧?這裡當然要選擇囉!
    	[*] Multiple devices driver support (RAID and LVM)
    	<*>   RAID support
    	<M>     Linear (append) mode
    	<M>     RAID-0 (striping) mode
    	<M>     RAID-1 (mirroring) mode
    	<M>     RAID-4/RAID-5 mode
    	<M>     RAID-6 mode
    	<M>     Multipath I/O support
    	<M>     Faulty test module for MD
    	<M>   Device mapper support
    
    Fusion device support  --->
    IEEE 1394 (FireWire) support  --->
    I2O device support  --->
    	# 上面也編譯成為模組即可!那個 IEEE 1394 就是我們常聽到的『火線』。
    
    Network device support  --->
    	# 您總是有網路卡吧?所以囉∼這裡得要選擇一個網路卡裝置啊!
    	[*] Network device support
    	<M>   Dummy net driver support
    	<M>   Bonding driver support
    	<M>   EQL (serial line load balancing) support
    	<M>   Universal TUN/TAP device driver support
    	<M>   General Instruments Surfboard 1000
    	      ARCnet devices  --->
    	      PHY device support  --->
    	      Ethernet (10 or 100Mbit)  --->
    		# 這裡面含有的就是 10/100 的網路卡!大部分都可以編成模組。
    		<M> RealTek RTL-8129/8130/8139 PCI Fast Ethernet Adapter support
    		<M> VIA Rhine support
    		# 上面這兩個就是有名的螃蟹卡與 D-Link 530 所用的驅動程式。
    	      Ethernet (1000 Mbit)  --->
    		# 這裡面含有的就是 10/100/1000 的網路卡!大部分都可以編成模組。
    	      Ethernet (10000 Mbit)  --->
    	      Token Ring devices  --->
    	      Wireless LAN (non-hamradio)  --->
    	      PCMCIA network device support  --->
    	      Wan interfaces  --->
    	[*]   FDDI driver support
    	< >     Digital DEFEA and DEFPA adapter support
    	<M>     SysKonnect FDDI PCI support
    	<M>   PLIP (parallel port) support
    	<*>   PPP (point-to-point protocol) support
    	[*]     PPP filtering
    	<M>     PPP support for async serial ports
    	<M>     PPP support for sync tty ports
    	<M>     PPP Deflate compression
    	# 如果您有 ADSL 撥接的話,呵呵!PPP 的裝置也要選擇上喔!
    	< >     PPP BSD-Compress compression
    	<M>   SLIP (serial line) support
    	[*]     CSLIP compressed headers
    	[*]     Keepalive and linefill
    	[ ]     Six bit SLIP encapsulation
    	[*]   Fibre Channel driver support
    
    ISDN subsystem  --->
    Telephony Support  --->
    	# 上面這兩個我都沒有,所以並沒有選擇!
    
    Input device support  --->
    	# 這裡面含有滑鼠、鍵盤、搖桿等等的輸入裝置,也是需要挑選的!
    	--- Generic input layer (needed for keyboard, mouse, ...)
    	---   Userland interfaces
    	---   Mouse interface
    	# 底下這三個與滑鼠有關啦!也可以選擇的!
    	[ ]     Provide legacy /dev/psaux device
    	(1024)  Horizontal screen resolution
    	(768)   Vertical screen resolution
    	<M>   Joystick interface
    	< >   Touchscreen interface 
    	<*>   Event interface
    	< >   Event debugging
    	---   Input Device Drivers
    	---   Keyboards  --->
    	[*]   Mouse  --->
    	[ ]   Joysticks  --->
    	[ ]   Touchscreens  ---> 
    		# 我沒有搖桿也沒有觸控式面版,所以上面兩個不選!
    	[*]   Miscellaneous devices  --->
    	    Hardware I/O ports  --->
    
    Character devices  --->
    	# 裡面的資料也很多,也要注意 AGP 顯示卡的晶片組啊!
    	# 而因為鳥哥的環境是 Intel 的晶片,所以自然將那個編進去,
    	# 其他的成為模組即可!其他的除非確定不需要,否則保留預設值即可!
    	<*> /dev/agpgart (AGP Support)
    	<M>   ALI chipset support
    	<M>   ATI chipset support
    	<M>   AMD Irongate, 761, and 762 chipset support
    	<M>   AMD Opteron/Athlon64 on-CPU GART support
    	<*>   Intel 440LX/BX/GX, I8xx and E7x05 chipset support
    	<M>   NVIDIA nForce/nForce2 chipset support
    	<M>   SiS chipset support
    	<M>   Serverworks LE/HE chipset support
    	<M>   VIA chipset support
    	<M>   Transmeta Efficeon support
    	<M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)
    	<M>   3dfx Banshee/Voodoo3+
    	<M>   ATI Rage 128
    	<M>   ATI Radeon
    	<M>   Intel I810
    	<M>   Intel 830M, 845G, 852GM, 855GM, 865G
    	<M>     i830 driver
    	<M>     i915 driver
    	<M>   Matrox g200/g400
    	<M>   SiS video cards
    	<M>   Via unichrome video cards
    	< >   Savage video cards
    
    I2C support  --->
    	# 還記得我們去偵測主機板的溫度與壓力吧?呵呵!那就是透過核心的
    	# 這個 I2C 的模組功能了!預設情況下,這個項目都有支援,所以,
    	# 保留預設值即可。
    
    Dallas's 1-wire bus  --->
    	# 這個與某些熱感應裝置有關,可以不編譯,也可以保留編成模組即可!
    
    Hardware Monitoring support  --->
    	# 這個也與 I2C 有點關係,他主要可以接受硬體的偵測,
    	# 所以在這個項目內您會看到 LM_XX 之類的模組!啊!就保留模組即可!
    
    Misc devices  --->
    Multimedia Capabilities Port drivers  --->
    Multimedia devices  --->
    	# 類似影像擷取卡、FM 廣播音效卡等等,可在這裡設定!
    	# 如果您的主機是用作伺服器,那麼這裡或許可以不要選擇。
    	# 當然啦,這個項目幾乎都是模組,保留預設值也不錯!
    
    Graphics support  --->
    	# 嘿嘿!重點之一,顯示卡的晶片組∼剛剛前面提到的都是主機板的
    	# 對顯示卡的匯流排支援 (PCI-E 與 AGP) ,這裡則是針對顯示卡晶片!
    	# 鳥哥的顯示卡是 NVidia 的,所以將他選擇即可!其他的可以編成模組!
    	<*> Support for frame buffer devices
    	---   Enable Video Mode Handling Helpers
    	---   Enable Tile Blitting Support
    	<M>   Cirrus Logic support
    	< >   Permedia2 support
    	< >   CyberPro 2000/2010/5000 support
    	< >   Arc Monochrome LCD board support
    	[ ]   Chips 69000 display support
    	[ ]   IMS Twin Turbo display support
    	<M>   VGA 16-color graphics support
    	[*]   VESA VGA graphics support
    	< >   Hercules mono graphics support
    	<M>   nVidia Framebuffer Support
    	<M>   nVidia Riva support
    	[ ]     Enable DDC Support
    	[ ]     Lots of debug output from Riva(nVidia) driver
    	<M>   Matrox acceleration
    	[*]     Millennium I/II support
    	[*]     Mystique support
    	[*]     G100/G200/G400/G450/G550 support
    	<M>     Matrox I2C support
    	<M>       G400 second head support
    	[*]     Multihead support
    	< >   ATI Radeon display support (Old driver)
    	<M>   ATI Radeon display support
    	[*]     DDC/I2C for ATI Radeon support
    	[ ]     Lots of debug output from Radeon driver
    	<M>   ATI Rage128 display support
    	<M>   ATI Mach64 display support
    	[*]     Mach64 CT/VT/GT/LT (incl. 3D RAGE) support
    	[*]       Mach64 generic LCD support (EXPERIMENTAL)
    	[ ]       Rage XL No-BIOS Init support
    	[*]     Mach64 GX support
    	<M>   SiS/XGI display support
    	<M>   NeoMagic display support
    	<M>   IMG Kyro support
    	<M>   3Dfx Banshee/Voodoo3 display support
    	<M>   3Dfx Voodoo Graphics (sst1) support
    	< >   Cyberblade/i1 support
    	<M>   Trident support
    	< > Epson S1D13XXX framebuffer support
    	< > Virtual Frame Buffer support (ONLY FOR TESTING!)
    	    Console display driver support  --->
    	    Logo configuration  --->
    	[*] Backlight & LCD device support  --->
    
    Sound  --->
    	# 這個是音效卡啊!鳥哥的機器上面沒有音效卡,所以直接不選。
    	# 您可以進入後選擇您的音效卡啊!
    
    USB support  --->
    	# 這個則是 USB 的驅動模組!還記得我們在硬體維護的地方講過的
    	# USB 的模組名稱吧?呵呵!在裡面找找吧!
    	# 其實這裡面鳥哥僅保留預設值,然後再加上選擇 USB 2.0 的支援,
    	# 其他的 usb 裝置全部給他勾成模組!這樣就 OK 啦!
    
    MMC/SD Card support  --->
    	# 這是多媒體卡 (multi-media card) ,鳥哥是用不到的,所以不選!
    
    InfiniBand support  --->
    SN Devices  --->
    	# 這兩個應該也用不到,所以保留預設值即可!
    
    在這裡面真的很重要,因為很多資料都與你的硬體有關。核心推出時的預設值是比較符合一般狀態的, 所以很多資料其實保留預設值就可以編的很不錯了!不過,也因為較符合一般狀態, 所以核心額外的編譯進來很多跟你的主機系統不符合的資料,例如網路卡裝置∼ 你可以針對你的主機板與相關硬體來進行編譯。不過,還是要記得有『未來擴充性』的考量! 之前鳥哥不是談過嗎,我的網路卡由螃蟹卡換成 3Com 時,核心捉不到∼ 因為......我並沒有將 3Com 的網路卡編譯成為模組啊! @_@


  • File systems
  • 檔案系統的支援也是很重要的一項核心功能!因為如果不支援某個檔案系統, 那麼我們的 Linux kernel 就無法認識,當然也就無法使用啦!例如 Quota, NTFS 等等特殊的 filesystem 。底下是詳細的資料囉!
    <*> Second extended fs support
    [*]   Ext2 extended attributes
    [*]     Ext2 POSIX Access Control Lists
    [*]     Ext2 Security Labels
    [ ]   Ext2 execute in place support
    <*> Ext3 journalling file system support
    [*]   Ext3 extended attributes
    [*]     Ext3 POSIX Access Control Lists
    [*]     Ext3 Security Labels
    [ ] JBD (ext3) debugging support
    # EXT2/EXT3 是必選的吧!將他選擇起來先!
    
    <M> Reiserfs support
    [ ]   Enable reiserfs debug mode
    [*]   Stats in /proc/fs/reiserfs
    [*]   ReiserFS extended attributes
    [*]     ReiserFS POSIX Access Control Lists
    [*]     ReiserFS Security Labels
    <M> JFS filesystem support
    [*]   JFS POSIX Access Control Lists
    [*]   JFS Security Labels
    [ ]   JFS debugging
    [ ]   JFS statistics
    <M> XFS filesystem support
    [*]   XFS Quota support
    [*]   XFS Security Label support
    [*]   XFS POSIX ACL support
    <M> Minix fs support
    # 上面這幾個 filesystem 不知道什麼時候會用到,當然是編成模組比較好!
    
    <M> ROM file system support
    [*] Inotify file change notification support
    [*] Quota support
    < >   Old quota format support
    <*>   Quota format v2 support
    # Quota 夠重要吧!務必要將他圈選起來才行喔!
    
    <M> Kernel automounter support
    <M> Kernel automounter version 4 support (also supports v3)
    < > Filesystem in Userspace support
        CD-ROM/DVD Filesystems  --->
    	<*> ISO 9660 CDROM file system support
    	[*]   Microsoft Joliet CDROM extensions
    	[*]   Transparent decompression extension
    	<M> UDF file system support 
    	# 注意!那個 ISO 9660 的 filesystem 務必要挑選!
        
        DOS/FAT/NT Filesystems  --->
    	<M> MSDOS fs support
    	<M> VFAT (Windows-95) fs support
    	(950) Default codepage for FAT
    	(big5) Default iocharset for FAT
    	<M> NTFS file system support
    	[ ]   NTFS debugging support (NEW)
    	[*]   NTFS write support
    	# 哇!不但可以選擇預設是中文語系,而且,還可以支援 NTFS
    	# 可讀寫哩!這一版真強!不過,NTFS 能否真的可以寫入,不確定∼
    
        Pseudo filesystems  --->
    	[*] /proc file system support
    	[*]   /proc/kcore support
    	[*] Virtual memory file system support (former shm fs)
    	[*] HugeTLB file system support
    	< > Relayfs file system support
    	# 這幾個是一定要的啦!
    
        Miscellaneous filesystems  --->
    	# 這裡面的資料可以選擇預設即可!
    	
        Network File Systems  --->
    	<M> NFS file system support
    	[*]   Provide NFSv3 client support
    	[*]     Provide client support for the NFSv3 ACL protocol extension
    	<M> NFS server support
    	[*]   Provide NFSv3 server support
    	[*]     Provide server support for the NFSv3 ACL protocol extension
    	[*]   Provide NFS server over TCP support
    	<M> SMB file system support (to mount Windows shares etc.)
    	[*]   Use a default NLS
    	(cp950) Default Remote NLS Option
    	# 這裡可以加上這個預設參數,支援中文語系啊!
    	<M> CIFS support (advanced network filesystem for Samba, Window and othe
    	[ ]   CIFS statistics
    	[*]   CIFS extended attributes (EXPERIMENTAL)
    	[*]     CIFS POSIX Extensions (EXPERIMENTAL)
    	[ ]   CIFS Experimental Features (EXPERIMENTAL)
    	<M> NCP file system support (to mount NetWare volumes)
    	[*]   Packet signatures
    	[*]   Proprietary file locking
    	[*]   Clear remove/delete inhibit when needed
    	[*]   Use NFS namespace if available
    	[*]   Use LONG (OS/2) namespace if available
    	[*]   Lowercase DOS filenames
    	[*]   Use Native Language Support
    	[*]   Enable symbolic links and execute flags
    	<M> Coda file system support (advanced network fs)
    	[ ]   Use 96-bit Coda file identifiers
    	# 其實大部分仍然是模組的項目啦!
    
        Partition Types  --->
    	# 裡面含有 Minix, sun 等等的磁碟分割表的格式支援,
    	# 您如果確定不需要,可以將他拿掉就是了!
    
        Native Language Support  --->
    	(utf8) Default NLS Option
    	<*>   Traditional Chinese charset (Big5)
    	# 其他都保留預設值即可,這兩個項目稍微確認一下!
    
    這部份也是有夠麻煩∼因為涉及核心是否能夠支援某些檔案系統,以及某些作業系統支援的 partition table 的支援項目。在進行選擇時,也務必要特別的小心在意喔! 尤其是我們常常用到的網路作業系統 (NFS/Samba 等等),以及基礎篇談到的 Quota 等, 您都得要勾選啊!否則是無法被支援的。比較有趣的是 NTFS 在這一版的核心裡面竟然有支援可寫入的項目, 著實讓鳥哥嚇了一跳了!^_^


  • Security options
  • 這一部份與安全性比較有關。幾乎保留預設值即可,仔細注意一下 SELinux 的項目, 該項目是美國國家安全局發展的 Linux 細部安全維護控制項目,需要勾選才行!


  • Cryptographic options
  • 這部份則是加密參數的設定。一般我們使用的帳號密碼登入,利用的就是 MD5 這個加密機制,要讓核心有支援才行啊!幾乎所有的項目都給他做成模組即可! 不過 MD5 與 SHA1 必須要直接由核心支援比較好!
    --- Cryptographic API
    ---   HMAC support
    <M>   Null algorithms
    <M>   MD4 digest algorithm
    <*>   MD5 digest algorithm
    <*>   SHA1 digest algorithm
    <M>   SHA256 digest algorithm
    <M>   SHA384 and SHA512 digest algorithms
    <M>   Whirlpool digest algorithms
    <M>   Tiger digest algorithms
    <M>   DES and Triple DES EDE cipher algorithms
    <M>   Blowfish cipher algorithm
    <M>   Twofish cipher algorithm
    <M>   Serpent cipher algorithm
    <M>   AES cipher algorithms (i586)
    <M>   CAST5 (CAST-128) cipher algorithm
    <M>   CAST6 (CAST-256) cipher algorithm
    <M>   TEA, XTEA and XETA cipher algorithms
    <M>   ARC4 cipher algorithm
    <M>   Khazad cipher algorithm
    <M>   Anubis cipher algorithm
    <M>   Deflate compression algorithm
    <M>   Michael MIC keyed digest algorithm
    <M>   CRC32c CRC algorithm
    

  • 取用舊資料與儲存設定
  • 還有底下這兩個項目:
    Load an Alternate Configuration File
    Save Configuration to an Alternate File
    
    這兩個項目分別是儲存剛剛做好的所有項目的設定資料,另一個則是將來自其他人作的選擇給他讀入! 事實上,剛剛我們所做的設定只要在離開時選擇 SAVE ,那麼這些項目 通通會記錄到目前這個目錄下的 .config 檔案內。 而我們也可以使用上面提到的 Save Configuration 這個項目來將剛剛做完的設定儲存成另外的檔案, 做成這個檔案的好處是,你可以在下次在其他版本的核心作選擇時,直接以 Load 來將這個檔案的設定項目讀入,這樣可以減少您還要重新挑選一遍的困境啊!

    在最初的畫面上面選擇 <Exit> 項目後,畫面會出現一個詢問你是否要儲存的視窗,選擇 Yes 後, 您所有的選擇資料就都會被紀錄到 .config 這個隱藏檔案裡面去了!有興趣的話, 您可以使用 vi 去到該檔案查閱一下,就知道你做過哪些設定囉! ^_^

    要請您注意的是,上面的資料主要是適用在鳥哥的個人機器上面的, 目前鳥哥比較習慣使用原本 distributions 提供的預設核心,因為他們也會主動的進行更新, 所以鳥哥就懶的自己重編核心了∼ ^_^

    此外,因為鳥哥重視的地方在於『網路伺服器』上面,所以裡頭的設定少掉了相當多的個人桌上型 Linux 的硬體編譯!所以,如果你想要編譯出一個適合您的機器的核心, 那麼可能還有相當多的地方需要來修正的!不論如何,請隨時以 Help 那個選項來看一看內容吧!反正 Kernel 重編的機率不大!花多一點時間重新編譯一次! 然後將該編譯完成的參數檔案儲存下來,未來就可以直接將該檔案叫出來讀入了! 所以花多一點時間安裝一次就好!那也是相當值得的!

    核心的編譯與安裝
    做完核心項目的選擇囉∼接下來呢?當然是編譯與安裝啦!核心的編譯與安裝很簡單啦!來看看吧!


    編譯的流程
    整個編譯的過程真的很簡單!作這個動作即可:
    [root@linux linux-2.6.14.2]# make clean
    # 將以前曾經進行過的 *.o 檔案刪除掉,這樣比較不會產生新舊版本的誤差!
    
    [root@linux linux-2.6.14.2]# make bzImage
    # 製作出核心檔案!這個重要!過程很長啊!而且那個是大寫的 I 喔!
    
    [root@linux linux-2.6.14.2]# make modules
    # 製作出模組相關的檔案!
    
    只要這三個動作,您的核心與模組就通通製作出來了!不過,製作出來的資料還是被放置在 /usr/src/linux-2.6.14.2 這個目錄下∼並沒有被放到系統的相關路徑中喔! 在上面的過程當中,如果有發生任何錯誤的話,那麼很可能是核心項目的挑選選擇的不好, 可能您需要重新以 make menuconfig 再次的檢查一下您的相關設定喔! 如果還是無法成功的話,那麼或許將原本的核心資料內的 .config 檔案,複製到您的核心原始檔目錄下, 然後據以修改,應該就可以順利的編譯出您的核心了。注意到,下達了 make bzImage 後, 最後的結果應該會像這樣:
    Root device is (3, 2)
    Boot sector 512 bytes.
    Setup is 7016 bytes.
    System is 1721 kB
    Kernel: arch/i386/boot/bzImage is ready  (#1)
    [root@linux linux-2.6.14.2]# ll arch/i386/boot/bzImage
    -rw-r--r--  1 root root 1770185 Dec  2 14:32 arch/i386/boot/bzImage
    
    如此一來,您就可以發現您的核心已經編譯好而且放置在 /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage 裡面囉∼那個就是我們的核心檔案!最重要就是他啦!我們等一下就會安裝到這個檔案哩! 然後就是編譯模組的部分囉∼ make modules 進行完畢後,就等著安裝啦! ^_^


    模組安裝時的注意事項:
    要強調的還是得強調,是這樣的,在上面的介紹裡,我們不是說過 Kernel 的外掛模組是放在 /lib/modules/`uname -r` 嗎?好了,那麼現在來想一想,如果你的『同一版本的核心編譯兩次』 的情況下,會怎樣?這是很可能的情況呢!怎麼說?萬一你的第一次的編譯沒有成功的話, 那總得編譯第二次吧?而由於第一次編譯完成之後,你的一些模組已經放在 /lib/modules/2.6.14.2 當中了( 以這一次我們使用的核心版本為例 ),那麼下次在編譯完成後,核心的模組還是會放在 /lib/modules/2.6.14.2 這個目錄下,那不是重複了嗎?有些模組會被重複放置,導致問題重重的∼ 因此上,如果同一個版本的核心被編譯兩次以上的話,那麼請將 /lib/modules 裡面的該版核心先移動掉吧!舉個例子來說,假如你的核心版本是 2.6.14.2 ,而又要對 2.6.14.2 重新編譯一次,那麼就必需要:
    [root@linux ~]# cd /lib/modules
    [root@linux modules]# mv 2.6.14.2 2.6.14.2.old
    
    這樣才行呢!不然安裝之後還是會有問題的呦!請特別留意呢!

    處理完畢後,開始要安裝模組了∼安裝的方法很簡單,直接這樣做就好了!
    [root@linux linux-2.6.14.2]# make modules_install
    
    整個模組就安裝到 /lib/modules 裡面去喔∼一般來說,目錄名稱會是 /lib/modules/2.6.14-2 ,但是如果您有填寫核心附版本的話, 就會出現類似 2.6.14-1.1644_FC4 之類的目錄名稱囉! ^_^ 接下來,就是準備要進行核心的安裝了!哈哈!又跟 grub 有關囉∼


    安裝舊版與新版的核心成多重開機系統
    在編譯好核心之後,我們已經知道核心檔案放置在 /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage ,而我們也曉得一部主機是可以做成多重開機系統的!這樣說,應該知道鳥哥想要幹嘛了吧? 呵呵!對啦!我們將同時保留舊版的核心,並且新增新版的核心在我們的主機上面。

    這樣做有什麼好處呢?最大的好處是可以確保能夠順利開機啦!因為核心雖然被編譯成功了, 但是並不保證我們剛剛挑選的核心項目完全適合於目前這部主機系統, 可能有某些地方我們忘記選擇了,這個將導致新核心無法順利驅動整個主機系統,更差的情況是, 您的主機無法成功開機完成!此時,如果我們保留舊的核心, 呵呵!若新核心測試不通過,就用舊核心來啟動啊!嘿嘿!保證比較不會有問題嘛!

    另外,不要忘記製作 initrd 這個初始化虛擬磁碟,因為目前有很多朋友都是使用 LVM 檔案系統, 或者是 RAID, SATA, SCSI 等磁碟類型,如果沒有建立這個檔案的話,那妳的 Linux 可能無法開機成功。 詳細的 initrd 說明請參考 Loader 與 initrd 的相關性說明。 建立的方法很簡單,這樣做就好了:
    [root@linux ~]# mkinitrd  /boot/initrd_2.6.14.2  2.6.14.2
    # 此時會產生新檔案 /boot/initrd_2.6.14.2 喔!
    # 且這個動作需要在安裝好模組之後進行才會生效!
    
    關於多重開機的設定詳情請參考 開機關機流程與 Loader 那一章,我這裡不詳細的說明了。我只假設您與我一樣使用 grub 開機管理程式, 那麼只要這樣做,就能夠設定好您的新核心了!
    1. 移動新核心到 /boot 裡面去:
    [root@linux ~]# cp /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage \
    > /boot/vmlinuz-2.6.14-2
    # 就一般的習慣而言,鳥哥建議您將核心檔名設定成以 vmlinuz 為首的名稱,
    # 比較容易管理啦!
    [root@linux ~]# cp /usr/src/linux-2.6.14.2/System.map \
    > /boot/System.map-2.6.14-2
    
    2. 修改 grub 設定檔
    [root@linux ~]# vi /boot/grub/menu.lst
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title VBird linux 2.6.14-2
            root (hd0,0)
            kernel /vmlinuz-2.6.14-2 ro root=/dev/hda2 rhgb quiet vga=788
            initrd /initrd_2.6.14.2
    title Fedora Core (2.6.11-1.1369_FC4)
            root (hd0,0)
            kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda2 rhgb quiet vga=788
            initrd /initrd-2.6.11-1.1369_FC4.img
    # 這個是鳥哥我的個人環境,您請依照您的主機系統來編寫這個檔案!
    
    嘿嘿!這樣才算成功的完成了整個核心的編譯與安裝∼接下來呢? 當然就是 reboot 去測試一下新核心是否可以順利的啟動您的系統啦! 加油的啦! ^_^

    額外(單一)模組編譯:
    我們現在知道核心所支援的功能當中,有直接編譯到核心內部的,也有使用外掛模組的,外掛模組可以簡單的想成 就是驅動程式 啦!那麼也知道這些核心模組依據不同的版本, 被分別放置到 /lib/modules/`uname -r`/ 目錄中,各個硬體的驅動程式則是放置到 /lib/modules/`uname -r`/kernel/drivers/ 當中!而這些模組與裝置代號的對應, 就必須要被寫入 /etc/modprobe.conf 檔案當中了。更多與 modprobe.conf 的資料請參考 開機流程與 loader 章節囉!

    另外,關於模組的管理方面,我們也已經在 開機流程與 loader 當中稍微提過了。事實上,我們的 Linux 核心真的是越來越聰明了, 一般來說,當我們的軟體有使用到核心的某項功能時,其實核心是會『主動的』去載入該功能的! 根本不需要使用什麼 modprobe 還是 insmod 之類的指令去載入呢!不過,有時候某些程式寫的不好時, 確實可能需要我們手動來載入模組就是了。

    那麼在 Linux kernel 2.6 版裡面的模組檔名是怎樣呢?這個得要特別說明一下囉。在 kernel 2.4 版以前,模組的檔名都是 *.o 的,例如 vfat.o 這個檔案系統模組就放在: 但是在 kernel 2.6 版以後,所有的核心模組都被改名字成為 *.ko 了!所以,如果你有 vfat 的模組, 他就會被放置到: 請特別留意這個差異喔! ^_^。此外,由於我們的核心原本就有提供很多的核心工具給硬體開發商來使用, 而硬體開發商也需要針對核心所提供的功能來設計他們的驅動程式模組,因此, 我們如果想要自行使用硬體開發商所提供的模組來進行編譯時,就需要使用到核心所提供的原始檔當中, 所謂的標頭檔案 (header include file) 來取得驅動模組所需要的一些函式庫或標頭的定義啦! 也因此我們常常會發現到,如果想要自行編譯核心模組時,就得要擁有核心原始碼嘛!

    那核心原始碼我們知道他是可能放置在 /usr/src/ 底下,早期的核心原始碼被要求一定要放置到 /usr/src/linux/ 目錄下,不過,如果您有多個核心在一個 Linux 系統當中,而且使用的原始碼並不相同時, 呵呵∼問題可就大了!所以,在 2.6 版以後,核心使用比較有趣的方法來設計他的原始碼放置目錄, 那就是以 /lib/modules/`uname -r`/build 及 /lib/modules/`uname -r`/source 這兩個連結檔來指向正確的核心原始碼放置目錄。如果以我們剛剛由 kernel 2.6.14.2 建立的核心模組來說, 那麼他的核心模組目錄底下有什麼咚咚?
    [root@linux ~]# ls -l /lib/modules/2.6.14.2/
    lrwxrwxrwx  1 root root     23 Dec  2 15:45 build -> /usr/src/linux-2.6.14.2
    drwxr-xr-x  9 root root   4096 Dec  2 15:46 kernel
    -rw-r--r--  1 root root 216725 Dec  2 15:46 modules.alias
    -rw-r--r--  1 root root     69 Dec  2 15:46 modules.ccwmap
    -rw-r--r--  1 root root 176206 Dec  2 15:46 modules.dep
    -rw-r--r--  1 root root    739 Dec  2 15:46 modules.ieee1394map
    -rw-r--r--  1 root root    206 Dec  2 15:46 modules.inputmap
    -rw-r--r--  1 root root  16383 Dec  2 15:46 modules.isapnpmap
    -rw-r--r--  1 root root 175001 Dec  2 15:46 modules.pcimap
    -rw-r--r--  1 root root  83299 Dec  2 15:46 modules.symbols
    -rw-r--r--  1 root root 231507 Dec  2 15:46 modules.usbmap
    lrwxrwxrwx  1 root root     23 Dec  2 15:45 source -> /usr/src/linux-2.6.14.2
    
    其中比較有趣的除了那兩個連結檔之外,還有那個 modules.dep 檔案也挺有趣的, 那個檔案是記錄了核心模組的相依屬性的地方,依據該檔案,我們可以簡單的使用 modprobe 這個指令來載入模組呢!至於核心原始碼提供的標頭檔,在上面的案例當中, 則是放置到 /usr/src/linux-2.6.14.2/include/ 目錄中,當然就是藉由 build/source 這兩個連結檔案來取得目錄所在的啦!^_^


    單一模組編譯
    想像兩個情況: 很有趣對吧!不過,在這樣的情況下其實沒有什麼好說的,反正就是 『去取得原始碼後,重新編譯成為系統可以載入的模組』啊!很簡單,對吧!^_^ 但是,上面那兩種情況的模組編譯行為是不太一樣的,不過,都是需要 make, gcc 以及核心所提供的 include 標頭檔與函式庫等等。


  • 硬體開發商提供的額外模組:
  • 很多時候,可能由於核心預設的核心驅動模組所提供的功能您不滿意, 或者是硬體開發商所提供的核心模組具有更強大的功能, 又或者該硬體是新的,所以預設的核心並沒有該硬體的驅動模組時,那您只好自行由硬體開發商處取得驅動模組, 然後自行編譯囉!

    如果您的硬體開發商有提供驅動程式的話,那麼真的很好解決,直接下載該原始碼,重新編譯, 將他放置到核心模組該放置的地方後,呵呵!就能夠使用了!舉例來說,如果您不想使用核心原本提供的 Intel 網路卡模組,而想使用 Intel 官方釋出的最新模組,例如下面這個例子: 您可以利用各種方法將他下載後,假設這個檔案放置到 /root ,那麼直接將他解壓縮吧! 之後就可以讀一讀 INSTALL/README ,然後找一下 Makefile ,就能夠編譯了。整體流程有點像這樣:
    1. 將檔案解壓縮:
    [root@linux ~]# cd /usr/local/src
    [root@linux src]# tar -zxvf /root/e100-3.4.14.tar.gz
    [root@linux src]# cd e100-3.4.14
    
    2. 開始進行編譯與安裝:
    [root@linux e100-3.4.14]# vi README  <==注意查一下該檔案內容
    [root@linux e100-3.4.14]# cd src
    [root@linux src]# make
    # 此時您會看到出現如下這一行:
    # make[1]: Entering directory `/usr/src/kernels/2.6.13-1.1532_FC4-i686'
    # 這代表這個驅動程式在編譯時,會去讀取的核心原始碼 include file
    # 的目錄所在!有興趣的朋友,務必查閱一下 Makefile 啦!
    [root@linux src]# ls -l
    -rw-r--r--  1 root root  77908 Jul  2 08:24 e100.c
    -rw-r--r--  1 root root 351351 Dec  5 00:48 e100.ko
    -rw-r--r--  1 root root   4775 Dec  5 00:48 e100.mod.c
    -rw-r--r--  1 root root  39684 Dec  5 00:48 e100.mod.o
    -rw-r--r--  1 root root 312564 Dec  5 00:48 e100.o
    -rw-r--r--  1 root root  21092 Jul  2 08:24 ethtool.c
    -rw-r--r--  1 root root  43258 Jul  2 08:24 kcompat.h
    -rw-r--r--  1 root root   9610 Jul  2 08:24 Makefile
    
    3. 開始將該模組移動到核心目錄,並且更新模組相依屬性!
    [root@linux src]# cp e100.ko  \
    > /lib/modules/`uname -r`/kernel/drivers/net
    [root@linux src]# cd /lib/modules/`uname -r`
    [root@linux 2.6.13-1.1532_FC4]# depmod -a
    
    有趣吧!透過這樣的動作,我們就可以輕易的將模組編譯起來,並且還可以將他直接放置到核心模組目錄中, 同時以 depmod 將模組建立相關性,未來就能夠利用 modprobe 來直接取用啦!^_^ 但是需要提醒您的是,當自行編譯模組時, 若您的核心有更新 (例如利用自動更新機制進行線上更新) 時,則您必須要重新編譯該模組一次, 重複上面的步驟!才行!因為這個模組僅針對目前的核心來編譯的啊!對吧!


  • 利用舊有的核心原始碼進行編譯:
  • 舉個例子來說,鳥哥目前 FC4 的核心就是 2.6 版,而且也有 NTFS 的原始碼,只不過, FC4 就是沒有將這個模組給他編譯起來!那我能否使用目前的核心原始碼進行 NTFS 檔案系統的模組編譯呢?當然可以啊!不過,我是否需要整個核心編譯的過程從頭來一次呢? 呵呵!當然不需要啊!否則∼多麻煩∼那該怎麼作?

    很簡單啦∼我們首先到目前的核心原始碼所在目錄下達 make menuconfig , 然後將 NTFS 的選項設定成為模組,之後直接下達:
      make fs/ntfs/
    那麼 ntfs 的模組就會自動的被編譯出來了!可惜的是,預設的 FC4 核心原始碼並沒有附上所有的程式碼, 僅有提供相關的 Makefile 檔案而已,傷腦筋∼ 因此,您僅能以我們剛剛才建立的 /usr/src/linux-2.6.14.2 這個目錄, 直接下達 make fs/ntfs 來建立起 ntfs.ko 這個模組∼ 然後將該模組複製到 /lib/modules/2.6.14.2/kernel/fs/ntsf/ 目錄下, 再去到 /lib/modules/2.6.14.2 底下執行 depmod -a ,呵呵∼ 就可以在原來的核心底下新增某個想要加入的模組功能囉∼ ^_^


    核心模組管理: lsmod, modinfo, modprobe, insmod, rmmod...
    核心與核心模組是分不開的,至於驅動程式模組在編譯的時候,更與核心的原始碼功能分不開∼ 因此,您必須要先瞭解到:核心、核心模組、驅動程式模組、核心原始碼與標頭檔案的相關性, 然後才有辦法瞭解到為何編譯驅動程式的時候老是需要找到核心的原始碼才能夠順利編譯! 然後也才會知道,為何當核心更新之後,自己之前所編譯的核心模組會失效∼

    此外,與核心模組有相關的,還有那個很常被使用的 modprobe 指令, 以及開機的時候會讀取到的模組定義資料檔案 /etc/modprobe.conf , 這些資料您也必須要瞭解才行∼相關的指令說明我們已經在開機流程與 loader 文章內談過了, 您應該要自行前往瞭解喔! ^_^

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

    2002/05/29:第一次完成
    2003/02/11:重新編排與加入 FAQ
    2004/06/11:原本的 2.4.xx 版本核心被移動到 此處
    2005/11/15:原本的模組管理已經先移動到開機流程管理那一篇囉!
    2005/12/05:經過將近一個月,呵呵!終於給他整理出來這一篇了∼真難得∼
    2007/06/27:增加了 initrd 的簡單說明,詳細還是得看 loader 那一章。