Linux核心的編譯
www.jz123.cn 2010-10-03 來源:
中國建站 責任編輯(袁袁)
我要投遞新聞
作為一名Linux系統工程師怎麼可以不會編譯Linux核心呢,就像當兵不會打仗。男人不會保護自己心愛的人一樣,太丟人了..
Linux的一個重要的特點就是其原始碼的公開性,所有的核心來源程式都可以在/usr/src/linux下找到,大部分應用軟體也都是遵循GPL而設計的,你都可以擷取相應的來源程式代碼。全世界任何一個軟體工程師都可以將自己認為優秀的代碼加入到其中,由此引發的一個明顯的好處就是Linux修補漏洞的快速以及對最新軟體技術的利用。
客套的話,空洞的話咱都不說了,說了也沒費勁,你還不一定看。下面以Linux 2.6.15.5核心原始碼為例:
第一步:下載Linux 2.6.15.5核心原始碼linux-2.6.15.5.tar.bz,放入/usr/src 目錄。
第二步:一般情況下要用下面命令來配置核心,可以使用下面命令的任意一個,看自己喜歡了:
#make config(基於文本的最為傳統的配置介面,不推薦使用)
#make menuconfig(基於文本菜單的配置選項)
#make xconfig(要求QT被安裝)
#make gconfig(要求GTK安裝) 其中最值得推薦的當然是menuconfig選項,不需要額外的庫,還直觀形象
選擇了自己要用的選項後儲存退出。我這裡為了以後能將自己寫的核心驅動模組加入核心,選擇了"Enable loadable module support",嵌入式產品一般不需
要動態卸載模組,所以"可以卸載模組"不用選,當然你說哥非要選,就是要跟你做對,你能把我咋滴。說真的,我還真不能把你咋滴..
第三步:#cd ****進入核心源碼目錄,,編譯核心,並將映像複製到相應的目錄:
#make bzImage (產生使用giz壓縮的核心,產生的檔案位於/usr/src/linux/arch/i386/boot 目錄)
#make modules modules_install (編譯核心模組並安裝到/lib/modules/2.6.15.5 目錄)
#cd /usr/src/linux
#mv arch/i386/boot/bzImage /boot/bzImage2.6.15.5
#mv System.map /boot/System.map-2.6.15.5 (System.map-2.6.15.5是編譯產生的Linux 2.6.15.5核心的符號表)
#cd /boot
#mv System.map oldSystem.map
#ln –s System.map-2.6.15.5 System.map(建立相應的System.map符號連結)
第四步:修改啟動選項。以支援從Linux 2.6.15.5啟動選擇菜單
修改/boot/grub/grub.conf檔案,進行如下配置:
title Red Hat Linux (2.6.15.5)
root (hd0,0)
kernel /boot/vmlinuz ro root=/dev/hda2 hdc=ide-scsi //---你的linux所在的分區
進過此配置後,Linux啟動時就會出現選擇菜單。
說明:最後在上面的Linux 2.6.15.5啟動中,沒有設定initrd,這是因為我們直接把SCSI,EXT3等編譯進了核心。如果將他們編譯成模組,initrd則是必須的,否則
啟動會提示"VFS:unable to mounting root fs".為使用initrd,則需要下載較新的mkinitrd並安裝,由於程式包mkinitrd依賴程式包device-mapper,而程式包
device-mapper又依賴於lvm2,因此還要同時下載程式包device-mapper和程式包lvm2。安裝完畢後#mkinitrd /boot/initrd_2.6.15.5.img 2.6.15.5就可以
了,如果執行mkinitrd命令時,提示“No module dm-mem-cache found for kernel 2.6.29.4, aborting.”時,表明該版本的mkinitrd有bug。升級mkinitrd或
參考這篇文章解決這個問題。解決方案:
1是當使用mkinitrd時,使用”–without-dmraid”這個參數。
2是在使用mkinitrd之前,先建立一個noraid檔案。建立方法如下:
# echo "DMRAID=no" > /etc/sysconfig/mkinitrd/noraid
# chmod 755 /etc/sysconfig/mkinitrd/noraid
然後再運行mkinitrd命令。
initrd(Bootloader initialized RAM disk)是指由Bootloader初始化的記憶體盤。在linux核心啟動前,Bootloader會將儲存介質中的initrd檔案載入到記憶體,核心
啟動時會在訪問真正的根檔案系統前先訪問該記憶體的initrd檔案系統。
為了啟動時載入initrd,只需修改grub.conf引導設定檔,在最後添加"initrd /boot/initrd-2.6.15.5.img "這樣就沒問題了。