Linux 基礎學習篇 - Mandrake 9

第十九章、核心 (kernel) 譯與模組管理 - for Mandrake 9

鳥哥的第一本書籍的主要內容,內容稍微與書籍不太一樣了!

最近更新時間: 2003/02/11

鳥哥的第一本書大約是在 2002 年的年底左右出版的,內容幾乎都是 Linux 基礎學習,一點也沒有談到伺服器的部份!這也是後來的雛型! 不過內容錯誤的地方很多,導致在 2003 年的年底推出了『基礎學習篇增訂版』的內容,大致上就是處理掉一些比較有嚴重錯誤的部份。 不過,因為 Linux 的版本變化非常快速,因此,寫完了這些文件之後,鳥哥還是持續在網站上更新文件內容,導致原本書籍內容的資料與網站資料差異太大! 這個問題直到鳥哥在 2008 年左右才發現!糟糕了!舊版的文件資料已經遺失~覺得相當扼腕~

因此,在底下的文件內容與當初的書籍內容雖然大同小異,不過章節的編排卻是有所不同!再花時間去一個一個處理,似乎也不太符合成本效益! 鳥哥僅是想要將自己以前的文件記錄下來而已,同時將過時的 big5 編碼改回 utf8 編碼,再加上可以支援 RWD 的樣式而已啦! 內容已經不多做編排~因此,如果內容文件你看不懂,那也是應該的! ^_^

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。最新文章請前往鳥站首頁查閱囉!

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

什麼是核心( Kernel )

  • Linux Distribution:

  • 如果您已經從前面一路走來都沒有休息的話,那麼問您一個問題好了,那就是『什麼是 Linux distribution ?』呵呵!應該還沒有忘記吧? Linux distribution 就是各個開發 Linux 這個作業系統的公司所丟出來的安裝光碟啦!舉個截至目前為止(2002/10)市場佔有率蠻高的幾個套件,例如: Red Hat, Mandrake, OpenLinux(Caldera) 等等,這些都是開發 Linux 作業系統的公司!好了,那麼怎麼這麼多家公司呀!那他們都是 Linux 嗎?沒錯!他們都是相同的使用 Linux 的『核心』來進行套件的開發的!也就是說,他們『本質』上都是一樣的!比較不同的地方可能是他們使用的套件不同或者是新加入的某些工具不同而已!基本上,他們都是 Linux !所以囉,認真的學習某一個 distribution 也就夠了!其他的 distribution 絕大部分都是相同的耶!
  • Kernel:

  • 那麼到底什麼是核心呢?還記得我們在前面的 BASH shell 部分提到過:電腦真正在工作的東西其實是『硬體』,不是 Windows 、不是 Linux 也不是 Unix!其實就是 CPU 啦、記憶體啦、硬碟啦、音效卡啦、網路卡啦、、等等的硬體配備,那麼如何控制這些硬體呢?那就是核心的工作了!也就是說,核心是一個『作業系統』最底層的咚咚啦!你所希望電腦幫你達成的各項工作,都需要透過『核心』的幫助才行!當然囉,如果你想要達成的工作是核心所沒有辦法提供的,那麼你自然就沒有辦法透過核心來控制電腦使他工作囉!又如果你想要有網路功能(例如 NAT 服務),但是你的核心偏偏忘記加進去這項功能,那麼不論你如何『賣力』的設定該網路套件,很抱歉!不來電??換句話說,你想要讓電腦進行的工作,都必須要『核心有支援』才可以!!這個標準不論在 Windows 或 Linux 這幾個作業系統上都相同!如果有一個人開發出來一個『全新的硬體』,目前的核心不論 Windows 獲 Linux 都不支援,呵呵!那麼不論你用什麼系統,哈哈!這個硬體都是英雄無用武之地啦!那麼是否瞭解了『核心』的重要了呢?沒錯!所以我們需要來瞭解一下如何編譯我們的核心啦!
     
    關於驅動程式與核心的問題:很多朋友常常感到困惑的,就是 Linux 上面針對最新硬體的驅動程式總是慢了幾個腳步,所以覺得好像 Linux 的支援度不足!其實不可以這麼說的,為什麼呢?因為在 Windows 上面,對於最新硬體的驅動程式需求,基本上,也都是廠商提供的驅動程式才能讓該硬體工作的,因此,在這個『驅動程式開發』的工作上面來說,應該是屬於硬體發展廠商的問題,因為他要我們買他的硬體,自然就要提供消費者能夠使用的驅動程式啦!所以,如果大家想要讓某個硬體能夠在 Linux 上面跑的話,那麼似乎可以發起一人一信的方式,強烈要求硬體開發商發展 Linux 上面的驅動程式!這樣一來,也可以促進 Linux 的發展呢!
  • Linux 核心放在哪裡?

  • 好問題!那麼 Linux 核心放在哪裡呢?嘿嘿!還記得我們之前在安裝 Red Hat 7.2 裡頭就提過了吧!而且在開機的流程裡頭也有說明過,那個開機的順序是:
     
    1. BIOS
    2. MBR(就是 Lilo 或 Grub )取得 boot loader;
    3. 取得核心 kernel 的資料並載入
    4. init
    5. 很多 scripts
    6. login 與 shell
     
    看到了吧!那個第三步驟就需要 kernel 囉!那個 kernel 其實就是 lilo.conf 裡頭說的 image 指到的那個檔案,也就是 vmlinuz 這個檔案啦!放置在 /boot 裡頭!我們需要的編譯出來的核心檔案就是這一個東西!除此之外,由於近來的核心通常是支援模組的,那個外掛模組則是放置在 /lib/modules/`uname -r` 裡面囉!

我幹嘛要更新核心

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

核心的版本與何處下載最新核心

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

  • 要更新核心自然就得知道目前我的核心是哪一個囉!然後才能拿更新的核心來更新呀!您說是吧!那麼在哪裡找到這個核心的資訊呢?應該還記得那個 uname 查看的資訊吧!沒錯!就是他了,可以使用其功能來查詢目前在工作的核心版本:
     
    [test @test test]# uname -r
    2.4.7-10      <==這個是 Red Hat 7.2 的預設核心版本!
     
    看到了吧!那個東西就是核心版本的資訊啦!好了!我們依照 RPM 版本的先例,也來談一談 kernel 的版本吧!基本上, kernel 的版本可以分為:
      [主版本].[次版本].[修訂版本]-[附版本]
    在這當中,需要特別留意的屬於第二個那個[次版本]囉!
    • 如果次版本是奇數的話,例如 2.3, 2.5 等等,那表示他是一個『測試性質功能的核心版本』,這種核心通常是在推出穩定版本的核心之前,用來給 developer (核心維護更新測試者!)測試用的!雖然功能較為強大,但是由於是屬於測試性質,所以可能會有些許的 bug 也說不定;
    • 如果次版本是偶數的話,例如 2.2, 2.4 等等,那表示他是一個經過測試之後才釋出的穩定核心版本,這種核心較為穩定不容易出錯,比較適合一般個人或者是商業使用!
    所以啦!我們要升級的時候,大多就是使用那種偶數的核心版本啦!不過這裡還是要再提一遍!就是『2.2 與 2.4 是兩個具有相當大差異的核心版本,兩者之間使用到的函式庫基本上已經不相同了,所以在升級之前,如果您的核心原本是 2.2.xx 版(Red Hat 6.x 系列),那麼就升級到 2.2.xx 版本的最新版,不要由 2.2.xx 直接升級到 2.4.xx 版,否則到時可能會欲哭無淚~~』,這個問題在討論區一再地被提起!這裡再次說明!
    此外, 2.2.xx 與 2.4.xx 的比較中,並不是 2.4.xx 就一定比 2.2.xx 還要新,因為這兩種版本同時在進行維護與升級的工作!如果有興趣的話,可以前往 Linux 核心網站 http://www.kernel.org 一看究竟,您就可以瞭解目前的核心變動情況了!另外,再提到額外的一點,就是 2.2 可以升級到 2.3 版本,這是因為這兩個是互相援用的,在 2.3 測試成功之後,就將他轉成 2.2 的版本,所以兩者的函式庫使用的情況是約略相同的,這個情況也可以使用在 2.4.xx 與 2.5.xx 版本之中!也就是說,您的 Red Hat 7.x 的 2.4.xx 版本可以升級到 2.5.xx 版本去呦!但是您的 Red Hat 6.x 的 kernel 2.2.xx 則僅能更新到最新的 2.2.xx 或者是 2.3.xx ,強烈的建議不需要更新到 2.4.xx ~~再次不厭其煩的提醒大家~
    好了!既然 Red Hat 7.1 ~ 7.3 使用的是 kernel 2.4.xx 版本,我們又需要的是穩定型態的 2.4.xx 版本,再由 http://www.kernel.org 網站資料上發現,截至目前為止( 2002/05/23 ),最新的核心是 2.4.18 這一個,所以,您可以前往下載這一個版本的核心,當然也可以由本站下載呢!嗯!底下的各個選項的擇定,我們都是以這一個版本為例呦!需要特別的注意!由於較新的核心版本可能會多出一些選項,因此若有不同的項目也沒有關係!稍微查看一下說明內容就可以瞭解啦!
  • 核心下載地點

  • Linux 的核心目前是由其發明者 Linus 所屬團隊在負責維護的,而其網站在底下的站址上,在該網站上可以找到最新的 kernel 資訊!不過,美中不足的是目前的核心越來越大了( linux-2.4.18.tar.gz 這一版,這一個檔案大約 30MB 了!),所以如果你的 ISP 連外很慢的話,那麼使用台灣的映射站台來下載不失為一個好方法:
    基本上,就如同前面所說的,最好是在系統安裝完畢之後馬上就進行核心編譯工作,免得以後每次裝一些特定功能的時候又要花一大輪時間編譯。另外要說明的,由於小弟是以 2.4.18 這一版的核心來做升級的動作,所以以下是以 2.4.18 來做示範!

開始設定核心的內容

    由於 VBird 都是在安裝完 Linux 之後立刻就給他編譯核心的,所以通常我都是直接將該核心檔案燒錄起來,或者是先捉到自己的電腦中,再以 ftp 等等的動作將該檔案傳輸到 Linux 系統下!好了!目前我就假設您已經可以上網了,所以您可以使用底下的方式來下載核心,並將之解開在 /usr/src 當中!此外,由於編譯核心的行為必須要是 root 才可以進行,所以底下的動作使用者身份為 root 呦!
     
    1. 下載核心:
    [root @test /root]# wget http://aerosol.ev.ncku.edu.tw/~vbird/download/linux-2.4.18.tar.gz <==由本站下載核心
    --02:55:31--  http://aerosol.ev.ncku.edu.tw/%7Evbird/download/linux-2.4.18.tar.gz
               => `linux-2.4.18.tar.gz'
    Connecting to aerosol.ev.ncku.edu.tw:80... connected!
    HTTP request sent, awaiting response... 200 OK
    Length: 30,108,170 [application/x-gzip]

        0K .......... .......... .......... .......... ..........  0% @  49.65 KB/s
       50K .......... .......... .......... .......... ..........  0% @  26.25 KB/s
      100K .......... .......... .......... .......... ..........  0% @  39.90 KB/s

    最後在您的 /root 底下會產生一個名為 linux-2.4.18.tar.gz 的檔案!那就適合新的 source 了!

    2. 解壓縮:
    [root @test /root]# cd /usr/src              <==kernel 的預設 source 檔案放置目錄
    [root @test /src]# mv linux linux.old           <==將舊的核心編譯的目錄搬移成其他目錄
    [root @test /src]# tar -zxvf /root/linux-2.4.18.tar.gz  <==將核心檔案解壓縮吧!
    [root @test /src]# mv linux linux-2.4.18
    [root @test /src]# ln -s linux-2.4.18 linux        <==建立連結!

    需要比較留意的是,核心所放置的地點『一定是 /usr/src/linux』這一個目錄,然而由於不論哪一版核心編譯都是這一個目錄底下編譯的,所以我個人相當的建議將每一版的核心都使用不同的目錄來指定,然後以 link 的方式將該目錄 link 到 linux 就可以啦!較為簡單而且明瞭!底下的動作請都在 /usr/src/linux 底下進行呦!

    另外,在開始設定核心內容之前,先來說明一下什麼是『模組』?以方便大家瞭解核心編譯的選擇!由於核心的更新速度雖然很快,然而有些硬體的出版卻是不定時的,另外,有些軟體需要的載入程式可能也需要核心的支援才有辦法提供!然而如果每次一有新的硬體或者軟體推出,則需要編譯一次核心,那不是挺麻煩的嗎?要曉得的是,編譯一次核心小一點的也要 30 分鐘左右(這與你的機器速度有關!),每次這麼編譯不是挺麻煩的嗎?所以囉,就有所謂的『模組』出現了!由於目前的核心已經都具有『外掛模組』的功能(這個等一下我們在實際編譯的時候會提到!),所以,只要將您『可能會用到』的功能的選項,將他編譯成模組!那麼往後真的需要該功能的時候,再將他載入到核心就可以啦!這麼做最大的優點就是,當沒有使用到該功能的時候,核心並不會主動的載入,所以真正在核心內工作的程序就不會太多而耗掉系統資源!另外,當您目前不需要的功能可以先編譯成模組,未來真的有需要的時候,就可以將他直接載入!嘿嘿!可以免除再一次編譯的繁複手續呢!!很棒吧!所以囉!如果可以編譯成為模組的,那麼就直接先編成模組也是可以的哩!但是,如果是『肯定不會』使用到的功能,那麼就不需要編譯進來了!例如我的舊電腦當中根本就沒有 AGP 插槽,那麼我自然就不需要在我的核心裡面編譯上 AGP 的支援囉!
  • 編譯之前

  • 在 Linux 當中安裝任何軟體的鐵則:『注意看套件解壓縮之後的 INSTALL 或 README 檔案!』,好了,那麼請進入 /usr/src/linux 當中去瞧一瞧 README 先!再來,由於害怕不小心前面有人已經先編譯過了核心,則由於編譯過程當中會產生目的檔案(檔名為 .o ),為了避免此一問題,請先執行 make mrproper 這個指令:
     
    [root @test linux]# make mrproper
    ......
    會顯示相當多的 rm 去除檔案的訊息....

    好了!現在您就已經具有相當完整的 Kernel source code 囉!接著下來則是選擇編譯模式咯!

  • 特別留意:

  • 很奇怪呦!我老是寫『特別留意』的字樣?真是傷腦筋,鳥哥大概算老人了吧,粉容易碎碎唸的….好啦,要強調的還是得強調,是這樣的,在上面的介紹裡,我們不是說過 Kernel 的外掛模組是放在 /lib/modules/`uname –r` 嗎?好了,那麼現在來想一想,如果你的『同一版本的核心編譯兩次』的情況下,會怎樣?這是很可能的情況呢!怎麼說?萬一你的第一次的編譯沒有成功的話,那總得編譯第二次吧?而由於第一次編譯完成之後,你的一些模組已經放在 /lib/modules/2.4.18 當中了( 以這一次我們使用的核心版本為例 ),那麼下次在編譯完成後,核心的模組還是會放在 /lib/modules/2.4.18 這個目錄下,那不是重複了嗎?有些模組會被重複放置,導致問題重重的~因此上,如果同一個版本的核心被編譯兩次以上的話,那麼請將 /lib/modules 裡面的該版核心先移動掉吧!舉個例子來說,假如你的核心版本是 2.4.18 ,而又要對 2.4.18 重新編譯一次,那麼就必需要:
     
      cd /lib/modules
      mv 2.4.19 2.4.19.old
     
    這樣才行呢!不然安裝之後還是會有問題的呦!請特別留意呢!
  • 設定編譯模式

  • 目前的 Kernel 可以允許多種編譯的模式,包括了:
    • make config :這種模式需要逐行輸入所需要設定的項目,無法往前修改設定,所以目前很少使用這種方式來設定 Kernel 的項目了;
    • make xconfig :這種模式則是使用 X-Window 為主要環境的設定模式!除非你有 X-Window 在執行,否則沒有辦法使用這種模式;
    • make menuconfig :這種模式有點像是文字界面的選單模式,較為簡便,而且可以在純文字界面下面執行編輯動作!是目前最常使用的模式。
    由於我們是在文字介面下工作,因此,我們就使用 make menuconfig 來進行核心的編譯設定內容吧!這個選單模式較為簡單的啦!
     
    [root @test linux]# make menuconfig

    出現如下圖示:
     

     
    看到上面的圖示之後,你會發現有兩個畫面,一個是大框框內的反白光柱,另一個則是底下的 Select, Exit, 與 Help 游標,這幾個元件的用法如下:

    • 最底下的 <Select> <Exit> <Help> :可以使用『左右鍵』來移動游標;
    • 上下鍵可以移動上面大框框部分的 Code maturity level options 那一行!,有箭頭『 ---> 』則表示該行內部還有其他細項需要來設定的意思。
    • 當以『上下鍵』選擇好想要設定的項目之後,並以『左右鍵』選擇 <Select> 之後,按下『 Enter 』就可以進入該項目去作更進一步的細部設定囉!
    • 在細部項目的設定當中,如果前面有 [ ] < > 符號時,該項目才可以選擇,而選擇可以使用『空白鍵』來選擇;
    • 若為 [*] <*> 則表示編譯進核心;若為 <M> 則表示編譯成模組!盡量在不知道該項目為何時,且有模組可以選,那麼就可以直接選擇為模組囉!
    • 當在細項目選擇 <Exit> 後,並按下 Enter ,那麼就可以離開該細部項目囉!
    基本上建議只要『上下左右 空白 及 Enter 』這六個按鍵就好了!不要使用 Esc ,否則一不小心就有可能按錯的!
  • 開始設定

  • 底下的設定項目非常的多,其中,如果您使用的是比 2.4.18 還要新的版本時,那麼有可能會出現更多的選項!如果不確定選項的內容是什麼?請千萬以 Help 進入看一下該項目的設定值,如果還是不清楚怎麼辦?那麼就直接以 Kernel 的預設值保留即可!我在底下的設定中,僅列出個人認為比較重要的項目,其他的項目您就得自己看一下囉?其實,基本上,只要底下這些項目您都瞭解之後,那麼核心編譯大抵上就沒有很嚴重的困擾囉!
     
    [root @test linux]# make mrproper   <==去除 .o 的編譯過的檔案
    [root @test linux]# make menuconfig  <==以文字選單的模式進行編譯!
    底下開始編譯!
    Code maturity level options  --->                  <==關於核心測試功能的 code 開啟項目;
            [ ] Prompt for development and/or incomplete code/drivers  <==因為我們沒有要研發核心,所以不選
    Loadable module support  --->                    <==這個就是我們之前說的『模組』啦!
        [*] Enable loadable module support              <==讓核心可以載入模組項目(必選)
            [ ]   Set version information on all module symbols      <==這個除非你要使用舊版本的資料,通常不選!
        [*]   Kernel module loader                 <==也是必選啦!
    Processor type and features  --->                  <==選擇 CPU 的型號項目
            (Pentium-MMX) Processor family               <==請依照您的實際情況選擇您的 CPU 型號
            < > Toshiba Laptop support                  <==底下這兩個有使用到(筆記型電腦)才選擇!
            < > Dell laptop support
            <M> /dev/cpu/microcode - Intel IA32 CPU microcode support  <==如果是使用 Intel 的,可以編譯成模組
            <M> /dev/cpu/*/msr - Model-specific register support    <==如果是使用 Intel 的,可以編譯成模組
            <M> /dev/cpu/*/cpuid - CPU information support       <==如果是使用 Intel 的,可以編譯成模組
            (off) High Memory Support                  <==這個東西跟你的 RAM 有關係,RAM小於 1 GB 則使用 off 即可
            [ ] Math emulation                      <==是否需要數值模擬?當然不需要!我們的 CPU 都夠強了!
            [ ] MTRR (Memory Type Range Register) support         <==P6 (PII等級以上) 並且要跑 X-Window 才加上吧,與 AGP 有關
        [ ] Symmetric multi-processing support            <==如果是雙 CPU 的主機板才選擇!否則就不要選了!
            [*] Local APIC support on uniprocessors (NEW)         <==如果你的 CPU 有支援 APIC 則選擇!通常可以選擇起來啦!
            [*] IO-APIC support on uniprocessors             <==跟上面的理由一致!選擇起來吧!
    General setup  --->                         <==一般設定部分
        [*] Networking support                 <==底下四個一定要選,跟基本的硬體裝置有關!
        [*] PCI support
            (Any)   PCI access mode
        [*] PCI device name database
            [ ] EISA support                   <==底下這兩個則與主機板上面的插槽有關!除非筆記型,否則不選
            [ ] MCA support
            [*] Support for hot-pluggable devices         <==有點類似隨插即用吧!可以選擇呦!
            PCMCIA/CardBus support  --->
                    < > PCMCIA/CardBus support          <==因為我沒有筆記型,所以不選,若為筆記型電腦,請選擇!
            PCI Hotplug Support  --->
            [*] System V IPC                   <==底下這三個東西對於效能都不錯!可以選擇呦!
            [*] BSD Process Accounting
            [*] Sysctl support
            (ELF) Kernel core (/proc/kcore) format        <==底下這幾個東西可以編譯成模組啦!但是我直接編到核心囉!
            <*> Kernel support for a.out binaries
            <*> Kernel support for ELF binaries
            <*> Kernel support for MISC binari
            [*] Power Management support
            < >   Advanced Power Management BIOS support     <==如果你想要你的 BIOS 接管電源管理,可以選擇!我是不選的啦!
    Memory Technology Devices (MTD)  --->
            < > Memory Technology Device (MTD) support      <==沒必要就不要選吧!
    Parallel port support  --->
        < > Parallel port support        <==由於我的主機上面並沒有接印表機,所以沒選!如果你有印表機的話,一定要選擇
    Plug and Play configuration  --->
            <*> Plug and Play support        <==底下兩個 隨插即用! 馬上勾選!
            <*>   ISA Plug and Play support     
    Block devices  --->               <==一些比較冷門的儲存機器!如果不確定的話,直接編譯成模組吧!沒關係的!
            <*> Normal PC floppy disk support
           < > XT hard disk support
            < > Compaq SMART2 support
            < > Compaq Smart Array 5xxx support
            < > Mylex DAC960/DAC1100 PCI RAID Controller support
            < > Loopback device support
            < > Network block device support
            < > RAM disk support
    Multi-device support (RAID and LVM)  --->
            [ ] Multiple devices driver support (RAID and LVM)   <==除非要完 RAID (磁碟陣列)與 LVM ,否則不用選!
    Networking options  --->                  <==這一部份是最重要的除非特別強調,否則能編成模組就編成模組!
        <*> Packet socket
            [*]   Packet socket: mmapped IO
            <M> Netlink device emulation (NEW)
            [*] Network packet filtering (replaces ipchains)
            [ ]   Network packet filtering debugging (NEW)
            [*] Socket Filtering
            <*> Unix domain sockets
            [*] TCP/IP networking
            [*]   IP: multicasting
            [*]   IP: advanced router
            [*]     IP: policy routing (NEW)
            [*]       IP: use netfilter MARK value as routing key (NEW)
            [*]       IP: fast network address translation (NEW)
            [*]     IP: equal cost multipath (NEW)
            [*]     IP: use TOS value as routing key (NEW)
            [*]     IP: verbose route monitoring (NEW)
            [ ]     IP: large routing tables (NEW)
            [*]   IP: kernel level autoconfiguration
            [*]     IP: DHCP support (NEW)
            [*]     IP: BOOTP support (NEW)
            [*]     IP: RARP support (NEW)
           <M>   IP: tunneling
            <M>   IP: GRE tunnels over IP
            [*]     IP: broadcast GRE over IP (NEW)
            [*]   IP: multicast routing
            [*]     IP: PIM-SM version 1 support (NEW)
            [*]     IP: PIM-SM version 2 support (NEW)
            [*]   IP: TCP Explicit Congestion Notification support
            [*]   IP: TCP syncookie support (disabled per default)
              IP: Netfilter Configuration  --->            <==這就是防火牆機制裡頭的 iptables 啦!都編成模組!
                    <M> Connection tracking (required for masq/NAT) (NEW)
                    <M>   FTP protocol support (NEW)
                    <M>   IRC protocol support (NEW)
                    <M> IP tables support (required for filtering/masq/NAT) (NEW)
                    <M>   limit match support (NEW)
                    <M>   MAC address match support (NEW)
                    <M>   netfilter MARK match support (NEW)
                    <M>   Multiple port match support (NEW)
                    <M>   TOS match support (NEW)
                    <M>   AH/ESP match support (NEW)
                    <M>   LENGTH match support (NEW)
                    <M>   TTL match support (NEW)
                    <M>   tcpmss match support (NEW)
                    <M>   Connection state match support (NEW)
                    <M>   Packet filtering (NEW)
                    <M>     REJECT target support (NEW)
                    <M>   Full NAT (NEW)
                    <M>     MASQUERADE target support (NEW)
                    <M>     REDIRECT target support (NEW)
                    <M>   Packet mangling (NEW)
                    <M>     TOS target support (NEW)
                    <M>     MARK target support (NEW)
                    <M>   LOG target support (NEW)
                    <M>   TCPMSS target support (NEW)
                    <M> ipchains (2.2-style) support (NEW)
                    <M> ipfwadm (2.0-style) support (NEW)
            <M> The IPX protocol
            [ ]   IPX: Full internal IPX network (NEW)
            < > Appletalk protocol support
            < > DECnet Support
            < > 802.1d Ethernet Bridging
            QoS and/or fair queueing  --->
                    [ ] QoS and/or fair queueing
    Telephony Support  --->            <==這東西我也不知道怎麼玩~~
            < > Linux telephony support
    ATA/IDE/MFM/RLL support  --->      <==儲存界面的選擇!當然 IDE 一定要選的啦!! 裡面如果有看到屬於您的晶片組,請記得將他選擇起來!例如如果使用 VIA 的晶片組,那麼最後一項VIA82CXXX chipset support就一定要選擇起來呢!如果你是跟 VBird 一樣,使用較老舊的主機板,那麼就用系統預設值也就可以了!
            <*> ATA/IDE/MFM/RLL support
            IDE, ATA and ATAPI Block devices  --->
                    <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
                    <*>   Include IDE/ATA-2 DISK support
                    [*]     Use multi-mode by default
                    <*>   Include IDE/ATAPI CDROM support
                    ---- IDE chipset support/bugfixes
                    [*]   CMD640 chipset bugfix/support
                    [*]   RZ1000 chipset bugfix/support
                    [*]   Generic PCI IDE chipset support
                   [*]     Sharing PCI IDE interrupts support
                    [*]     Generic PCI bus-master DMA support
                    [*]       Use PCI DMA by default when available
                    [*]     Intel PIIXn chipsets supportt
                    [*]       PIIXn Tuning supportt
    SCSI support  --->        <==我的舊機器上並沒有安裝 SCSI 卡!我確定我不會使用到 SCSI ,但是如果你可能會安裝的話,請編譯!
            < > SCSI support
    Fusion MPT device support  --->
    I2O device support  ---> 
            < > I2O support
    Network device support  --->  <==仔細的將你的網路設備編譯進來吧!這個也很重要的!
            [*] Network device support
            <*> Dummy net driver support  <==這個一定要裝!但是請注意!如果你之前已經使用了 MRTG 了!這個裝完之後 MRTG 要重跑一次!
            <M> Bonding driver support
            <M> EQL (serial line load balancing) support
            <M> Universal TUN/TAP device driver support
            <M> General Instruments Surfboard 1000
            Ethernet (10 or 100Mbit)  ---> <==這裡面有相當多的卡,我只列出我要的卡而已!請選擇你自己的網路卡呦!
                    [*] Ethernet (10 or 100Mbit)
                    [*]   EISA, VLB, PCI and on board controllers
                    <*>     EtherExpressPro/100 support
                    <M>     RealTek RTL-8139 PCI Fast Ethernet Adapter support
                    [*]       Use PIO instead of MMIO
                    [*]       Support for older RTL-8129/8130 boards
                    <M>     VIA Rhine support  <==這就是傳說中的 D-Link 530 那塊卡的驅動程式啦!
            <*> PPP (point-to-point protocol) support   <==這個一定要編進核心!不然就無法使用 ADSL 的 rp-pppoe 撥接囉!
            [*]   PPP filtering (NEW)
            <M>   PPP support for async serial ports (NEW)
            <M>   PPP support for sync tty ports (NEW)
            <M>   PPP Deflate compression (NEW)
            <M>   PPP BSD-Compress compression (NEW)
            <M>   PPP over ATM (EXPERIMENTAL) (NEW)
    Amateur Radio support  --->   <==底下這四個應該不需要安裝吧!?
    IrDA (infrared) support  --->
    ISDN subsystem  --->
    Old CD-ROM drivers (not SCSI, not IDE)  --->
    Input core support  --->  <==這個也編成模組就好囉!
            <M> Input core support
            <M>   Keyboard support
            <M>   Mouse support
            (1024)    Horizontal screen resolution (NEW)
            (768)    Vertical screen resolution (NEW)
            <M>   Joystick support
            <M>   Event interface support
    Character devices  --->   <==周邊設備的選項!最重要的地方在 AGP 的設定項目!因為我沒有 AGP 所以沒有設定!
            [*] Virtual terminal
            [*]   Support for console on virtual terminal
            <*> Standard/generic (8250/16550 and compatible UARTs) serial support
            [*] Unix98 PTY support
            <M> Mouse Support (not serial and bus mice)
            [*]   PS/2 mouse (aka "auxiliary device") support
            < > /dev/agpgart (AGP Support)  <==這個相當的重要!就是 AGP 顯示卡的支援核心!請選擇(若你有 AGP 的話!)
            [ ]   Intel 440LX/BX/GX and I815/I830M/I840/I850 support  <==下面的選項要上面的打勾之後才會出現!
            [ ]   Intel I810/I815/I830M (on-board) support               請特別留意選擇你的適合的主機板晶片組呢!
            [ ]   VIA chipset support 
            [ ]   AMD Irongate, 761, and 762 support 
            [ ]   Generic SiS support 
            [ ]   ALI chipset support 
            [ ]   Serverworks LE/HE support 
            [ ] Direct Rendering Manager (XFree86 DRI support)
            [ ]   Build drivers for old (XFree 4.0) DRM (NEW) 
            --- DRM 4.1 drivers 
            < >   3dfx Banshee/Voodoo3+ 
            < >   ATI Rage 128 
            < >   ATI Radeon 
            < >   Intel I810 
            < >   Matrox g200/g400 
            < >   SiS (NEW) 
            [ ] Direct Rendering Manager (XFree86 DRI support)
    Multimedia devices  --->
    File systems  --->      <==底下的選項主要在提供核心支援的檔案格式!相當的重要!如果忘記編入的話,系統可是會讀不到東西!
            [*] Quota support    <==沒有他! Quota 就無法起來!請選擇呦!
            <M> Kernel automounter support
            <*> Kernel automounter version 4 support (also supports v3)
            <M> Ext3 journalling file system support (EXPERIMENTAL)
            <M> DOS FAT fs supportt
            <M>   MSDOS fs supportt
            <M>     UMSDOS: Unix-like file system on top of standard MSDOS fss
            <M>   VFAT (Windows-95) fs supportt
            <M> Compressed ROM file system support
            [*] Virtual memory file system support (former shm fs)
            <*> ISO 9660 CDROM file system support   <==在 Red Hat 7.2 這裡就是被編成模組了!才需要每次載入!
            [*]   Microsoft Joliet CDROM extensionss
            <M> Minix fs support
            <M> NTFS file system support (read only)
            [*] /proc file system support
            [*] /dev/pts file system for Unix98 PTYs
            <*> Second extended fs support
            <M> System V/Xenix/V7/Coherent file system support
            Network File Systems  --->
                    <M> Coda file system support (advanced network fs)
                    <*> NFS file system support  <==NFS 也是需要的呦!
                    <M> SMB file system support (to mount Windows shares etc.)  <==網芳總是需要的吧!
                    [*]   Use a default NLS (NEW)
                            Default Remote NLS Option: "cp950" (NEW)   <==支援中文的語系!
            Partition Types  --->
            Native Language Support  ---> <==除了底下說的幾個 * 的之外,其他的全部都編譯成為模組!(以備不時之需!)
                         Default NLS Option: "iso8859-1" (NEW)
                    <*> Traditional Chinese charset (Big5) (NEW)
                    <*> NLS ISO 8859-1  (Latin 1; Western European Languages) (NEW)
                    <M> for others
    Console drivers  --->
            [*] VGA text console
    Sound  --->
            < > Sound card support  <==你有音效卡嗎?那就編譯他吧!
    USB support  --->
            <M> Support for USB
    Kernel hacking  --->

    好了!編譯完成之後選擇『Save Configuration to an Alternate File』然後寫成一個你喜歡的檔名,這個檔案內容就是你剛剛編譯完成的資料啦!然後選擇 <Exit> 之後,再儲存一次到系統當中!接著下來就準備要編譯囉!

    另外,上面的設定您可以 按這裡 來下載,然後捉到您的 /usr/src/linux 目錄下,進入 make menuconfig 畫面之後,選擇『Load an Alternate Configuration File』,然後寫入檔名 VBird-2.4.18 ,這樣一來, Linux 核心的預設選項則成為上面的樣子囉!然後再請您一個一個的進行修正啦!目前我的機器以上面的檔案案例來工作中,一切正常的啦!
    不過,上面的資料主要是適用在鳥哥的個人機器上面的,我們這個網站主要的核心也是這樣編出來的!因為我重視的地方在於『網路伺服器』上面,所以裡頭的設定少掉了相當多的個人桌上型 Linux 的硬體編譯!所以,如果你想要編譯出一個適合您的機器的核心,那麼可能還有相當多的地方需要來修正的!不論如何,請隨時以 Help 那個選項來看一看內容吧!反正 Kernel 重編的機率不大!花多一點時間重新編譯一次!然後將該編譯完成的參數檔案儲存下來,未來就可以直接將該檔案叫出來讀入了!所以花多一點時間安裝一次就好!那是相當值得的!

開始編譯囉!

  • 開始編譯之前

  • 開始編譯之前請先確認你的這一次編譯的核心與上一次編譯的核心的版本不同!請特別留意:
    • 因為編譯成模組的資料會被系統安裝在『 /lib/modules/`uname -r` 』底下,所以,如果這次你安裝的核心版本跟上一次相同時,那麼自然模組放置的地點就一樣了,那會造成很多模組版本的問題!因此,這個時候就需要將原本的模組移動到其他地方去囉!不過,由於我們是下載新核心,所以這部份就可以略過了!因為版本自然不同囉!
    • 另外,我們編譯出來的 Kernel 的檔案名稱為 vmlinuz !這個東西就是我們所需要的核心檔案啦!他正確的擺放位置是在 /boot 當中哩!此外,還有系統地圖資料 System.map 也是很重要的,同樣在 /boot 當中!
    如果確認好了之後,我們就可以正式的來編譯囉!
  • 開始編譯

  • 開始編譯的動作主要如下所示:
     
    [root @test linux]# make dep        <==建立相依的屬性關係!
    [root @test linux]# make clean       <==將舊的資料去除掉!
    [root @test linux]# make bzImage      <==開始編譯核心!這個核心是經過壓縮的,此外,這個步驟也很長!
    [root @test linux]# make modules      <==開始編譯模組!這個動作視您剛剛編譯的模組數量!
    [root @test linux]# make modules_install  <==好了!將資料給他安裝在 /lib/modules/`uname -r` 裡面囉!
    [root @test linux]# make install      <==嗯!就將剛剛 bzImage 建立完成的核心給他安裝上來!
     
    在編譯的過程當中,可能會有些錯誤或者是警告的訊息,因此,為了怕錯過什麼重要的資訊,你也可以使用命令重導向來將資料存在檔案裡頭,例如這樣做:
     
      make dep clean bzImage modules modules_install > compile.kernel.log
     
    基本上,編譯的動作就是這樣而已!我們說一說各個步驟的主要意義:
     
    1. make dep :這個動作在進行,將您在上一節所選擇的項目當中,屬於模組的咚咚進行相依屬性的建立,以方便未來軟體或程式進行的時候,模組的呼叫;

    2.  
    3. make clean :這個動作會將您前一次編譯的目標檔 ( *.o 的檔案 ) 給他去除,所以編譯的內容才會是新的核心!

    4.  
    5. make bzImage :注意喔!那個 I 是『 i 』的大寫字元?這個步驟主要在產生可開機的核心檔案,也就是我們再開機程序當中提到好多次的 vmlinuz 那個檔案啦!但是由於目前的核心檔案都還蠻大的,因此都會經過壓縮的程序?所以,編譯出來的核心檔案放置的地點在底下的目錄當中:
      1.  
        /usr/src/linux/arch/i386/boot/bzImage
         
      此外,其實還有個未經壓縮的核心在 /usr/src/linux 底下,那就是 /usr/src/linux/vmlinux ,不過我們不使用這個檔案,因此您只要記得上面提到的那個壓縮過的核心檔案即可!
       
    6. make modules :這個步驟在編譯模組啦!

    7.  
    8. make modules_install :這個步驟在安裝模組!那麼模組安裝在哪裡呢?呵呵!就是我們之前提過的,在 /lib/modules/`uname –r` 裡面,因為我們的核心是 2.4.18 ,所以就安裝在 /lib/modules/2.4.18 當中囉!
     
    如果在編譯的過程當中發生問題的話,通常的可能就是挑選的項目有點問題,這個時候請重新再挑選一次設定內容『 make menuconfig 』,通常編譯都可以成功的啦!
     
    如果在過程裡面沒有出現任何錯誤訊息的話,那麼很好,應該可以準備安裝核心囉~

安裝核心與 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 呢!這個時候就必需要有多重開機系統啦!
  • Lilo 的安裝設定:

  • 那麼如果您是使用 lilo 的話,就需要修改 /etc/lilo.conf 囉!依據剛剛我們建立的名為 /boot/vmlinuz-2.4.18 的核心檔案,您的 /etc/lilo.conf 內容應該有點像是這樣:
     
    [root @test linux]# vi /etc/lilo.conf
    boot=/dev/hda
    map=/boot/map
    vga=normal
    default=linux-2.4.18
    keytable=/boot/us.klt
    prompt
    nowarn
    timeout=100
    message=/boot/message
    menu-scheme=wb:bw:wb:bw
    image=/boot/vmlinuz-2.4.18
            label=linux-2.4.18
            root=/dev/hda1
            append="devfs=mount"
            read-only
    image=/boot/vmlinuz
            label=linux
            root=/dev/hda1
            initrd=/boot/initrd.img
            append="devfs=mount"
            read-only
    image=/boot/vmlinuz
            label=failsafe
            root=/dev/hda1
            initrd=/boot/initrd.img
            append="devfs=nomount failsafe"
            read-only
    image=/boot/vmlinuz
            label=linux-test
            root=/dev/hda1
            initrd=/boot/initrd.img
            append="devfs=mount"
            read-only

    [root @test boot]# lilo
    Added linux-2.4.18 *
    Added linux
    Added failsafe
    Added linux-test

     
    黃色字體的部分是經過修改的,其他的則是 Mandrake 9.0 的預設值!這樣就修改好囉!然後給他安裝到 MBR 或 Super block 吧!出現了 * 符號囉!呵呵!安裝成功了,請重新開機,試圖使用一下您的新核心吧!更詳細的 LILO 說明請參考開機流程裡面的 LILO 說明喔!
  • Grub 安裝說明:

  • 那麼如果是使用 grub 呢?就修改一下 /boot/grub/menu.lst 吧!修改成類似底下的模樣:
     
    [root @test linux]# vi /boot/grub/menu.lst
    timeout 10
    color black/cyan yellow/cyan
    i18n (hd0,0)/boot/grub/messages
    keytable (hd0,0)/boot/us.klt
    altconfigfile (hd0,0)/boot/grub/menu.once
    default 0

    title linux-2.4.18
    kernel (hd0,0)/boot/vmlinuz-2.4.19 root=/dev/hda1 devfs=mount

    title linux-2.4.19-16mdk
    kernel (hd0,0)/boot/vmlinuz-2.4.19-16mdk root=/dev/hda1 devfs=mount
    initrd (hd0,0)/boot/initrd.img

    title failsafe
    kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 devfs=nomount failsafe
    initrd (hd0,0)/boot/initrd.img
     

     
    上面的黃色字體是經過修改之後的結果?很簡單吧!這樣就搞定了!然後就可以開機測試看看囉!但是,如果是 Lilo 轉換到 grub 的使用者,還得再安裝 grub 呢!可以這樣做做看:
     
    [root @test boot]# grub-install /dev/hda
    Installation finished. No error reported.
    This is the contents of the device map /boot/grub/device.map.
    Check if this is correct or not. If any of the lines is incorrect,
    fix it and re-run the script `grub-install'.

    (hd0) /dev/hda

     
    或者直接進入 grub 的指令列進行安裝:
     
    [root @test boot]# grub

        GRUB  version 0.92  (640K lower / 3072K upper memory)

     [ Minimal BASH-like line editing is supported.  For the first word, TAB
       lists possible command completions.  Anywhere else TAB lists the possible
       completions of a device/filename. ]

    grub> root (hd0,0)
     Filesystem type is ext2fs, partition type 0x83

    grub> setup (hd0)
     Checking if "/boot/grub/stage1" exists... yes
     Checking if "/boot/grub/stage2" exists... yes
     Checking if "/boot/grub/e2fs_stage1_5" exists... yes
     Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  17 sectors are embedded.
    succeeded
     Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,0)/boot/grub/stage2
    /boot/grub/menu.lst"... succeeded
    Done.

    grub> quit

     
    呵呵!這樣就 OK 囉!安裝完畢,請馬上重新開機測試看看您的核心是否可以正常的工作了吧! ^_^更詳細的 Grub 說明請參考開機流程的 Grub 喔!

核心模組管理:

還記得核心的功能嗎?對啦!就是用來控制系統硬體與相關程序的東西啦!那麼在上面提到的功能裡面,我們也提到了核心可以使用『模組』的方式來動態的載入與移除所需要的模組,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 的安裝方式!再來,如果我需要的是手動隨時加入與取消某些模組呢?呵呵,這個時候也就需要來瞭解一下模組的載入與卸載的功能囉!

  • 模組編譯

  • 還記得要手動編譯一些驅動程式或者是 tarball 的套件時,至少需要什麼嗎?對啦!要 gcc, make 及 kernel-header 等套件,現在我假設這些套件已經都在您的機器上面了,那麼我們來模擬一下編譯 viarhine.o 這個模組吧!好了,首先先到網路卡的驅動程式中心下載這個模組的原始碼吧!
     
      http://www.scyld.com/network/index.html
     
    不過,上面的網站提供的驅動程式有點難以編譯成功!所以,我這裡也提供一個比較容易編譯成功的原廠釋出的模組,大家來試看看:
     
      http://linux.vbird.org/download/book_basic/linux530_321.tar
     
    (你可以使用 wget 這個程式在文字介面下載這個檔案!)。首先,您必需將此檔案解壓縮,假設這個檔案原本放置在 /root 底下好了,那麼我們曾經說過,要編譯新的套件或其他林林總總的資料時,最好放在 /usr/local/src 底下,所以:
     
    [root @test root]# wget http://linux.vbird.org/download/book_basic/linux530_321.tar
    [root @test root]# cd /usr/local/src
    [root @test src]# mkdir dlink-530
    [root @test dlink-530]# tar –xvf /root/linux530_321.tar
     
    這步之後會多出 readme.txt, Makefile, viarhine.c, viarhine.h 四個檔案,
    其中,那個 readme.txt 『真的』要看一看!
     
    [root @test dlink-530]# make 
     
    這個 make 會依據 Makefile 這個檔案的內容來將你的 viarhine.c 加以編譯!
    最後就得到了 viarhine.o 這個編譯成功的目標檔案。
     
    這樣就編譯完成了,接著下來就是將編譯好的模組放置在核心應該要放置的地方,我這裡以 2.4.xx 核心版本為例說明,聽說明年六月 ( 2003/06 ) 會推出新的 2.6.xx 版核心,無論如何,目前大部分的 Linux 還是使用 2.4.xx 的,因此,這裡還是以他為例了:
     
      核心的模組放置目錄:   /lib/modules/`uname –r`/kernel/
      核心的檔案格式模組:   /lib/modules/`uname –r`/kernel/fs
      核心的網路卡驅動程式模組: /lib/modules/`uname –r`/kernel/drivers/net
     
    因此,我們要把這個模組給他直接 copy 到該目錄下,所以:
     
    cp /usr/local/src/dlink-530/via-rhine.o /lib/modules/`uname –r`/kernel/drviers/net
     
    這樣就完成了系統的驅動程式模組的編譯了!完成編譯之後,想要在開機的時候立即啟動這個模組的對應,那麼就寫入 /etc/modules.conf 當中,所以:
     
    [root @test root]# vi /etc/modules.conf
    alias eth0 via-rhine
     
    加入上面黃色字體那行就對啦!
     

  • depmod

  •  
    [root @test /root]# depmod [-aens] 
    參數說明: 
    -a :將 /etc/modules.conf 可以查詢到的模組的相關性都寫入 /lib/modules/`uname -r`/當中 
    -e :顯示出目前已載入的不可執行的模組名稱 
    -n :將各模組的相依性直接輸出螢幕上,而不是輸出到 /lib/modules/`uname -r` 當中 
    -s :將一些訊息結果輸出到 syslog 的登錄檔中! 
    範例: 
    [root @test /root]# depmod -a 
    [root @test /root]# depmod -n
     
    很多時候,在使用模組時,這些模組基本上是有相關性的!什麼意思呢?例如你要在 NAT 伺服器的情況下啟動 NAT 時,那麼就需要 ip_tables 這個模組,以及 ip_nat 這個模組,而若你還想要啟用 NAT 下的 ftp 功能,那麼就需要啟用 ip_nat_ftp 模組!換個角度來想,如果你需要啟用 ip_nat_ftp 模組的話,那麼就『必需啟用 ip_nat 與 ip_tables 模組!』這就是所謂的相依性!而這些相依性的內容都是被紀錄在 /lib/modules/`uname –r`/modules.dep 這個檔案中的!至於分析這些模組的相關性,則是以 depmod 來執行的啦!此外,如果不想讓模組被寫入 /lib/modules/`uname -r` 當中的話,那麼就加入 -n 參數吧,可以先看一下各模組的相依性呢!
     

  • lsmod

  •  
    [root @test /root]# lsmod 
    參數說明: 
    範例: 
    [root @test /root]# lsmod 
    Module                  Size  Used by    Tainted: P 
    ipt_MASQUERADE          1216   1 (autoclean) 
    iptable_filter          1696   1 (autoclean) 
    ip_conntrack_irc        2592   0 (unused) 
    ip_conntrack_ftp        3328   0 (unused) 
    ip_nat_irc              2400   0 (unused) 
    ip_nat_ftp              2976   0 (unused) 
    iptable_nat            13588   3 [ipt_MASQUERADE ip_nat_irc ip_nat_ftp] 
    ip_tables              11232   5 [ipt_MASQUERADE iptable_filter iptable_nat] 
    ip_conntrack           13356   3 [ipt_MASQUERADE ip_conntrack_irc ip_conntrack_ftp ip_nat_irc ip_nat_ftp iptable_nat] 
    ppp_async               6240   1 (autoclean) 
    8139too                14208   2 
    usbcore                29632   0 (unused)
     
    在目前系統中的模組有哪些呢?就是以 lsmod 來查看就對啦!例如以我的宿舍 Linux 主機來看,我的網路卡是螃蟹卡,亦即是 8139 這個模組啦,另外,我有進行 NAT ,所以開啟了相當多的 iptables 模組,所以你可以看到一堆 ipxxxx 的模組名稱啦!
     

  • modinfo

  •  
    [root @test /root]# modinfo [-adnp] module_name 
    參數說明: 
    -a :秀出作者 
    -d :秀出這個模組的基本說明 
    -n :秀出這個模組的檔案放置路徑與名稱 
    範例: 
    [root @test /root]# modinfo 8139too 
    filename:    /lib/modules/2.4.19/kernel/drivers/net/8139too.o
    description: "RealTek RTL-8139 Fast Ethernet driver"
    author:      "Jeff Garzik <jgarzik@mandrakesoft.com>"
    license:     "GPL"
    parm:        multicast_filter_limit int, description "8139too maximum number of filtered multicast addresses"
    parm:        max_interrupt_work int, description "8139too maximum events handled per interrupt"
    parm:        media int array (min = 1, max = 8), description "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps"
    parm:        full_duplex int array (min = 1, max = 8), description "8139too: Force full duplex for board(s) (1)"
    parm:        debug int, description "8139too bitmapped message enable number"

    [root @test /root]# modinfo -a 8139too 
    "Jeff Garzik <jgarzik@mandrakesoft.com>"

    [root @test /root]# modinfo /usr/local/src/dlink-530/via-rhine.o
    filename:    /usr/local/src/dlink-530/via-rhine.o
    description: "PCI 10/100Mb Fast Ethernet Adapter"
    author:      "Donald Becker <becker@scyld.com>"
    license:     <none>
    parm:        debug int
    parm:        min_pci_latency int
    parm:        max_interrupt_work int
    parm:        rx_copybreak int
    parm:        options int array (min = 1, max = 8)
    parm:        full_duplex int array (min = 1, max = 8)

     
    很簡單吧!就是用來查看這個模組的作者啦!如果不加任何參數的時候,就是將這個模組的所有訊息都寫出來的意思!我們使用的網路卡(螃蟹卡)所掛載的這個模組使用的檔案就是: filename 那一行當中的 /lib/modules/2.4.19/kernel/drivers/net/8139too.o 這個檔案啦!那麼如果我是想看剛剛我們在核心編譯當中編譯出來的那個模組的資訊呢?可以直接加上模組的檔案名稱!
     

  • modprobe

  •  
    [root @test /root]# modprobe [-l|-c]
    [root @test /root]# modprobe modules_name<==直接載入該模組與其相依屬性的模組
    參數說明: 
    -l :列出目前系統所有的模組 ( 在 /lib/modules/`uname -r`/kernel 底下 ) 
    -c :列出目前系統所有的模組!(更詳細的代號對應表) 
    範例: 
    [root @test /root]# modprobe ip_tables   <==直接載入 ip_tables.o 這個模組
    [root @test /root]# modprobe –l
     
    這東西相當的好用,因為他除了可以將後面接的模組名稱載入之外,還可以依據 /lib/modules/`uname –r`/modules.dep 裡面的相依屬性,將其他相關的模組也載入!不錯吧!此外,需要特別留意的是,模組全部都擺在『 /lib/modules/`uname -r`/kernel 』這個目錄下,而且模組的名稱都是以 *.o 這個附檔名存在,但是在實際載入模組的時候,只要寫入名稱即可,千萬不可寫入 .o 或者是路徑名稱,例如要載入 ip_tables.o 這個模組時,就寫 modprobe ip_tables 即可!其實,這個程式與底下的 insmod 有點類似,只是他是依據系統已經建立好的模組相依屬性來載入模組,而 insmod 則是直接手動來載入模組檔案!
     

  • insmod

  •  
    [root @test /root]# insmod [-fkps] module_name 
    參數說明: 
    -f :強制將模組載入,要載入不相同版本的模組時候可能會用到的參數 
    -k :自動在核心沒有使用到該模組的時候,先清除乾淨! 
    -p :測試模組是否可以被載入,不會直接載入系統中! 
    -s :將一些執行訊息寫到 syslog 這種登錄檔,而不是寫到 terminal 當中!
    範例: 
    [root @test /root]# insmod -p /usr/local/src/dlink-530/via-rhine.o
    Warning: loading /usr/local/src/dlink-530/via-rhine.o will taint the kernel: no license
      See http://www.tux.org/lkml/#export-tainted for information about tainted modules
     
    這個跟 modprobe 有點類似啦,但是 insmod 可以讀取非 /lib/modules/`uname -r`/kernel 內的模組,而且還可以為模組進行載入測試呢!您可以加上路徑與完整的檔名來載入模組,加上 -p 這個參數可以驗證該模組的可執行性與否!!『要注意的是,這個 insmod 輸入的模組名稱必須要完整的路徑、檔名來輸入呦!』
     

  • rmmod

  •  
    [root @test /root]# rmmod modules_name 
    參數說明: 
    範例: 
    [root @test /root]# rmmod 8139too
     
    顧名思義,呵呵!移除模組的程式啦!!使用 lsmod 得到以存在的模組之後,,然後再輸入『 rmmod 模組名稱』就可以移除模組囉!
修改歷史:
  • 2002/05/29:第一次完成
  • 2003/02/11:重新編排與加入 FAQ
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計