天天看點

如何編譯核心

來源:neweasier

2003-1-4 16:34:00

  核心簡介

  核心,是一個作業系統的核心。它負責管理系統的程序、記憶體、裝置驅動程式、檔案和網絡系統,決定着系統的性能和穩定性。

  Linux的一個重要的特點就是其源代碼的公開性,所有的核心源程式都可以在/usr/src/linux下找到,大部分應用軟體也都是遵循GPL而設計的,你都可以擷取相應的源程式代碼。全世界任何一個軟體工程師都可以将自己認為優秀的代碼加入到其中,由此引發的一個明顯的好處就是Linux修補漏洞的快速以及對最新軟體技術的利用。而Linux的核心則是這些特點的最直接的代表。

  想象一下,擁有了核心的源程式對你來說意味着什麼?首先,我們可以了解系統是如何工作的。通過通讀源代碼,我們就可以了解系統的工作原理,這在Windows下簡直是天方夜譚。其次,我們可以針對自己的情況,量體裁衣,定制适合自己的系統,這樣就需要重新編譯核心。在Windows下是什麼情況呢?相信很多人都被越來越龐大的Windows整得莫名其妙過。再次,我們可以對核心進行修改,以符合自己的需要。這意味着什麼?沒錯,相當于自己開發了一個作業系統,但是大部分的工作已經做好了,你所要做的就是要增加并實作自己需要的功能。在Windows下,除非你是微軟的核心技術人員,否則就不用癡心妄想了。

  

  核心版本号

  

  由于Linux的源程式是完全公開的,任何人隻要遵循GPL,就可以對核心加以修改并釋出給他人使用。Linux的開發采用的是集市模型(bazaar,與cathedral--教堂模型--對應),為了確定這些無序的開發過程能夠有序地進行,Linux采用了雙樹系統。一個樹是穩定樹(stable tree),另一個樹是非穩定樹(unstable tree)或者開發樹(development tree)。一些新特性、實驗性改進等都将首先在開發樹中進行。如果在開發樹中所做的改進也可以應用于穩定樹,那麼在開發樹中經過測試以後,在穩定樹中将進行相同的改進。一旦開發樹經過了足夠的發展,開發樹就會成為新的穩定樹。開發數就展現在源程式的版本号中;源程式版本号的形式為x.y.z:對于穩定樹來說,y是偶數;對于開發樹來說,y比相應的穩定樹大一(是以,是奇數)。到目前為止,穩定樹的最高版本是2.2.16,最新釋出的Redhat7.0所采用的就是2.2.16的核心;開發樹的最新版本是2.3.99。也許你已經發現和多網站上都有2.4.0-test9-pre7之類的核心,但是這并不是正式版本。核心版本的更新可以通路http://www.kernel.org。

  

  為什麼重新編譯核心

  

  Linux作為一個自由軟體,在廣大愛好者的支援下,核心版本不斷更新。新的核心修訂了舊核心的bug,并增加了許多新的特性。如果使用者想要使用這些新特性,或想根據自己的系統度身定制一個更高效,更穩定的核心,就需要重新編譯核心。

  通常,更新的核心會支援更多的硬體,具備更好的程序管理能力,運作速度更快、 更穩定,并且一般會修複老版本中發現的許多漏洞等,經常性地選擇更新更新的系統核心是Linux使用者的必要操作内容。

  為了正确的合理地設定核心編譯配置選項,進而隻編譯系統需要的功能的代碼,一般主要有下面四個考慮:

  l 自己定制編譯的核心運作更快(具有更少的代碼)

  l 系統将擁有更多的記憶體(核心部分将不會被交換到虛拟記憶體中)

  l 不需要的功能編譯進入核心可能會增加被系統攻擊者利用的漏洞

  l 将某種功能編譯為子產品方式會比編譯到核心内的方式速度要慢一些

  

  核心編譯模式

  

  要增加對某部分功能的支援,比如網絡之類,可以把相應部分編譯到核心中(build-in),也可以把該部分編譯成子產品(module),動态調用。如果編譯到核心中,在核心啟動時就可以自動支援相應部分的功能,這樣的優點是友善、速度快,機器一啟動,你就可以使用這部分功能了;缺點是會使核心變得龐大起來,不管你是否需要這部分功能,它都會存在,這就是Windows慣用的招數,建議經常使用的部分直接編譯到核心中,比如網卡。如果編譯成子產品,就會生成對應的.o檔案,在使用的時候可以動态加載,優點是不會使核心過分龐大,缺點是你得自己來調用這些子產品。

  核心編譯詳解

  

  新版本核心的擷取和更新

  

  Linux核心版本釋出的官方網站是http://www.kernel.org,國内各大ftp上一般都可以找到某些版本的核心。新版本的核心的釋出有兩種形式,一種是完整的核心版本,另外一種是patch檔案,即更新檔。完整的核心版本比較大,比如linux-2.4.0-test8.tar.bz2就有18M之多,網速快的使用者可以下載下傳使用。完整核心版本一般是.tar.gz(.tgz)檔案或者是.bz2檔案,二者分别是使用gzip或者bzip2進行壓縮的檔案,使用時需要解壓縮。patch檔案則比較小,一般隻有幾十K到幾百K,極少的會超過1M,網速慢的使用者可以使用patch檔案來更新核心。但是patch檔案是針對于特定的版本的,你需要找到自己對應的版本才能使用。

  編譯核心需要root權限,以下操作都假定你是root使用者。請把你需要更新的核心拷貝到/usr/src/下(下文中以2.4.0test8的核心的linux-2.4.0test8.tar.gz為例),指令為

  

  #cp linux-2.4.0test8.tar.gz /usr/src

  

  讓我們先來檢視一下目前/usr/src的内容,注意到有一個linux的符号連結,它指向一個類似于linux-2.2.14(對應于你現在使用的核心版本号)的目錄。首先删除這個連結:

  

  #cd /usr/src

  #rm -f linux

  

  現在解壓我們下載下傳的源程式檔案。如果所下載下傳的是.tar.gz(.tgz)檔案,請使用下面的指令:

  

  #tar -xzvf linux-2.4.0test8.tar.gz

  

  如果你所下載下傳的是.bz2檔案,例如linux-2.4.0test8.tar.bz2,請使用下面的指令

  

  #bzip2 -d linux-2.4.0test8.tar.bz2

  #tar -xvf linux.2.4.0.test8.tar

  

  現在讓我們再來看一下/usr/src下的内容,你會發現現在有了一個名為linux的目錄,裡面就是我們需要更新到的版本的核心的源程式。還記得那個名為linux的連結麼?之是以使用那個連結就是防止在更新核心的時候會不慎把原來版本核心的源程式給覆寫掉了。我們也需要同樣處理:

  

  #mv linux linux-2.4.0test8

  #ln -s linux-2.4.0test8 linux

  

  這樣我們也有了一個名為linux的符号連結,就不用擔心以後會把它覆寫掉了(也許你會覺得重建立立linux的符号連結沒有必要,但實際上這是必不可少的,下文中會有介紹)。如果你還下載下傳了patch檔案,比如patch-2.4.0test8,你就可以進行patch操作(下面假設patch-2.4.0test8已經位于/usr/src目錄下了,否則你需要先把該檔案拷貝到/usr/src下):

  

  #patch -p0 < patch-2.4.0test8

  

  現在,我們已經把核心源程式更新到最新版本了,下面就讓我們開始核心編譯的旅程吧。

  

  準備工作

  

  通常要運作的第一個指令是:

  

  #cd /usr/src/linux;make mrproper

  

  該指令確定源代碼目錄下沒有不正确的.o檔案以及檔案的互相依賴。由于我們使用剛下載下傳的完整的源程式包進行編譯,是以本步可以省略。而如果你多次使用了這些源程式編譯核心,那麼最好要先運作一下這個指令。

  確定/usr/include/目錄下的asm、linux和scsi等連結是指向要更新的核心源代碼的。它們分别鍊向源代碼目錄下的真正的、該計算機體系結構(對于PC機來說,使用的體系結構是i386)所需要的真正的include子目錄。如:asm指向/usr/src/linux/include/asm-i386等。若沒有這些連結,就需要手工建立,按照下面的步驟進行:

  

  # cd /usr/include/

  # rm -r asm linux scsi

  # ln -s /usr/src/linux/include/asm-i386 asm

  # ln -s /usr/src/linux/include/linux linux

  # ln -s /usr/src/linux/include/scsi scsi

  

  這是配置非常重要的一部分。删除掉/usr/include下的asm、linux和scsi連結後,再建立新的連結指向新核心源代碼目錄下的同名的目錄。這些頭檔案目錄包含着保證核心在系統上正确編譯所需要的重要的頭檔案。現在你應該明白為什麼我們上面又在/usr/src下"多餘"地建立了個名為linux的連結了吧?

  配置

  

  接下來的核心配置過程比較煩瑣,但是配置的适當與否與日後Linux的運作直接相關,有必要了解一下一些主要的且經常用到的選項的設定。

  配置核心可以根據需要與愛好使用下面指令中的一個:

  

  #make config(基于文本的最為傳統的配置界面,不推薦使用)

  #make menuconfig(基于文本選單的配置界面,字元終端下推薦使用)

  #make xconfig(基于圖形視窗模式的配置界面,Xwindow下推薦使用)

  #make oldconfig(如果隻想在原來核心配置的基礎上修改一些小地方,會省去不少麻煩)

  

  這三個指令中,make xconfig的界面最為友好,如果你可以使用Xwindow,那麼就推薦你使用這個指令,界面如下:

  

  

  圖xconfig_main.jpg

  

  如果你不能使用Xwindow,那麼就使用make menuconfig好了。界面雖然比上面一個差點,總比make config的要好多了,下圖為make menuconfig的界面:

  

  圖menuconfig_main.jpg

  

  選擇相應的配置時,有三種選擇,它們分别代表的含義如下:

    Y--将該功能編譯進核心

    N--不将該功能編譯進核心

    M--将該功能編譯成可以在需要時動态插入到核心中的子產品

  如果使用的是make xconfig,使用滑鼠就可以選擇對應的選項。如果使用的是make menuconfig,則需要使用空格鍵進行選取。你會發現在每一個選項前都有個括号, 但有的是中括号有的是尖括号,還有一種圓括号。 用空格鍵選擇時可以發現,中括号裡要麼是空,要麼是"*",而尖括号裡可以是空,"*"和"M"這表示前者對應的項要麼不要,要麼編譯到核心裡;後者則多一樣選擇,可以編譯成子產品。而圓括号的内容是要你在所提供的幾個選項中選擇一項。

  在編譯核心的過程中,最煩雜的事情就是這步配置工作了,很多新手都不清楚到底該如何選取這些選項。實際上在配置時,大部分選項可以使用其預設值,隻有小部分需要根據使用者不同的需要選擇。選擇的原則是将與核心其它部分關系較遠且不經常使用的部分功能代碼編譯成為可加載子產品,有利于減小核心的長度,減小核心消耗的記憶體,簡化該功能相應的環境改變時對核心的影響;不需要的功能就不要選;與核心關心緊密而且經常使用的部分功能代碼直接編譯到核心中。下面就讓我們對常用的選項分别加以介紹。

  1. Code maturity level options

  代碼成熟等級。此處隻有一項:prompt for development and/or incomplete code/drivers,如果你要試驗現在仍處于實驗階段的功能,比如khttpd、IPv6等,就必須把該項選擇為Y了;否則可以把它選擇為N。

  

  2. Loadable module support

  對子產品的支援。這裡面有三項:

  

  Enable loadable module support:除非你準備把所有需要的内容都編譯到核心裡面,否則該項應該是必選的。

  Set version information on all module symbols:可以不選它。

  Kernel module loader:讓核心在啟動時有自己裝入必需子產品的能力,建議選上。

  

  3. Processor type and features

  CPU類型。内容蠻多的,不一一介紹了,有關的幾個如下:

  

  Processor family:根據你自己的情況選擇CPU類型。

  High Memory Support:大容量記憶體的支援。可以支援到4G、64G,一般可以不選。

  Math emulation:協處理器仿真。協處理器是在386時代的寵兒,現在早已不用了。

  MTTR support:MTTR支援。可不選。

  Symmetric multi-processing support:對稱多處理支援。除非你富到有多個CPU,否則就不用選了。

  

  4. General setup

  這裡是對最普通的一些屬性進行設定。這部分内容非常多,一般使用預設設定就可以了。下面介紹一下經常使用的一些選項:

  

  Networking support:網絡支援。必須,沒有網卡也建議你選上。

  PCI support:PCI支援。如果使用了PCI的卡,當然必選。

  PCI access mode:PCI存取模式。可供選擇的有BIOS、Direct和Any,選Any吧。

  Support for hot-pluggabel devices:熱插拔裝置支援。支援的不是太好,可不選。

  PCMCIA/CardBus support:PCMCIA/CardBus支援。有PCMCIA就必選了。

  System V IPC

  BSD Process Accounting

  Sysctl support:以上三項是有關程序處理/IPC調用的,主要就是System V和BSD兩種風格。如果你不是使用BSD,就按照預設吧。

  Power Management support:電源管理支援。

  Advanced Power Management BIOS support:進階電源管理BIOD支援。

  

  5. Memory Technology Device(MTD)

  MTD裝置支援。可不選。

  

  6. Parallel port support

  序列槽支援。如果不打算使用序列槽,就别選了。

  

  7. Plug and Play configuration

  即插即用支援。雖然Linux對即插即用目前支援的不如Windows好,但是還是選上吧,這樣你可以拔下滑鼠之類的體驗一下Linux下即插即用的感覺。

  8. Block devices

  塊裝置支援。這個就得針對自己的情況來選了,簡單說明一下吧:

  

  Normal PC floppy disk support:普通PC軟碟支援。這個應該必選。

  XT hard disk support:

  Compaq SMART2 support:

  Mulex DAC960/DAC1100 PCI RAID Controller support:RAID鏡像用的。

  Loopback device support:

  Network block device support:網絡塊裝置支援。如果想通路網路上的芳鄰的東西,就選上。

  Logical volume manager(LVM)support:邏輯卷管理支援。

  Multiple devices driver support:多裝置驅動支援。

  RAM disk support:RAM盤支援。

  

  9. Networking options

  網絡選項。這裡配置的是網絡協定。内容太多了,不一一介紹了,自己看吧,如果你對網絡協定有所了解的話,應該可以看懂的。如果懶得看,使用預設選項(肯定要選中TCP/IP networking哦)就可以了。讓我們看看,TCP/IP、ATM、IPX、DECnet、Appletalk……支援的協定好多哦,IPv6也支援了,Qos and/or fair queueing(服務品質公平排程)也支援了,還有kHTTPd,不過這些都還在實驗階段。

  

  10. Telephony Support

  電話支援。這個是什麼東東?讓我查查幫助,原來是Linux下可以支援電話卡,這樣你就可以在IP上使用普通的電話提供語音服務了。記住,電話卡可和modem沒有任何關系哦。

  

  11. ATA/IDE/MFM/RLL support

  這個是有關各種接口的硬碟/光驅/錄音帶/軟碟支援的,内容太多了,使用預設的選項吧,如果你使用了比較特殊的裝置,比如PCMCIA等,就到裡面自己找相應的選項吧。

  

  12. SCSI support

  SCSI裝置的支援。我沒有SCSI的裝置,是以根本就不用選,如果你用了SCSI的硬碟/光驅/錄音帶等裝置,自己找好了。

  

  13. IEEE 1394(FireWire)support

  這個是什麼?低版本的沒有見過,看看幫助再說。原來是要Fireware硬體來提高串行總線的性能,我沒有,不選了。

  

  14. I2O device support

  這個也不清楚,幫助裡說是這個需要I2O接口擴充卡才能支援的,在智能Input/Output(I2O)體系接口中使用,又是要硬體,不選了。

  

  15. Network device support

  網絡裝置支援。上面選好協定了,現在該選裝置了,可想而知,内容肯定多得很。還好還好,裡面大概分類了,有ARCnet裝置、Ethernet(10 or 100 Mbit)、Ethernet(1000Mbit)、Wireless LAN(non-hamradio)、Token Ring device、Wan interfaces、PCMCIA network device support幾大類。我用的是10/100M的以太網,看來隻需要選則這個了。還是10/100M的以太網裝置熟悉,内容雖然多,一眼就可以看到我所用的RealTeck RTL-8139 PCI Fast Ethernet Adapter support,為了免得麻煩,編譯到核心裡面好了,不選M了,選Y。耐心點,一般說來你都能找到自己用的網卡。如果沒有,你隻好自己到廠商那裡去要驅動了。

  

  16. Amateur Radio support

  又一個不懂的,應該是配置業餘無線廣播的吧,沒有,不要了。

  

  17. IrDA(infrared)support

  這個要紅外支援,免了。

  

  18. ISDN subsystem

  如果你使用ISDN上網,這個就必不可少了。自己看着辦好了。

  

  19. Old CD-ROM drivers(not SCSI、not IDE)

  做的可真周到,原來那些非SCSI/IDE口的光驅誰還在用啊,自己選吧,反正我是用的IDE的CD-ROM,不選這個。

  

  20. Character devices

  字元裝置。這個内容又太多了,先使用預設設定,需要的話自己就修改。把大類介紹一下吧:

  

  I2C support:I2C是Philips極力推動的微控制應用中使用的低速串行總線協定。如果你要選擇下面的Video For Linux,該項必選。

  Mice:滑鼠。現在可以支援總線、序列槽、PS/2、C&T 82C710 mouse port、PC110 digitizer pad,自己根據需要選擇。

  Joysticks:搖桿。即使在Linux下把搖桿驅動起來意義也不是太大,遊戲太少了。

  Watchdog Cards:雖然稱為Cards,這個可以用純軟體來實作,當然也有硬體的。如果你把這個選中,那麼就會在你的/dev下建立一個名為watchdog的檔案,它可以記錄你的系統的運作情況,一直到系統重新啟動的1分鐘左右。有了這個檔案,你就可以恢複系統到重新開機前的狀态了。

  Video For Linux:支援有關的音頻/視訊卡。

  Ftape, the floppy tape device driver:

  PCMCIA character device support:

  

  21. File systems

  檔案系統。内容又太多了,老法子,在預設選項的基礎上進行修改。介紹以下幾項:

  

  Quota support:Quota可以限制每個使用者可以使用的硬碟空間的上限,在多使用者共同使用一台主機的情況中十分有效。

  DOS FAT fs support:DOS FAT檔案格式的支援,可以支援FAT16、FAT32。

  ISO 9660 CD-ROM file system support:CD光牒使用的就是ISO 9660的檔案格式。

  NTFS file system support:ntfs是NT使用的檔案格式。

  /proc file system support:/proc檔案系統是Linux提供給使用者和系統進行互動的通道,建議選上,否則有些功能沒法正确執行。

  

  還有另外三個大類都規到這兒了:Network File Systems(網絡檔案系統)、Partition Types(分區類型)、Native Language Support(本地語言支援)。值得一提的是Network File Systems裡面的兩種:NFS和SMB分别是Linux和Windows互相以網絡鄰居的形式通路對方所使用的檔案系統,根據需要加以選擇。

  22. Console drivers

  控制台驅動。一般使用VGA text console就可以了,标準的80*25的文本控制台。

  

  23. Sound

  聲霸卡驅動。如果你能在清單中找到聲霸卡驅動那自然最好,否則就試試OSS了。

  

  24. USB supprot

  USB支援。很多USB裝置,比如滑鼠、數據機、列印機、掃描器等,在Linux都可以得到支援,根據需要自行選擇。

  

  25. Kernel hacking

  配置了這個,即使在系統崩潰時,你也可以進行一定的工作了。普通使用者是用不着這個功能的。

  

  總算配置完了,現在存盤退出,當然你也可以把現在的配置檔案儲存起來,這樣下次再配置的時候就省力氣了。

  

  編譯

  

  在繁雜的配置工作完成以後,下面你就可以自己到杯茶耐心等候了。與編譯有關的指令有如下幾個:

  

  #make dep

  #make clean

  #make zImage

  #make bzImage

  #make modules

  #make modules_install

  #depmod -a

  

  第一個指令make dep實際上讀取配置過程生成的配置檔案,來建立對應于配置的依賴關系樹,進而決定哪些需要編譯而那些不需要;第二指令make clean完成删除前面步驟留下的檔案,以避免出現一些錯誤;第三個指令make zImage和第四個指令make bzImage實作完全編譯核心,二者生成的核心都是使用gzip壓縮的,隻要使用一個就夠了,它們的差別在于使用make bzImage可以生成大一點的核心,比如在編譯2.4.0版本的核心時如果使用make zImage指令,那麼就會出現system too big的錯誤提示。建議大家使用make bzImage指令。

  後面三個指令隻有在你進行配置的過程中,在回答Enable loadable module support (CONFIG_MODULES)時選了"Yes"才是必要的,make modules和make modules_install分别生成相應的子產品和把子產品拷貝到需要的目錄中。

  嚴格說來,第七個指令和編譯過程并沒有關系,它是生成子產品間的依賴關系,這樣你啟動新核心之後,使用modprobe指令加載子產品時就能正确地定位子產品。

  

  更新

  

  經過以上的步驟,我們終于得到了新版本的核心。為了能夠使用新版本的核心,我們還需要做一些改動:

  

  #cp /usr/src/linux/System.map /boot/System.map-2.4.0test8

  #cp /usr/src/linux/arch/i386/bzImage /boot/vmlinuz-2.4.0test8

  

  以上這兩個檔案是我們剛才編譯時新生成的。下面修改/boot下的兩個連結System.map和vmlinuz,使其指向新核心的檔案:

  

  #cd /boot;rm -f System.map vmlinuz

  #ln -s vmlinuz-2.4.0test8 vmlinuz

  #ln -s System.map-2.4.0test8 System.map

  

  然後修改/etc/lilo.conf:

  

  #vi /etc/lilo.conf

  

  增加如下一段:

  

  image=/boot/vmlinuz-2.4.0test8

  label=linux240

  read-only

  root=/dev/hda2

  

  其中root=/dev/hda2一行要根據需要自行加以修改。

  運作:

  

  #/sbin/lilo -v

  

  确認對/etc/lilo.conf的編輯無誤,現在重新啟動系統:

  

  #shutdown -r now

  

  在機器重新開機後出現LILO時按TAB鍵,輸入linux240,我們的新核心發揮作用了,好好享受吧。

繼續閱讀