天天看點

核心編譯(轉)

這是一篇關于核心編譯的文章,作者是雙眼皮的豬,覺得好,是以收藏了

    菜鳥淺談Linux核心編譯過程...      

菜鳥編譯Linux核心

雙眼皮的豬

菜鳥俺,最近研究了一下Linux核心的編譯,有些許心得,望同大家分享一下,故有此文…我們這裡要談的不涉及到源碼,隻是一些核心編譯的步驟及相關知識…因為本人是菜鳥。是以,也就希望和菜鳥們分享一下…

首先,您要确定您有一台裝有Linux的系統,編譯核心可以在本機上直接對本機核心進行編譯,也可以從網上下載下傳核心在其基礎上進行編譯.我們這裡詳細講一下更新核心的方法,

您可以從www.kernel.org下載下傳到最新的Kernel版本,我們這裡以RedHat9為例(其他版本其實也都一樣,隻是在make menuconfig中有點不同),詳細講一下核心編譯的步驟 :

首先,确認您是以root 使用者登陸.把核心源碼cp到/usr/src目錄底下(請确認您是以root的身份在進行操作,否則會傳回Permission Denied的提示):

mkdir /usr/src/linux-2.4.22

cp 2.4.22.tar.bz2 /usr/src/linux-2.4.22 (我用的是2.4.22的kernel)

解壓縮之,熟悉linux系統的朋友應該會知道:

bunzip2 ***.tar.bz2 | tar xvf

進 入到/usr/src/linux-2.4.22目錄,,請确定您是在此目錄下操作,而且保證您所敲入的指令是正确的,不然會傳回No rule to make target ***,stop類似的錯誤提示,這可是菜鳥們所要注意的哦。不然開頭搞不好。後面就不用談了哦…

1#cd /usr/src/linux-2.4.22

2#make mrproper

其 實這個步驟是可以不用要的,這個目的是清除原先此目錄下殘留的.config和.o(object檔案),如果我們是剛下載下傳的源碼,那麼這一步您就可以省 了:),但是如果您已經編譯過多次核心的話,這一步可是一定要的哦,不然以後出現很多小問題,可别怨我沒告訴你….config檔案我們會在後面提到…

3#make menuconfig或make config或make xconfig

這就開始編譯核心了,打起十二分精神,編譯不 好,系統是無法啟動的啦.小心應付,其實這個步驟還有其他兩種方式,make config以及make xconfig,make config是一個一個的回答問題,指令行方式,您如果回答錯了一個,您就不能改正了哦(是以不推薦這種編譯方式),make menuconfig和make xconfig提供了更友好的操作方式,不過make menuconfig需要ncurse包,而make xconfig也需要某個東東,好象是tk,忘記了,一般都安裝了,俺就不提了,如果沒有您可沒法運作的哦.什麼你不知道什麼是ncurse和tk是什 麼?那我就不說了,去www.google.com去搜尋一下吧...

這裡邊很多東東都要注意選啊,這個要求您對硬體,軟體,網絡有一定的認識,實在不知道就按預設的來吧.免得以後啟動不了罵天罵地都沒用哦,我可是好多次啟動不了,最後才摸出竅門的…

這個不是這個文章的主題(其實我很想寫的,但是沒人合作,一個人寫又太累,再加上我最近也忙考試,是以…)是以我們就略過哦…

在make menuconfig中,有的讓您選擇[*],有的讓您選擇[M],有的讓你選擇[],*表示選中直接加載進kernel,而M則表示會在後面的make modules中編譯成modules,讓您随時可以通過insmod和modprobe調入核心…個人認為Linux的這個功能确實非常非常的棒…而這 可是其他作業系統所沒有的哦. ..而make *config的目的就是生成.config檔案.至于想知道.config檔案是幹啥子的,看一下就知道了…J

這個步驟完成之後,系統會提醒您,next step you should run “make dep”

4#make dep (一到兩分鐘)

在 确定要編譯哪些東東之後(make *config),這個要确定依賴性,這個東東,手工也可以完成的,隻是….怕您要把什麼東東都放下,然後花上十天半個月的來搞,還把您忙的焦頭爛額,還 會出錯,不過我們用這條指令就可以完成了,也就不用麻煩您那麼忙着搞了,呵呵,這個确定依賴性以後,然後就要清除一些東東了…

5#make clean (少于一分鐘)

清除一些不必要的檔案,那些亂七八糟的東東是可能會導緻您在編譯過程中出現錯誤的哦,一定要做哦…

6#make bzImage(15分鐘左右)-

哦,這個可是最最最重要的啦.這個就是生成您的新核心了,不要告訴我您不知道核心是什麼啊,也就是kernel啦,所有的系統硬體軟體互動都靠它了哦..

其 實可以是make zImage的,但是你要確定您所編譯的這個新核心在640K之下,您就可以使用make zImage,如果比640K大,那就要用make bzImage,您要說沒編譯出來咋知道多大呢?我的看法是建議用bzImage,因為我編譯出來的核心一般都是800~900K左右. …我是菜鳥,本文章也是為我一樣的菜鳥所寫,是以. ..咱們就預設make bzImage…

還要注意哦,這段時間你是沒法做事的,你會看 見螢幕上一行一行的字往下跑,不用擔心哦,你可以選擇把這些标準輸出上的東東都重定向到/dev/null去哦,這樣您就看不到這些東東了,當然,你也可 以把它放在背景執行啊,在運作要開始的時候在後面加上一個&符号,這個表示是背景運作…如果您怕這些會對您編譯核心有什麼影響(其實沒什麼影響 哦),那您幹脆就這樣,按Alt+F2,直接打開另一個虛拟終端,在那裡邊做事,等到編譯完的時候。機器會咚的一聲通知您的哦,您要真不想等的話,就去玩 會吧,聽聽歌什麼的,過會再回來,這裡可是考驗您耐心的時候哦,如果這您都沒耐心,那後面還有個耗時的步驟哦,還是忍忍吧,為了不讓系統浪費資源,你還是 忍忍哦,成功後您一定會很高興的…

假如您的核心現在已經編譯好了,當然越小越好哦J,這時候系統會有個提示編譯後的bzImage放到哪裡去 了,提示最後幾行,已經告訴了您的新編譯出的核心位置啊,一般都在這裡哦(我這裡是RedHat9),/usr/src/linux- 2.4.22/arch/i386/boot/,這時候您要做的就是把它放到/boot目錄底下去哦,不然系統可沒法啟動的 …

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

(這裡其實已經把bzImage更名為vmlinuz-2.4.22,呆會在/boot/grub/grub.conf裡就指定這個新核心)

7#make modules(耗費時間取決于您所選擇編譯為modules的數量)

哇 哇,又一個耗費時間的步驟來了,您還是找點什麼做做吧,估計也要好久哦,大概20分鐘吧,這個步驟就是把您在make menuconfig裡邊所選擇為M的東東,全部編譯成子產品并放在/usr/src/linux-2.4.22/下…如果你選擇的M比較多的話,還是…去 玩會吧,家務沒做啊?功課沒做啊什麼的?不過如果您比較喜歡把所有東東都編進核心的話,那就不需要多長時間,少選一些為M,這樣很快就可以完成,我的隻用 了一分鐘就完成了,不過如果您有很多不知道而選擇預設的話,那恐怕就要好花時間了. ..

8#make modules_install

hoho, 這裡可是安裝module的步驟了,您所選擇的子產品編譯完成後都放在/usr/src/linux-2.4.22某子目錄下,哪個子目錄您看一下就知道 了,make modules之後會有提示的..我也忘記了,呵呵:),這多不好,而insmod以及相關指令都是從/lib/modules/linux- 2.4.22下取module的啊,這個指令就是把編譯好的mod放到/lib/modules下去的哦,如果開始沒有Linux-2.4.22目錄, (也就是說您是第一次編譯2.4.22的核心),那麼這條指令就會自動建立該目錄,如果已經有了。那就會把編譯後的核心放進該目錄 …您以後要把mod調進kernel的時候(insmod,modprobe)都從這裡尋找.o的哦…

注意哦,如果你用的是SCSI硬碟并且采用的是ext3分區格式的話,請注意,您一定要制作initrd.img(因為SCSI卡的驅動包括在這個裡邊),如果你使用的是IDE硬碟,您可以跳過這一步,當然,您要是有耐心的話,這裡學習一下也沒什麼壞處哦

mkinitrd 可以制作initrd.img,一般是這麼使用的,如果想具體了解的話,可以man mkinitrd,如果隻想搞個initrd.img出來的話,那就mkinitrd /boot/initrd-custom.img 2.4.22就在/boot目錄下建立了一個initrd-custom.img檔案,也就是初始化鏡像…(initialed ramdisk)…裡邊主要有一些驅動,因為放在核心中就顯得過大,是以編譯進initrd.img,在啟動中釋放…而這個2.4.22就表示 /lib/modules下面的2.4.22目錄了…

到這裡,以下就有兩種做法哦…

一 手動更新System.map檔案

它是目前正在運作的kernel的fuctions的說明,如果您編譯核心後不更新System.map,如果碰到問題.,Trouble shooting就很困難了哦,您可有可能遇見很多煩人的資訊哦,是以我們還是手動更新一次哦,也蠻簡單的…

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

系統會提示您:

Overwrite the ‘boot/System.map’

敲入Y,回車

二 make install

說 到make install我們這裡又有點話要說哦,make install就相當于一個自動化的過程啦,因為其他東東它都會幫您做好的,如果您确實比較懶,或者已經對前邊的步驟已經很沒耐心了,您就直接執行此步驟 吧…當然您可以很快做好新系統了,而且可以重新從新核心啟動哦,但是您可能對這中間發生的事情就不明白了哦,小時侯上課的時候老師談什麼要授之以漁,而不 要授之以魚,沒辦法。您要是覺得麻煩,俺就省了,俺手還覺得累,呵呵:)

還是談談這個過程吧,這期間,系統會把您的目前release版本号後面加上一個custom然後寫到grub.conf裡邊去,重新啟動後您就可以看到2.4.22custom的選單了 …

至于這個檔案名是怎麼決定出來的呢?您可以看一看/usr/src/linux-2.4.22哦,裡邊有個Makefile,您試一下

#head –n 5 Makefile

相信你已經看出來了吧…這也就是命名的原因啦,于是您也可以自己修改您的Linux哦…自己custom一下release名稱豈不爽哉…

從 以上步驟來看,基本上已經沒有什麼問題了,當然,請确認您在make menuconfig裡邊沒有做過任何錯誤的事情哦,不然重新啟動後,依然引導不了的,譬如fs裡邊一定要選中VFS,EXT3編譯為M,因為現在系統一 般都采用了ext3格式,您要是漏掉這個東東,加載不了分區,可别怨我沒告訴你哦,當然second extended fs更是一定要選啦:)

我在編譯的曆史中曾經有VFS:Unable to mount root fs on 00:00的經曆,一直卡在那裡,好久都沒解決啊,不過後來終于發現應該是fs的問題,或者是您的root分區沒指定好啊..

看 了這麼多。相信您也很累了,文章也快到頭了,因為馬上就要完了…(如果上邊您選擇了make install,這裡您就不用看了哦)最最最最後一點,我們要修改Grub.conf(如果您采用的是grub來引導的話,抱歉我不懂lilo,因為我也 是菜鳥…),使系統在重新啟動後可以從新的核心啟動…

#vi /boot/menu.lst

menu.lst跟grub.conf内容是一樣的哦,是個link,不過這裡邊可是彩色的文字,我很喜歡,就編輯它了..

在原來的基礎上添加一行:

title new Linux(2.4.22) //這裡您可以自己命名,也就是出現在grub啟動菜單裡的東東哦

kernel /vmlinuz-2.4.22 ro root=LABEL=/

上邊這行是指定kernel 的路徑,記得我們前邊生成一個vmlinuz-2.4.22的新核心嗎?對了哦,就是它了…這裡指定為它後,在您選擇以這個選項啟動後,就會起用這裡的新核心了.

後面跟着的ro 表示是readonly,就是隻讀的意思咯,root=LABEL=/是指定路徑

initrd /initrd.img

這 裡要指定為您所制作的initrd.img哦,如果這個制作錯誤的話,可啟動不了的哦…當然,這說的是您使用的是SCSI硬碟,如果是IDE硬碟的話。您 可以在這裡寫上no initrd取代,這樣系統就不會使用intird啦,當然這個最好還是帶着吧,前邊我們也講了它的作用了,主要還是一些驅動….以及系統初始化的程式…

好了,就到這裡了…假如您有什麼疑問,在下面跟貼讨論啊:)

本來要有好長的,但是實在因為考試太多…又要忙着畢業…是以簡短的完成…對不住哦…

繼續閱讀