Linux核心編譯完整過程
來源:互聯網
上載者:User
通過網上的資料我自己的實際核心編譯,我把對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為例)的目錄。這就是你所裝linux的kernel原始碼,刪除這個連結。
現在解壓我們下載的來源程式檔案。如果所下載的是.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/目錄下的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連結後,再建立新的連結指向新核心原始碼目錄下的同名的目錄。這些標頭檔目錄包含著保證核心在系統上正確編譯所需要的重要的標頭檔。
五、核心配置
接下來的核心配置過程比較煩瑣,但是配置的適當與否與日後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"。這表示前者對應的項要麼不要,要麼編譯到核心裡;後者則多一樣選擇,可以編譯成模組。而圓括弧的內容是要你在所提供的幾個選項中選擇一項。
至於核心配置的選項在我的以下文章裡有簡單的介紹:
Linux核心編譯配置選項的簡單介紹(一) 和
Linux核心編譯配置選項的簡單介紹(二)
六、編譯,使用以下命令:
#make dep
#make clean
#make bzImage或make zImage
#make modules
#make modules_install
#depmod -a
第一個命令make
dep實際上讀取配置過程產生的設定檔,來建立對應於配置的相依樹狀結構,從而決定哪些需要編譯而那些不需要;第二命令make
clean完成刪除前面步驟留下的檔案,以避免出現一些錯誤;make zImage和make
bzImage則實現完全編譯核心,二者產生的核心都是使用g***壓縮的,只要使用一個就夠了,它們的區別在於使用make
bzImage可以產生大一點的核心。建議大家使用make bzImage命令。
後面三個命令只有在你進行配置的過程中,在回答Enable loadable module
support (CONFIG_MODULES)時選了"Yes"才是必要的,make modules和make
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.map和vmlinuz,使其指向新核心的檔案:
#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,添加以下項:
image=/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不需再次調用命令,自動生效。
重啟以後就可以用新核心了。