最新linux內核編譯

步驟

1.安裝git工具,用它下載最新內核源代碼.

sudo apt-get install git(基於ubuntu linux)

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git(這種方式下載速度可能有點慢,但對我們以後進入開源社區開發更方便,很多開源項目都是用git來託管的)

當然你也可以直接在linux內核官網直接下載,這樣速度更快。我由於ubuntu是安裝在虛擬機上,所以使用的是這種方式。

2.我下載的linux內核源代碼是linux-3.17.4.tar.xz.,機器當前的內核是linux-3.13的。

解壓tar.xz文件:先 xz -d xxx.tar.xz 將 xxx.tar.xz解壓成 xxx.tar 然後,再用 tar xvf xxx.tar來解包

3.解壓後的源文件,我們可以將源文件複製到/usr/src目錄下,當然也可以其他目錄下。我直接複製到這個目錄下的,linux內核安裝的默認目錄也是/usr/src目錄。

方法:cp linux-3.17.4.tar /usr/src

4.進入到內核源代碼目錄,需要配置內核,但是配置內核前,可能有一些清理工作需要做(因爲是新下載的內核,所以通常可不必此步驟)

命令:cd /usr/src/linux-3.17.4

make clean 

make mrproper

關於make clean和make mrproper二者的區別,主要是清理程度不一樣。

具體查看這篇文章:http://blog.csdn.net/sidely/article/details/40296745

5.  配置內核,有幾個選項可以選擇:

make config是基於文本的傳統配置界面

make menuconfig是基於文本的選單式配置界面,是最爲靈活的內核配置工具

make xconfig是基於圖形窗口模式的配置界面,需要xWindow圖形環境的支持

make oldconfig用於在原來內核配置的基礎上作修改

但通常我們都是用第二種方式make menuconfig,但在使用該命令之前,一定要安裝一個ncurses,沒安裝會出現下面的情況(見圖)


至於ncurses是什麼?

維基百科:ncursesnew curses)是一個程序庫,它提供了API,可以允許程序員編寫獨立於終端的基於文本的用戶界面。它是一個虛擬終端中的“類GUI應用軟件工具箱。它還優化了屏幕刷新方法,以減少使用遠程shell時遇到的延遲

執行安裝命令:sudo apt-get install libncurses*

有時我們在一些老的ubuntu系統上安裝ncurses庫可能apt-get install libncurses*命令也安裝不上。這時我們就需要自己去網上下載相關係

統版本ncurses,特別注意一定是要跟系統配套的,因爲程序包跟系統有依賴關係的。

筆者前段時間安裝了一個ubuntu 10.10,內核是2.6.35,想編譯個2.6.32內核,於是下載了個libncurses5-dev_5.9-4的ncurses庫,

結果不管怎麼樣也裝不上,並出現下面的情況。


最後按照圖上說的下載了個libncurses5-dev_5.7+20100626-0ubuntu1_i3就可以正常安裝了

安裝命令是:dpkg -ilibncurses5-dev_5.7+20100626-0ubuntu1_i3

安裝完成後再運行make menuconfig,會出現如下界面代表安裝成功,可以進行內核配置了。


在這裏,進入到文本選單,當然可以做一些選擇,但通常如果不是實際應用,只是練習內核編譯,那麼選擇general setup就可以了,然後退出,並保存內核配置。

6.make dep命令是否

在網上有些講訴編譯內核前,還要執行make dep (建立模塊間的依賴信息),我在3.17.4的內核編譯前執行了下這個命令,結果如下:

-插圖


在網上查了一下,這個命令在編譯2.6內核以前是需要的,2.6以後就不需要執行這個命令就可以直接編譯內核,從執行該命令後的警告信息可以看出。

7.編譯內核和模塊,注意這裏是編譯內核和模塊,在網上很多地方都沒將此處敘述清除,這裏有3個命令可供選擇:

make 編譯內核和模塊,相當於make bzImage 加 make modules; 3個多小時

make zImage 編譯長生壓縮形式的內核文件,30分鐘左右

make bzImage 編譯產生高壓縮形式的內核文件,30分鐘左右

關於zlmage,bzImage的區別?

zImage是vmlinuz經過gzip壓縮後的文件,適用於小內核(512KB以內),加載到內存的開始640KB處。

bzImage是big zImage的縮寫,是vmlinuz經過gzip壓縮後的文件,適用於大內核。

可參考http://www.tuicool.com/articles/NvMB3m

 

如果你執行了make,就沒必要執行make modules,前一個在30分鐘,後一個在3小時時間,如果執行make bzImage則需要make modules,前者編譯內核,後者編譯模塊,如果是第一次編譯內核則通常兩個都需要,但如果是後來編程需要,只是修改了內核源碼,則重新編譯內核時並不需要重新編譯模塊。

在此,我先執行

make -j2 bzImage

再執行make modules

 注意,在編譯內核時,可以添加-j選項,來加快內核編譯速度,單核使用-j2,雙核使用-j4

make -j2 bzImage在執行完後,結果如下,代表編譯完成


內核編譯完成後,會在/usr/src/linux/arch/x86/boot目錄中生成一個新內核的映像文件bzImage。如果編譯的內核很小,系統會提示你使用make zImage命令來編譯。這時,編譯程序就會生成一個名叫zImage的內核映像文件。 

make modules這個過程時間較長,估計2~3個小時,3.17.4期間沒出息什麼錯誤,執行完成後結果如下


8.安裝模塊
命令:make modules_install(此時,所有的東西包括安裝好的模塊會在/boot/下生成相應的文件夾

9.安裝內核
命令:make install(完成內核的安裝(會複製內核至標準位置/boot..)相應的grub文件也會做更改

10.安裝完後,重啓按uname -r可以查看linux版本變成了3.17.4


關於老版本的ubuntu系統,安裝完內核與模塊後還需要自己配置一些東西,步驟如下:

具體請參見:http://www.cnblogs.com/devil-91/archive/2012/07/23/2605568.html
1.創建 initrd文件: 
mkinitramfs -o /boot/initrd.img-2.6.32.27
2.更新配置GRUB引導列表 
sudo gedit /boot/grub/grub.cfg 
我的grub.cfg添加如下: 
menuentry 'Ubuntu 10.04,Linux 2.6.32.27' --class ubuntu --class gnu-linux --class gnu --class os { 
recordfail 
insmod ext2 
set root='(hd1,9)' 
search --no-floppy --fs-uuid --set 501d3a42-1d52-4438-99bf-e679da605867 
linux /vmlinuz-2.6.32.27 root=UUID=33883099-83a5-49f3-9c12-ee6a4d90da9e ro   quiet splash 
initrd /initrd.img-2.6.32.27 

# 以下是原2.6.32內核啓動項 
menuentry 'Ubuntu,Linux 2.6.35-22-generic' --class ubuntu --class gnu-linux --class gnu --class os { 
recordfail 
insmod ext2 
set root='(hd1,9)' 
search --no-floppy --fs-uuid --set 501d3a42-1d52-4438-99bf-e679da605867 
linux /vmlinuz-2.6.35-22-generic root=UUID=33883099-83a5-49f3-9c12-ee6a4d90da9e ro   quiet splash 
initrd /initrd.img-2.6.35-22-generic 


        到此爲止,整個內核的編譯就全部完成啦。 

    不過也許你重啓系統時,雖然啓動菜單中增加了新內核2.6.34的啓動項,但極可能會啓動失敗,出現以下提示:

warning:can't open directory /lib/modules/2.6.32.27/modules.dep,no such files or directory 


        此時不應氣餒,玩LINUX要有敢食螃蟹的勇氣和毅力,哈哈。靜下心,選擇從舊內核啓動登錄系統,然後執行以下命令(爲了避免輸入錯誤,最好複製下面的命令)修改後就能成功啓動新內核了。 


###################################### 
sudo su  (保證獲得root權限,否則會提示權限不夠,不能成功完成任務哦) 
cd /boot 
cp initrd.img-2.6.32.27 initrd-2.6.32.27.old (先做一個備份以防萬一,哈哈) 
depmod -a 
update-initramfs -k 2.6.32.27 -c 
cd /tmp 
gzip -dc /boot/initrd.img-2.6.32.27| cpio -id 
touch lib/modules/2.6.32.27/modules.dep 
find ./ | cpio -H newc -o > /boot/initrd.img-2.6.32.27.new 
gzip /boot/initrd.img-2.6.32.27.new 
cd /boot 
mv initrd.img-2.6.34.new.gz initrd.img-2.6.32.27 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章