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是什麼?
維基百科:ncurses(new 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期間沒出息什麼錯誤,執行完成後結果如下
mkinitramfs -o /boot/initrd.img-2.6.32.27
我的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