編譯lunix 內核詳解

通過網上的資料我自己的實際內核 編譯,我把對Linux內 覈編譯的過程寫在這裏,也許對其他的Linux愛 好者的編譯學習有些幫助,其中很大部分是網上的資料,另外就是我在實際編譯過程中的一些實際經驗。

 

內核簡介

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

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

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

 

內核編譯模式

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

 

實際的內核編譯階段:

一、Linux內核源代碼包的獲取http://www.kernel.org, 編譯內核需要root權 限,以下操作都假定你是root用 戶。請把你需要升級的內核拷貝到/usr/src/下 (下文中以2.4.18的 內核的linux-2.4.18.tar.gz爲 例),命令爲

 

#cp linux-2.4.18.tar.gz /usr/src

 

二、解壓源代碼包 和建立相應的鏈接:

在當前的/usr/src內容裏,注意到有一個linux- 2.4的符號鏈接,指向一個linux-2.4.7-10(以REDHAT7.2爲例)的目錄。這就是你所裝linuxkernel源代碼,刪除這個鏈接。

現在解壓我們下載的源程序文件。如果所下載的是.tar.gz.tgz)文件,請使用下面的命令:#tar -zxvf linux-2.4.18.tar.gz.tar.gz

如果你所下載的是.bz2文件,例如linux-2.4.18.tar.bz2,請使用下面的命令

#bzip2 -d linux-2.4.18.tar.bz2

#tar -xvf linux.2.4.18.tar

文件將解壓到/usr/src/linux目錄中,我們把它稍作修改:

#mv linux linux-2.4.18

#ln -s linux-2.4.18 linux(重 新建立指向剛剛解壓的linux-2.4.18的 鏈接)

 

三、檢查源代碼目 錄下有沒有不正確的.o文件以及文件的互相依賴,運行以下命令:

cd /usr/src/linux

make mrproper

 

四、創建指向你所 編譯內核的asm  linux  scsi鏈 接

爲確保/usr/include/目錄下的asmlinuxscsi等鏈接是指向要升級的內核源代碼的。它們分別鏈向源代 碼目錄下的真正的、該計算機體系結構(對於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下的asmlinuxscsi鏈接後,再創建新的鏈接指向新內核源代碼目錄下的同名 的目錄。這些頭文件目錄包含着保證內核在系統上正確編譯所需要的重要的頭文件。

 

五、內核配置

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

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

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

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

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

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

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

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

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

  Y-將該功能編譯進內核

  N-不將該功能編譯進內核

  M-將該功能編譯成可以在需要時動態插入到內核中的模塊

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

六、編譯,使用以 下命令:

#make dep

#make clean

#make bzImagemake zImage

#make modules

#make modules_install

#depmod -a

  第一個命令make dep實際上讀取配置過程生成的配置文件,來創建對 應於配置的依賴關係樹,從而決定哪些需要編譯而那些不需要;第二命令make clean完成刪除前面步驟留下的文件,以避免出現一些錯誤;make zImagemake bzImage則實現完全編譯內核,二者生成的內 核都是使用g***壓 縮的,只要使用一個就夠了,它們的區別在於使用make bzImage可 以生成大一點的內核。建議大家使用make bzImage命 令。

  後面三個命令只有在你進行配置的過程中,在回答Enable loadable module support (CONFIG_MODULES)時 選了"Yes"纔是必 要的,make modulesmake modules_install分別生成相應的模 塊和把模塊拷貝到需要的目錄中。

  嚴格說來,depmod -a命令和編譯過程並沒有關係,它是生成模塊間 的依賴關係,這樣你啓動新內核之後,使用modprobe命 令加載模塊時就能正確地定位模塊。

 

七、更新部分內容

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

#cp /usr/src/linux/System.map /boot/System.map-2.4.18

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

  以上這兩個文件是我們剛纔編譯時新生成的。下面修改/boot下的兩個鏈接System.mapvmlinuz,使其指向新內核的文件:

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

#ln -s vmlinuz-2.4.18 vmlinuz

#ln -s System.map-2.4.18 System.map

 

八、修改啓動管理 器

  如果用LILO,修改/etc/lilo.conf,添加以下項:

p_w_picpath=/boot/vmlinuz-2.4.18

label=linux240

read-only

root=/dev/hda2

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

  運行:

#/sbin/lilo -v

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

#shutdown -r now

如果是用Grub啓動管理器,則添加如下幾項即可。

title Red Hat linux (2.4.18)

root (hd0,0)

kernel /vmlinuz-2.4.18 ro root=/dev/hda2

Grub不 需再次調用命令,自動生效。

重啓以後就可以用新內核了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章