編譯核心


好了﹐既然我們已經可以基本操控這台 Linux 機器之後﹐就要對之動點手術了﹐讓它更適合自己的環境。就像喜歡飆車的朋友﹐總免不了要對心愛的座架改裝改裝一樣。

要改車﹐除了要改彈簧、輪子、氣喉、擾流等﹐要想車子真正能發揮性能﹐當然免不了改引擎啦。下面我們進行的核心編譯﹐就是為 Linux 改引擎了。之後我們還要裝Xwindows等等﹐那是座椅、方向盤、表板等這些‘內籠’改裝了。這些修改﹐都一一顯示了使用者的個人風格﹐而且也有許多產品可供選擇﹐就如除了“momo”我們還可以選擇“無限”一樣。

何為核心﹖

如果您有看過“電腦基礎”關于作業系統部分的文章﹐相信不用我再多做解釋了。而且﹐我也不想再重複講述了﹐如果您不知道核心是做什麼的﹐可以到“電腦基礎”去看看。

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

取得source

Linux核心的發展﹐可以說是相當迅速的﹐其版本更新反而有時候讓人覺得太頻繁了點呢。如果您在 Linux 下面輸入﹕
uname -r

您就可以看到您機器目前使用的核心版本了。但這是您安裝時預設的版本﹐其設定也是預設的﹐您或許已經從http://www.kernel.org/下載了最新版本的核心回來﹐並想安裝到您的系統上面。就算您不打算更新核心﹐預設核心也未必就適合您的實際需要。

以小弟經驗看﹐最好是在系統安裝完畢之後﹐馬上就進行核心編譯工作﹐免得以後每次裝一些特定功能的時候又要花一大輪時間編譯。

您除了可以到http://www.kernel.org/下載最新的核心﹐我們也可以使用安裝光碟帶來的版本。

如果您在安裝的時候不是選擇everything﹐也沒選擇kernel source的話﹐您現在還可以從您的光碟將之安裝進來。現在先請您mount 好您的光碟(如果不會﹐往前翻回去看看)﹐然後﹕
cd /mnt/cdrom/RedHat/RMPS

然後將 kernel 的 rpm 裝上。別說您不會使用 rpm 哦﹐果真的話﹐請往前面翻看看程式管理 (RPM)再回來﹕
rpm -ivh kernel-source-2.2.5-15CLE.i386.rpm

如果您看到錯誤信息顯示您還需要其他程式﹐一一裝好它們的rpm(都在同一目錄之下)後再來安裝 kernel 的rpm。

如果您的核心是從 internet 上面下載回來的﹐通常會是‘.tar.gz’或‘tgz’檔(rmp當然更好啦)。這樣您就要先將檔案抄進 /usr/src 再進行解壓了﹕
cp ./kernel-2.2.5-15CLE.i386.tar.gz /usr/src cd /usr/src
tar zxvf ./kernel-2.2.5-15CLE.i386.tar.gz

這樣您就會產生一個‘linux-2.2.5’的目錄﹐然後您為這個目錄建立一個 link:
ln -sf linux-2.2.5 linux

無論您是用光碟的rmp﹐還是下載回來的核心﹐最終我們都應該有一個‘/usr/src/linux’的目錄(其實它是一個 link﹐如果您有舊的核心source在 /usr/src裡面了﹐那您要用 ls -l 確定 link 指向正確的 source 目錄)。下面就是我們進行編譯的具體步驟﹕

進行編譯

不過﹐編譯核心一點都不是容易﹐而且是相當費神費時的事情。幸好現在的機器越來越快﹐而且核心的編譯程式也好用多了。

  1. 首先確定您在安裝 Linux 時候準備的開機片可以工作﹐用它boot 一下就知道了﹐要確定您的BIOS裡面的開機順序是以“A”(即軟碟)為先。如您當初忘記了製作開機片﹐或磁片壞掉了﹐請參考前面的“製作開機片”自行做一張。

  2. 讓我們轉換到核心目錄﹕
    cd /usr/src/linux

  3. 然後輸入﹕
    make menuconfig

    (如果在Xwindows裡面﹐可以輸入﹕make xconfig)

  4. 接著﹐我們就要面對一大堆的選擇了﹐我也不一一列出範例了。只選擇在這個網頁裡面作為例子所需的部分﹐如果您不確定哪些需要﹐可以接受預設值。也可以按‘help’看看您是否需要﹐如沒需要的話可以不選擇﹐如果核心編得太大﹐系統效能會降低。

    注意﹕在選項前面如果為“*”是選擇﹔如果是“M”是module(即不會被包括進核心﹐但可以用模組的形式進行啟動﹐這樣比較有彈性)﹔如果是空白﹐則為不選擇。如果使用menuconfig﹐在選項右邊有“--->”是可以展開的﹐裡面還有選項。選擇好之後可以按方向鍵跳到‘Exit’回到上一級(也可以按‘Esc’﹐但要非常小心﹐因為不覺意按兩下的話可能會退出程式﹐所以不鼓勵用‘Esc’)。

    • Code maturity level options﹐全部選擇。
    • Processor type and features
      • Processor family﹐請選擇一個正確型號﹐如﹕PPro/6x86MX。
      • Math enulation﹐請不要選擇﹐除非您的CPU實在太舊了(如386)。
      • 其他﹐保持預設則可。
    • Loadable module support
      • Enable loadable module support﹐請選擇。
      • Set version information on all symbols for modules﹐請不要選擇﹐除非您確定後面所編譯的模組使用核心版本聯結。
      • Kernal module loader﹐請選擇。
    • General setup
      • Networkking support﹐一定要選擇。
      • PCI support﹐請選擇。
      • Advanced Power management BIOS support﹐如果您的BIOS支持APM的話﹐請選擇。
      • Power off on shutdown﹐如果您選擇了上一個﹐也請選擇。
      • 其他﹐保留預設﹐或視實際情況設定。
    • Plug and Play support﹐全部選擇。
    • Block devices﹐保留預設﹐或視實際情況設定。
    • 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伺服器﹐請選擇。
      • 其他﹐保留預設﹐或視實際情況設定。
    • SCSI support﹐除非您有SCSI設備﹐否則不選擇。如果您選擇的話﹐可以展開“SCSI low-level drivers”看看有否您的設備型號。
    • 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 subsystem support﹐保留預設。
    • ISDN subsytem﹐除非您確定﹐否則不選擇。
    • Old CD-ROM drivers (not SCSI, not IDE)﹐除非您的CDROM非常舊﹐否則不選擇。
    • Characer devices﹐保留預設則可﹐除非您知道您需要哪些。
    • Filesystems
      • 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﹐保留預設則可。
  5. 當您完成選擇之後﹐按‘Exit’退出﹐看到“Do you wish to save your new kernel configuration?”﹐確定您選擇‘Yes’。
  6. ls /lib/modules看看裡面有沒有一個目錄和目前版本(用 uname -r 可以得知)相同名字﹐如果有﹐用 ‘mv’命令將之改名﹐如﹕
    mv /lib/modules/2.2.5-15CLE /lib/modules/2.2.5-15CLE.backup

  7. 然後輸入﹕
    make dep clean modules modules_install bzImage(注意‘i’為大寫)

    這個過程比較需時﹐熒幕上會迅速的略過許多信息﹐有興趣可以看看﹐同時留意有否錯誤信息出現﹐有則根據信息提示進行修改﹐直到您再沒看到錯誤為止。

    (為方便檢查錯誤﹐最後的步驟可以分開來做﹐比如執行 make dep 之後再執行 make clean 等等...)

安裝核心

經過上面的步驟﹐我們已經將核心編譯出來了﹐接下來的是要將核心安裝起來﹕

  1. 先將一張空白磁片放進軟碟機﹐然後輸入﹕
    make bzdisk

    這可能需要一點時間﹐等完成之後﹐輸入﹕
    reboot

    這樣會讓機器重新啟動﹐這時候﹐你要確定您的BIOS裡面的開機順序是以“A”(即軟碟)為先﹐和確定磁片留在軟碟機裡面。

    我們這樣做的目的﹐是用軟碟測試一下新的核心是否工作。如果不成功的話﹐您還可以取出磁片﹐用原來的核心來啟動。

  2. 如果新的核心是沒問題﹐等我們重新登入系統後﹐再進入 /usr/src/linux 目錄裡面﹐然後執行﹕
    make bzlilo

    這個動作和 make bzdisk一樣﹐只不過將核心安裝到硬碟而已。這時候﹐請你檢查一下 /etc/lilo.conf 這個檔案﹐確定關於‘lable=Linux’的上一行‘image=’ 要指向 /vmlinuz﹐看起來有點像這樣﹕
        image = /vmlinuz
            label = Linux
            root = /dev/hda5
            ...
    

    如果 image=其他(如﹕image=/boot/vmlinuz-2.2.5-15CLE)的話﹐您就要將之修改過來了。

  3. 完成之後﹐請輸入﹕
    lilo

    確定沒用錯誤後輸入 reboot ﹐取出軟碟機裡面的磁片﹐測試一下裝在硬碟上面的新核心是否工作。

測試核心

如果有問題﹐用軟碟進行開機﹐然後重新檢查一下 /etc/lilo.conf 看看是否設定正確﹐如有修改﹐再執行一次lilo。(更詳細的 lilo安裝我們後面敘述)。因為既然您可以用軟碟開機了﹐那麼新的核心應該沒問題的﹐那通常是系統啟動管理檔案的問題了。

如果遇到 Unresolved symbol 的問題﹐可能是舊的模組還在 /lib/modules 目錄之下﹐您應該用 uname -r 找出當前的核心版本﹐然後將相應的目錄改名﹐再執行一次 make modules_install

同時也確定您在編譯核心時﹐關於 Loadable module support 那裡沒有選擇 Set version information on all symbols for modules 。

如果問題依然﹐可以在執行 make bzlilo 之後﹐或 reboot 之前﹐執行﹕
mv /vmlinux /vmlinux.bak
mv /System.map /System.map.bak
cp /usr/src/linux/arch/i386/boot/bzImage /vmlinuz
cp /usr/src/linux/System.map /System.map

或者﹐參考下一章的“設定 LILO”進行手工安裝核心。

有時候您出盡法寶都無法讓那些討厭的 Unresolved symbol 消失﹐要是那些模組並非必須的﹐那麼干脆從 /lib/modules 目錄下面將它移除就是了。當然﹐在編譯核心的時候選擇 no 也行。

編譯核心有時候會遇到許多麻煩﹐尤其是當您從一個舊的版本升級上來。建議您看看 kernel-HOWTO 和 modules mini-howto 之外﹐還應該看看 /usr/src/linux/Documentation 裡面的文章﹐尤其是 Changes、modules.txt、kmod.txt 等。而且﹐在編譯(make menuconfig)的過程中﹐對任何不明白的選項﹐應該看看 Help 是怎麼說的﹐這非常重要。

 

 


© 2000 Netman 網中人
Last Updated: May 17, 2000