歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux維護 >> Linux操作系統內核編譯詳解(1)

Linux操作系統內核編譯詳解(1)

日期:2017/3/2 10:47:15   编辑:Linux維護

  內核簡介

  內核,是一個操作系統的核心。它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定著系統的性能和穩定性。

  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使用者的必要操作內容。

  為了正確的合理地設置內核編譯配置選項,從而只編譯系統需要的功能的代碼,一般主要有下面四個考慮:

  自己定制編譯的內核運行更快(具有更少的代碼)

  系統將擁有更多的內存(內核部分將不會被交換到虛擬內存中)

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

  將某種功能編譯為模塊方式會比編譯到內核內的方式速度要慢一些

  內核編譯模式

  要增加對某部分功能的支持,比如網絡之類,可以把相應部分編譯到內核中(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,那麼就推薦你使用這個命令。

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

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

  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:讓內核在啟動時有自己裝入必需模塊的能力,建議選上。

Copyright © Linux教程網 All Rights Reserved