菜鳥俺,最近研究了一下Linux內核的編譯,有些許心得,望同大家分享一下,故有此文…我們這裡要談的不涉及到源碼,只是一些內核編譯的步驟及相關知識…因為本人是菜鳥。所以,也就希望和菜鳥們分享一下…
首先,您要確定您有一台裝有Linux的系統,編譯內核可以在本機上直接對本機內核進行編譯,也可以從網上下載內核在其基礎上進行編譯.我們這裡詳細講一下升級內核的方法,
您可以從www.kernel.org下載到最新的Kernel版本,我們這裡以RedHat9為例(其他版本其實也都一樣,只是在make menuconfig中有點不同),詳細講一下內核編譯的步驟 :
首先,確認您是以[color=red:87a23ac995]root 用戶[/color:87a23ac995]登陸.把內核源碼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類似的錯誤提示,這可是菜鳥們所要注意的哦。不然開頭搞不好。後面就不用談了哦…
[color=red:87a23ac995]1#cd /usr/src/linux-2.4.22
2#make mrproper[/color:87a23ac995]
其實這個步驟是可以不用要的,這個目的是清除原先此目錄下殘留的.config和.o(object文件),如果我們是剛下載的源碼,那麼這一步您就可以省了:),但是如果您已經編譯過多次內核的話,這一步可是一定要的哦,不然以後出現很多小問題,可別怨我沒告訴你….config文件我們會在後面提到…
[color=red:87a23ac995]3#make menuconfig或make config或make xconfig[/color:87a23ac995]
這就開始編譯內核了,打起十二分精神,編譯不好,系統是無法啟動的啦.小心應付,其實這個步驟還有其他兩種方式,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”
[color=red:87a23ac995]4#make dep [/color:87a23ac995](一到兩分鐘)
在確定要編譯哪些東東之後(make *config),這個要確定依賴性,這個東東,手工也可以完成的,只是….怕您要把什麼東東都放下,然後花上十天半個月的來搞,還把您忙的焦頭爛額,還會出錯,不過我們用這條指令就可以完成了,也就不用麻煩您那麼忙著搞了,呵呵,這個確定依賴性以後,然後就要清除一些東東了…
[color=red:87a23ac995]5#make clean [/color:87a23ac995](少於一分鐘)
清除一些不必要的文件,那些亂七八糟的東東是可能會導致您在編譯過程中出現錯誤的哦,一定要做哦…
[color=red:87a23ac995]6#make bzImage[/color:87a23ac995](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裡就指定這個新內核)
[color=red:87a23ac995]7#make modules[/color:87a23ac995](耗費時間取決於您所選擇編譯為modules的數量)
哇哇,又一個耗費時間的步驟來了,您還是找點什麼做做吧,估計也要好久哦,大概20分鐘吧,這個步驟就是把您在make menuconfig裡邊所選擇為M的東東,全部編譯成模塊並放在/usr/src/linux-2.4.22/下…如果你選擇的M比較多的話,還是…去玩會吧,家務沒做啊?功課沒做啊什麼的?不過如果您比較喜歡把所有東東都編進內核的話,那就不需要多長時間,少選一些為M,這樣很快就可以完成,我的只用了一分鐘就完成了,不過如果您有很多不知道而選擇默認的話,那恐怕就要好花時間了. ..
[color=red:87a23ac995]8#make modules_install[/color:87a23ac995]
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的哦…
[color=red:87a23ac995]注意[/color:87a23ac995]哦,如果你用的是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目錄了…
到這裡,[color=olive:87a23ac995]以下就有兩種做法哦…[/color:87a23ac995]
[color=olive:87a23ac995]一 手動更新System.map文件[/color:87a23ac995]
它是當前正在運行的kernel的fuctions的說明,如果您編譯內核後不更新System.map,如果碰到問題.,Trouble shooting就很困難了哦,您可有可能遇見很多煩人的信息哦,所以我們還是手動更新一次哦,也蠻簡單的…
#cp /usr/src/linux-2.4.22/System.map /boot/System.map
系統會提示您:
Overwrite the ‘boot/System.map’
敲入Y,回車
[color=olive:87a23ac995]二 make install[/color:87a23ac995]
說到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啦,當然這個最好還是帶著吧,前邊我們也講了它的作用了,主要還是一些驅動….以及系統初始化的程序…
好了,就到這裡了…假如您有什麼疑問,在下面跟貼討論啊:)
本來要有好長的,但是實在因為考試太多…又要忙著畢業…所以簡短的完成…對不住哦…有問題請發MAIL到[email protected]討論吧…
ps:如果誰有興趣把make menuconfig的全過成以及詳細解釋寫出來,那就最好了….
這個實在寫的太菜….等偶進一步完善….有什麼錯誤請大家斧正,謝謝...
發布人:zhanyan9076
來源:www.chinaunix