Linux 基礎學習篇 - Red Hat Linux 6.1

核心編譯(kernel) - for Red Hat Linux 6.1

大概在 1999~2000 年期間為了防止自己忘記所作的學習心得紀錄!

最近更新時間: 2001/08/17

1999 年初次接觸 Unix 系統,1999 年底接觸 Red Hat 6.1,而在 2000 開始撰寫一些心得文章,於是有了底下這些文字的產生。 這些文字對大家來說,可能沒什麼,但是對鳥哥來說,這是相當珍貴的!所有鳥站的資料起源,都是從這些文字開始的! 慢慢再將許多的指令分門別類的處理進去!網站的資料彙整,真的相當花費時間啊~

不過對於學習者來說,這些資料真的不要再讀了!因為實在太老舊... 建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。最新文章請前往鳥站首頁查閱囉!

前言

其實應該在安裝完 Linux 之後便開始編譯核心,因為每個人所需要的核心都並不相同!舉個例子來說,你安裝了一個很新的網路卡,但是你的核心並不支援這一種網路卡,那你只好下載比較新的核心來編譯,才能支援你的網路卡!另外,由於太大的核心對於整體的執行效能會比較慢,所以適當的核心對於你的 Linux 系統之執行效率也是有幫助的!因此,一般的玩家通常在安裝完了 Linux 之後,便開始進行核心的重新編譯工作!

study-area 也曾提到:Linux的靈魂所在﹐其實就是其穩定的核心設計。我們可以將之看成是一個架於程式和硬體之間的界面操作系統﹐離開來核心﹐什麼東西都用不了。而核心的編譯好壞﹐也會影響到系統的效能﹐甚至﹐一些系統功能(如 ip networking)﹐就必須要編進核心才行。

不過,由於核心的更新速度太快了,如果你一直執著於最新的核心編譯,那肯定會吃不消,所以通常我們的建議就是,除非你有新的需求,否則可以不用常常去更新核心的!

下載新核心

  • 核心的版本
    要如何知道你的核心版本呢?基本上,你在開機進入 Linux 的 login 畫面時, Redhat 應該就已經告訴你這個主機的核心版本了,不過,如果你要知道你的核心版本的話,可以輸入:
     
    [root@tsai /root]# uname -r
    2.2.12-20
    上面顯示我們這個 Linux 核心是 2.2.12-20 這個版本。

    好啦,那要選擇哪一個核心版本呢?目前你可以看到的核心版本主要有 2.2.X, 2.3.X2.4.X,哪一個才適合你呢?我想,既然我們需要的是穩定版的 Linux ,那自然選擇越穩定的越好囉,那基本上,所有 2.2.X 及 2.4.X 的都是屬於穩定型的核心版本,至於 2.3.X 則是適合開發 Linux 軟體的核心!另外,2.4.X並不是比2.2.X還新的意思,基本上,所有 2.2.X 及 2.3.X 與 2.4.X 都是同時開發的核心,只是因為其支援的程度或者是一些功能方面不完全相同,所以才會分成這些版本!而目前我們所想要使用的應該是 2.2.X 這個版本的系列核心,截至目前為止,這一版的最新核心應該是 2.2.19 這一個,當然,你也可以下載其他的核心!

  • 核心下載地點
    Linux 核心的下載地點可以在底下的地點找到最新的,當然也可以在台灣相關的 FTP 站找到你要的核心。
     


    另外,你也可以在我這裡下載 linux-2.2.19.tar.gz 這個核心版本。基本上,最好是在系統安裝完畢之後馬上就進行核心編譯工作,免得以後每次裝一些特定功能的時候又要花一大輪時間編譯。另外要說明的,由於小弟是以 2.2.18 這一版的核心來做升級的動作,所以以下是以 2.2.18 來做示範!
     

  • 核心解壓縮

  • 下載下來的核心大致上都是 *.tar.gz 這種壓縮檔,所以需要先解壓縮,另外,由於 redhat 預設的編譯核心的目錄是 /usr/src/linux ,所以你要將這個壓縮檔解至這個目錄。不過由於系統原本就有一個 linux 的連結檔在這裡,所以你要先取消連結檔。現在假設你的 linux-2.2.18.tar.gz 放在 /root/ 底下,則你可以這樣做:
     
    [root@tsai /root]# cd /usr/src/
    [root@tsai src]# rm linux
    [root@tsai src]# tar -zxvf /root/linux-2.2.18.tar.gz
    [root@tsai src]# mv linux linux-2.2.18
    [root@tsai src]# ln -s linux-2.2.18 linux
    則你的新核心資料放在 linux-2.2.18 這個目錄中,而 linux 則是連結至這個目錄的連結目錄!

開始設定核心的內容

編譯核心有許多方法,這裡以視窗介面的方法來說明:
  1. 進入核心目錄 cd /usr/src/linux

  2.  
  3. 開始設定畫面make menuconfig

  4.  
  5. 進入選擇項目

  6. 進入選擇項目之後,你將會在視窗介面中看到很多的選項,請使用方向鍵、空白鍵與 enter 來進行選擇。以下開始你要慢慢的詳細挑選,如果有任何問題的話,請詳細的看一下每一個選項中的 Help 。另外,如果沒有需要的話,請盡量不要把核心邊的太大!否則效能是會降低的喔!此外,由於很多時候你不曉得需不需要選擇這個項目,那你可以將之編成模組(<M> 的項目),模組是在開機載入時有被載入才可以執行的咚咚!所以並不會使效能方面有太大的問題!
     
    • Code maturity level options:請選擇。這個項目主要在讓你可以接受一些測試的版本的套件。
    • Processor type and features:請選擇進入,選你的 CPU 形式。
      • Processor family:例如鳥哥的 CPU 為 P-166 則我可以選擇 Pentium/K6/TSC/CyrixIII 這一項!
      • Math emulation:這一項請不要選擇,因為這是用軟體來模擬硬體的計算核心,因為我們的 CPU 都是 P-100 以後的,所以不用選這項!
      • Symmetric multi-processing support:這是是否支援 雙CPU 的主機板的選項,你可以選擇也可以不選擇,但如果你使用雙CPU主機板,這個就一定要選擇。
      • 其他保持預設值即可。
    • Loadable module support:請選擇,這是用來是否支援模組載入的。
      • Enable loadable module support:請選擇。
      • Set version information on all symbols for modules:不要選,因為我們可能會具有兩種以上的版本的核心,所以這一項不可選擇。
      • Kernel module loader:請選擇。
    • General setup
      • Networkking support:一定要選擇。
      • PCI support:請選擇。
      • Advanced Power management BIOS support:如果您的BIOS支持APM的話﹐請選擇。
      • Power off on shutdown:如果您選擇了上一個﹐也請選擇。
      • 其他,保留預設,或視實際情況設定。 例如我們實驗室的機器需要與 SGI 的機器聯繫,所以就多選擇了 SGI Visual Workstation support 這一項。
    • Plug and Play support:將之全部選擇。
    • Block devices:裡面放置了一些晶片組的選項,通常以預設值就可以了,不過,如果你的主機板是最近的版子,例如 VIA 的  82C586 晶片組,哪就必須進來選擇你的晶片組啦!
    • Networking options:這是所有項目裡面最重要的了,底下的選擇
      • Network firewalls﹐請選擇。
      • Socket Filtering﹐請選擇。
      • TCP/IP networking﹐請選擇。
      • IP: multicasting﹐請選擇。
      • IP: advanced router﹐請選擇。
      • IP: police routing﹐請選擇。
      • IP: verbose route monitoring﹐請選擇。
      • IP: firewalling﹐請選擇。
      • IP: use FWMARK value as routing key﹐請選擇。
      • IP: transparent proxy support﹐請選擇。
      • IP: masquerading﹐請選擇。
      • IP: ICMP masquerading﹐請選擇。
      • IP: masquerading special modules support﹐請選擇。
      • IP: ipautofw masq support﹐請選擇為 Module。
      • IP: ipportfw masq support﹐請選擇為 Module。
      • IP: ip fwmark masq-forwarding support﹐請選擇為 Module。
      • IP: optimize as router not host﹐請選擇。
      • IP: multicast routing﹐請選擇。
      • IP: aliasing support﹐請選擇。
      • IPX: Full internal IPX network﹐如果您的網路有Novell伺服器﹐請選擇。
      • IPX: SPX networking﹐如果您的網路有Novell伺服器﹐請選擇。
      • 其他﹐保留預設﹐或視實際情況設定。
    • Telephony Support:保留預設值。
    • SCSI support:除非你有 SCSI 的設備,否則可以選擇成為 M 的模組型態。
    • Network device support:這個也是很重要的選項,與你的網路卡有關!
      • Dummy net driver support:非常建議選擇。
      • Ethernet (10 or 100Mbit):除非您使用其他的網路形態﹐否則這個一定要選擇。
        • 3 COM cards:除非您的網路卡是這個牌子的﹐否則不選擇。
        • Western Digital/SMC cards:除非您的網路卡是這個牌子的(或兼容)﹐否則不選擇。
        • RealTek 8912/8139 (not 8019/9029!) support:除非您的網路卡是這 8912或8139這兩個確切型號﹐否則不選擇﹐不過﹐也可以選“M”。
        • Other ISA cards:如果您有ISA網卡的話﹐可以選擇。
        • NE2000/NE1000 support:如果您不知道您的網路卡型號﹐這個可以試試選擇。
        • EISA, VLB, PCI and on board controllers:請選擇。
        • PCI NE2000 support:如果您用的是PCI網路卡﹐又不知道型號﹐這個可以試試選擇。
        • EtherExpressPro/100 support:如果您有此類網卡﹐請選擇。
        • Pocket and protable adaptors:如果您使用PCMCIA網卡﹐可以試試選擇。
        • 基本上在這個選項當中,就是選你有的網路卡的形式就對了!
      • FDDI driver support:如果您沒用使用FDDI﹐請不要選擇。
      • Frame relay DLCI support:如果您沒用使用Frame relay﹐請不要選擇。
      • PPP (point-to-point) support:這個一定要選擇。
      • SLIP (serial line) support:如果您知道您ISP使用SLIP﹐可以選擇。
      • Token Ring driver support:如果您的網路不是這個形態﹐請不要選擇。
      • 至於其他﹐如果確定不使用的﹐就不要選擇﹐如果不確定﹐可以保留預設﹐或將之設成“M”。
    • Amateur Radio support :有才選擇,通常不選。
    • IrDA (infrared) support:有才選擇,通常不選。
    • ISDN subsystem:有才選擇,通常不選。
    • Old CD-ROM drivers (not SCSI, not IDE):有才選擇,通常不選。
    • Character devices:有才選擇,通常不選。
    • USB support:有才選擇,通常不選。
    • Filesystems:這個與你的 Linux 系統可支援的檔案型態有關,一定要進來選擇。
      • Quota support:請選擇。
      • DOS FAT fs support:請選擇。
      • MSDOS fs support:請選擇。
      • VFAT (Windows-95) fs support:請選擇。
      • ISO 9660 CDROM filesystem support:請選擇。
      • Microsoft Joliet CDROM extensions:請選擇。
      • NTFS filesystem support (read only):請選擇。
      • OS2/HPFS filessystem support (read only):如果您的機器還有OS/2系統﹐請選擇。
      • Network File Systems:請展開﹐喜歡的話﹐可以全部選擇﹐但我們只關心‘NFS’和‘SMB’的部分。
      • Partition Types:除非您找到相關項目﹐否則可以不理會。
      • Native Language Support:請展開﹐然後選擇﹕
        • Codepage 850
        • Codepage 950
        • NLS ISO 8859-1
    • Console drivers:除非您確定﹐否則保留預設。
    • Sound:如果您用的是Creative的SB16﹐或兼容聲卡﹐可以不理會。
    • Kernel hacking:保留預設則可。


    這樣就編完了,請按下『exit』然後選擇 save 後,即可離開視窗畫面。
     

  7. 更改前一版的模組目錄

  8. 再來則是要開始讓系統編譯你剛剛設定的核心了,此時請注意,如果你使用的核心版本之前你已經有編過一次了,那樣的話,在 /lib/modules 這個目錄中應該會有前一版的模組,這時請到這個目錄下將該核心目錄更改名稱。不過我們這裡由於是第一次編譯核心,所以在 /ib/modules 裡面應該只有 2.2.12-20 這個目錄,因此這一步就不用作了。

開始編譯

這個時候要開始編譯我們的核心了,其實也是很簡單,直接執行以下幾個步驟即可:
 
[root@tsai linux]# make dep
[root@tsai linux]# make clean
[root@tsai linux]# make modules
這個步驟要花點時間的,所以按下 enter 後就可以去看電視了!
[root@tsai linux]# make modules_install
[root@tsai linux]# make bzImage
這個步驟是最久的一步,也請你去喝個茶吧!
這時才開始編譯核心。其實有兩種編譯核心的方法,
分別是 make bzImage 及 make zImage,有何不同?
在 bzImage 編譯的核心是經過壓縮的,由於我們目前編的核心
都蠻大的,所以需要 bzImage 這個指令,如果你選擇的核心很小,
就可以使用 make zImage 了(據說比較快一點)。
[root@tsai linux]# make bzlilo
最後一動啦,將核心安裝在硬碟之上。

在執行 make modules_install 後,會在你的 /lib/modules 形成一個專屬於這個核心的模組目錄,而在執行 make bzImage 成功之後,會在你的根目錄造成兩個重要的檔案,就是我們最重要的核心開機程式了,分別是:vmlinuzSystem.map 這兩個檔案。

安裝編譯完成的核心及設定多重開機選項 lilo

好了,編譯完就是要安裝啦!由於害怕剛剛編譯完的核心不能正常的開機,所以通常鳥哥都是手動來設定成多重開機的選單,好讓我們如果發生錯誤的設定,可以直接再次開機來進入 Linux 系統。
  1. 移動兩個主要的開機檔到 /boot 中:並加以更改名稱
  2. [root@tsai linux]# cd /
    [root@tsai /]# mv System.map /boot/System.map-2.2.18
    [root@tsai /]# mv vmlinuz /boot/vmlinux-2.2.18
    [root@tsai /]# cd /boot
    [root@tsai /boot]# rm System.map
    [root@tsai /boot]# ln -s System.map-2.2.18 System.map
    如此一來,則你的開機執行的 System.map 會找尋 2.2.18 這一版的資訊!
     
  3. 編輯你的 /etc/lilo.conf 多重開機設定檔

  4. 這裡就必須比較小心了,因為設定錯誤會讓你開不了機的!只要設定一個檔案就好了,那就是 /etc/lilo.conf 這個檔案。
    [root@tsai /boot]# vi /etc/lilo.conf
    進入 vi 的編輯畫面,原始的 lilo.conf 有點像這樣:
    ----
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    default=linux

    image=/boot/vmlinuz-2.2.12-20
            label=linux
            initrd=/boot/initrd-2.2.12-20.img
            read-only
            root=/dev/hda5

    other=/dev/hda1
            label=windows
    ----
    關於上述個相關的咚咚你可以到 設定lilo 去看,
    而經過修改之後可以變成像是這樣:
    ----
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    default=linux-2.2.18 <==預設以 2.2.18 開機

    image=/boot/vmlinuz-2.2.12-20
            label=linux-2.2.12-20
            initrd=/boot/initrd-2.2.12-20.img
            read-only
            root=/dev/hda5

    image=/boot/vmlinuz-2.2.18 <==這是新的核心喔!
            label=linux-2.2.18 
            read-only
            root=/dev/hda5

    other=/dev/hda1
            label=windows

    重要的地方在於 default=linux-2.2.18 這一行,以及 image=/boot/vmlinuz-2.2.18 兩行,需要指定正確才行!基本上這樣就設定成功了!
     
  5. 啟動 lilo

  6. 這個時候請打入:
    [root@tsai /boot]# lilo
    Added linux-2.2.12-20
    Added linux-2.2.18 *
    Added windows
    你會看到如上的說明,可以看到 linux-2.2.18 有打星號,這表示預設的開機檔是以 linux-2.2.18 的核心來開機的!
     
  7. 重新開機

  8. 現在你可以重新開機來測試一下你的核心了!當然,你也可以在開機過程中,出現 boot 時按下 tab 鍵,讓你選擇你要的開機檔!
     
  9. 換回舊核心

  10. 如果核心使用的不滿意怎麼辦?你可以如此的換回來原先的核心:
    • 進入 /boot 中,將 System.map 的連結檔換成 System.map-2.2.12-20 這一個,
    • 編輯 /etc/lilo.conf 檔案,將預設的開機檔改成 linux-2.2.12-20 ,
    • 最後再執行 lilo 即可!
編譯核心有時候會遇到許多麻煩﹐尤其是當您從一個舊的版本升級上來。建議您看看 kernel-HOWTO 和 modules mini-howto 之外﹐還應該看看 /usr/src/linux/Documentation 裡面的文章﹐尤其是 Changes?modules.txt?kmod.txt 等。而且﹐在編譯(make menuconfig)的過程中﹐對任何不明白的選項﹐應該看看 Help 是怎麼說的﹐這非常重要。

另外,由於編譯核心並以新的核心開機之後,所有的模組都會到新的目錄去,如以上面的例子來看,以新的核心開機時,模組的載入會跑到 /lib/modules/2.2.18 中,所以如果你的網路卡不是模組中有的,而是自己安裝的,那你得在重新安裝一次到新的目錄中,否則你的網路將無法連接喔!

2002/01/01以來統計人數
伺服器篇文件
各版本彙整說明
CentOS 6.x