摘要
近幾年,linux大行其道,令不滿windows藍屏的使用者躍躍欲試,結果發現linux安裝不及windows方便,界面不及windows友好,配置不及windows容易,軟件不及windows豐富,以至淺嘗輒止。
LINUX KERNEL 配置編譯中文指南1
摘要
近幾年,linux大行其道,令不滿windows藍屏的使用者躍躍欲試,結果發現linux安裝不及windows方便,界面不及windows友好,配置不及windows容易,軟件不及windows豐富,以至淺嘗輒止。
(2002-09-02 12:34:08)
--------------------------------------------------------------------------------
By Wing, 出處:玉玉安
前言之前言:誰是這篇文章的讀者?
不習慣讀英文資料的非LINUX高手
聲卡不響光驅不轉連不上網等等,只要有問題就行
現在流行的ODL(only disk linux)中做內核部分,那些文章不介紹此點內容。我正在做,完工后整理資料。
BY THE WAY ,想成為LINUX高手嗎?你需要熟練掌握KERNEL COMPILE 、XCONFIGRATER 、LINUXCONFIG、 SAMBA四大利器,你隨時可以找到后三者的大量相關資料,但內核編譯就只好啃為數不多的英文了。
筆者耗時3月,搜集并整理大量資料,在兒童節前連續工作18個小時后,給小企鵝送了這份禮物。
筆者自信是目前為止KERNEL編譯方面最完備的中文資料(將不斷翻譯補充),這可是畢業論文哪!
為什么要放網上呢?首先找這方面資料太難了,文章對各位LINUX愛好者會有所幫助。其次,取之于網用之于網。
歡迎使用這篇文章,請隨便引用,這才符合LINUX自由軟件的精神嘛,不過別忘了提提我的名字,就算為我的辛苦付了點稿酬。
介于內核方面資料較少,歡迎在這篇文章中添加和修改內容,但不要過多刪除,筆者列表要加入你的名字,讓我們為把它變成數百頁的資料而努力。OK,交個朋友吧, 我是玉玉安,email :.net">ziboyuyuan@263.net
目錄
序言
第一章 內核編譯的基礎
第一節內核簡介
第二節內核版本
第三節編譯原因
第四節準備工作
第二章 內核編譯的流程
第一節編譯開始
第二節配置內核
1.代碼成熟等級
2..處理器類型和特色
3.對模塊的支持
4.基本的選擇
5.即插即用支持
6.塊設備支持
7.網絡選項
8.電話支持
9.SCSI設備的支持
10.I2O接口適配器
11.網絡設備支持
12.配置業余無線廣播
13.紅外支持
14.ISDN的文件系統
15.舊型光驅類型(非IDE界面的光驅)
16.字符設備
17.USB支持
18.文件系統
19.控制臺驅動
20.聲卡驅動
21.Kernel hacking
第三節編譯內核
第四節啟用內核
附錄:LILO分析
第三章 內核編譯的應用
第一節嵌入式Linux技術
第二節你的Linux有多大(及實踐結果)
結束語
參考文獻
序言
近幾年,linux大行其道,令不滿windows藍屏的使用者躍躍欲試,結果發現linux安裝不及windows方便,界面不及windows友好,配置不及windows容易,軟件不及windows豐富,以至淺嘗輒止。
其實, Linux有windows無可比擬的兩個優勢:網絡應用和嵌入式技術,這也正是未來最有前途的方向。同時此課題是從理論上設計具有嵌入式Linux操作系統器件的重要組成部分。
如要涉足這兩個方面,就必須對內核有深刻理解。當然,您可以從源代碼入手,但前提是您擁有程序設計和操作系統等多方面專業知識,否則,就利用現成的Linux kernel從編譯內核開始吧。不幸的是,內核編譯方面的資料匱乏。以上兩個原因使我寫這篇論文成為必要。我可以自信得說,這是目前最詳盡的內核編譯方面的中文資料。
值得一提的是,我在搜集翻譯資料的過程中,獲得了操作系統、程序設計、硬件設備、網絡通信等各方各面的知識,極大的拓寬了視野,真正學有所獲。
感謝所有為Linux發展作出貢獻的人,感謝所有Linux中文網站為促進Linux在中國的發展作出的不懈努力,他們是我搜集資料的來源。
特別感謝我的指導老師——官伯然教授和高斌博士,正是他們的辛勤指導讓我順利完成畢業設計。
西電科大 :李玉元 2001/6/1
備注:#----------后跟小的選項
##---------后還有更細選項
注意------上機實踐結果
第一章 內核編譯的基礎
第一節 內核簡介
內核,是一個操作系統的核心,它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定著系統的性能和穩定性。 就好比DOS下的IO.SYS和MSDOS.SYS一體,我們可以把這兩個文件叫做DOS的核心。Linux也有它的核心,通常在根目錄下,一個叫vmlinuz的文件。我們用這個文件來控制我們的整臺PC,包括周邊設備和軟硬磁盤機、CD-ROM、聲卡等。簡單地說,核心就是操作系統本身。沒有了它,就像一個無人住的家,沒有人去維持這個家的動作。一個安定的家需要一個很用心已能當機立斷的主人:一部電腦也需要很有效率已穩定的核心,也就是操作系統。因此,核心是整個系統維持下去的關鍵。
Linux的一個重要的特點就是其源代碼的公開性,所有的內核源程序都可以在/usr/src/linux下找到,大部分應用軟件也都是遵循GPL而設計的,你都可以獲取相應的源程序代碼。任何一個軟件工程師都可以將自己認為優秀的代碼加入到其中,由此引發的一個明顯的好處就是Linux修補漏洞的快速以及對最新軟件技術的利用。而Linux的內核則是這些特點的最直接的代表。
想象一下,擁有了內核的源程序對你來說意味著什么?首先,我們可以了解系統是如何工作的。通過通讀源代碼,我們就可以了解系統的工作原理,這在Windows下簡直是天方夜譚。其次,我們可以針對自己的情況,量體裁衣,定制適合自己的系統,這樣就需要重新編譯內核。在Windows下是什么情況呢?相信很多人都被越來越龐大的Windows整得莫名其妙過。再次,我們可以對內核進行修改,以符合自己的需要。這意味著什么?沒錯,相當于自己開發了一個操作系統,但是大部分的工作已經做好了,你所要做的就是要增加并實現自己需要的功能。在Windows下,除非你是微軟的核心技術人員,否則就不用癡心妄想了。
先介紹一下編譯核心的選項,希望能對大家消除對內核的神秘感有所幫助。
1.代碼成熟等級
2..處理器類型和特色
3.對模塊的支持
4.基本的選擇
5.即插即用支持
6.塊設備支持
7.網絡選項
8.電話支持
9.SCSI設備的支持
10.I2O接口適配器
11.網絡設備支持
12.配置業余無線廣播
13.紅外支持
14.ISDN的文件系統
15.舊型的光驅類型(非IDE界面的光驅)
16.字符設備
17.USB支持
18.文件系統
19.控制臺驅動
20.聲卡驅動
21.Kernel hacking
第二節 內核版本
由于Linux的源程序是完全公開的,任何人只要遵循GPL,就可以對內核加以修改并發布給他人使用。Linux的開發采用的是集市模型(bazaar,與cathedral--教堂模型--對應),為了確保這些無序的開發過程能夠有序地進行,Linux采用了雙樹系統。一個樹是穩定樹(stable tree),另一個樹是非穩定樹(unstable tree)或者開發樹(development tree)。一些新特性、實驗性改進等都將首先在開發樹中進行。如果在開發樹中所做的改進也可以應用于穩定樹,那么在開發樹中經過測試以后,在穩定樹中將進行相同的改進。一旦開發樹經過了足夠的發展,開發樹就會成為新的穩定樹。開發數就體現在源程序的版本號中;源程序版本號的形式為x.y.z:對于穩定樹來說,y是偶數;對于開發樹來說,y比相應的穩定樹大一(因此,是奇數)。確定是以″ root ″的身份簽入,然后cd 到 /usr/src 。uname -r 這個指令將會顯示版本。內核版本的更新可以訪問。
第三節 編譯原因
Linux作為一個自由軟件,在廣大愛好者的支持下,內核版本不斷更新。新的內核修訂了舊內核的bug,并增加了許多新的特性。如果用戶想要使用這些新特性,或想根據自己的系統度身定制一個更高效,更穩定的內核,就需要重新編譯內核。
通常,更新的內核會支持更多的硬件,具備更好的進程管理能力,運行速度更快、更穩定,并且一般會修復老版本中發現的許多漏洞等,經常性地選擇升級更新的系統內核是Linux使用者的必要操作內容。
為了正確的合理地設置內核編譯配置選項,從而只編譯系統需要的功能的代碼,一般主要有下面四個考慮:
---自己定制編譯的內核運行更快(具有更少的代碼)
---系統將擁有更多的內存(內核部分將不會被交換到虛擬內存中)
---不需要的功能編譯進入內核可能會增加被系統攻擊者利用的漏洞
---將某種功能編譯為模塊方式會比編譯到內核內的方式速度要慢一些
以上是針對成熟的Linux套件如Redhat Linux而言,我的目的是為建造嵌入式Linux操作系統做準備,也是必由之路。
第四節 準備工作
第一部分 新版本內核的獲取和更新
Linux內核版本發布的官方網站是,國內各大ftp上一般都可以找到某些版本的內核。新版本的內核的發布有兩種形式,一種是完整的內核版本,另外一種是patch文件,即補丁。完整的內核版本比較大,比如linux-2.4.0-test8.tar.bz2就有18M之多。完整內核版本一般是.tar.gz(.tgz)文件或者是.bz2文件,二者分別是使用gzip或者bzip2進行壓縮的文件,使用時需要解壓縮。patch文件則比較小,一般只有幾十K到幾百K,極少的會超過1M。但是patch文件是針對于特定的版本的,需要找到自己對應的版本才能使用。
編譯內核需要root權限。把需要升級的內核拷貝到/usr/src/下(下文中以2.2.16的內核的linux-2.2.16tar.gz為例),命令為
#cp linux-2.2.16tar.gz /usr/src
先查看當前/usr/src的內容,注意到有一個linux的符號鏈接,它指向一個類似于linux-2.2.14(對應于現在使用的內核版本號)的目錄。首先刪除這個鏈接:
#cd /usr/src
#rm -f linux
現在解壓下載的源程序文件。如果所下載的是.tar.gz(.tgz)文件,使用命令:
#tar -xzvf linux-2.2.16tar.gz
如果下載的是.bz2文件,例如linux-2.2.16tar.bz2,使用命令
#bzip2 -d linux-2.2.16tar.bz2
#tar -xvf linux-2.2.16tar
現在再來看一下/usr/src下的內容,發現現在有了一個名為linux的目錄,里面就是需要升級到的版本的內核的源程序。還記得那個名為linux的鏈接么?之所以使用那個鏈接就是防止在升級內核的時候會不慎把原來版本內核的源程序給覆蓋掉了?,F在也需要同樣處理:
#mv linux linux-2.2.16
#ln -s linux-2.2.16 linux
如果還下載了patch文件,比如patch-2.2.16,就可以進行patch操作(下面假設patch-2.2.16已經位于/usr/src目錄下了,否則需要先把該文件拷貝到/usr/src下):
#patch -p0 < patch-2.2.16
第二部分 準備主機板和相關硬件的說明手冊
其實也不用太詳細,只要知道您的硬件是屬于哪一類型就行了。例如:有一張SCSI卡,那就要知道這張卡的名字,有一臺cd-rom,就要知道這臺光驅是哪一種牌子的,是否為標準的IDE/ATAPI界面,還是另有專屬接口卡呢?或者,主機版是否有支持Triton芯片(通常586以上的電腦常有),這些信息能幫助我們,使得設定變得清楚且容易。
因此,不管您有什么使用手冊,準備好吧。即使現在不用,將來還是會用到的(設X-window system時要顯示卡的手冊)。
第三部分 檢查聲卡的IRQ設定和其種類
如果配有一張聲卡,除了要知道卡的種類外(例如 Sound Blaster)還需要知道這張卡的IRQ地址。一般來說,盧卡的IRQ地址是5或7而IO地址則為220。DMA則l,不過,有時不同的聲卡可能會有不同的設定。因為稍后的選項里,就會要填入這些數字。
第四部分 編譯核心的硬件需求
在編譯核心時,確定您的RAM最好在8MB以上, 否則可能會很慢而且問題會很多,記得查看swap有沒有打開(用free指令)。此外,最好不要超頻,不然很有可能會發生signal 11的錯誤,使得編到一半的核心停了下來,其實編譯核心就好比編譯程序一樣,只是因為構成核心的程序太多了,因此我們能小心盡量小心。
第二章 內核編譯的流程
概述編譯的流程:
編譯開始----- make mrproper;檢查所需的連接
配置核心
編譯核心
編輯/etc/lilo.conf
重新啟動新核心
重新啟動機器
發現并修理故障(仔細看我的文章,應該沒多少問題了)
第一節 編譯開始
通常要運行的第一個命令是:
#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的鏈接的原因之一.
一旦萬事俱備,轉到/usr/src/linux?,F在你也許想停下細讀一下文檔文件,實際上如果你有些特別的硬件,或幾種光驅驅動程需要自己動手設置,他們通常這樣做,當引導時這些驅動程序將給出警告,這并不礙事他們照常工作少,閱讀擴展名為.txt .h.c的文件。通常我發現他們具有共性且易于配置。如果你不想冒險,你沒必要做。記住你照樣可以解開tar文件(或再次安裝.rpm文件)恢復前的文件。
第二節 配置內核 核心內容
接下來的內核配置過程比較煩瑣,但是配置的適當與否與日后Linux的運行直接相關,有必要了解一下選項的設置。
配置內核可以根據需要與愛好使用下面命令中的一個:
#make config(基于文本的最為傳統的配置界面,不推薦使用)
#make menuconfig(基于文本選單的配置界面,字符終端下推薦使用,必須安裝ncurses-dev和tk4-dev庫)
#make xconfig(基于圖形窗口模式的配置界面,Xwindow下推薦使用)
#make oldconfig(如果只想在原來內核配置的基礎上修改一些小地方,會省去不少麻煩)
如果不能使用Xwindow,那么就使用make menuconfig好了。界面雖然比上面一個差點,總比make config的要好多了。
選擇相應的配置時,有三種選擇,它們分別代表的含義如下:
Y--將該功能編譯進內核
N--不將該功能編譯進內核
M--將該功能編譯成可以在需要時動態插入到內核中的模塊
在每一個選項前都有個括號, 但有的是中括號有的是尖括號,還有一種圓括號。 用空格鍵選擇時可以發現,中括號里要么是空,要么是"*",而尖括號里可以是空,"*"和"M"。這表示前者對應的項要么不要,要么編譯到內核里;后者則多一樣選擇,可以編譯成模塊。而圓括號的內容是要在所提供的幾個選項中選擇一項。
在編譯內核的過程中,最煩雜的事情就是這步配置工作了,不清楚到底該如何選取這些選項。實際上在配置時,大部分選項可以使用其缺省值,只有小部分需要根據用戶不同的需要選擇。選擇的原則是將與內核其它部分關系較遠且不經常使用的部分功能代碼編譯成為可加載模塊,有利于減小內核的長度,減小內核消耗的內存,簡化該功能相應的環境改變時對內核的影響;不需要的功能就不要選;與內核關心緊密而且經常使用的部分功能代碼直接編譯到內核中。下面對選項分別加以介紹。