歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> 菜鳥淺談Linux內核編譯過程與相關知識

菜鳥淺談Linux內核編譯過程與相關知識

日期:2017/2/27 14:25:26   编辑: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哦…自己c




Copyright © Linux教程網 All Rights Reserved