ubuntu編譯內核 (個人覺得很詳細)

ubuntu編譯內核
         開始學linux內核,一些自學的時候,觀看的內容,覺得未來複習有幫助。
 

1. 下載內核源代碼
http://www.kernel.org/
下載The latest stable version of the Linux kernel is:  2.6.25.7  ,點後面的“F”  按鈕下載
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.7.tar.bz2
  文件。
2. 在終端 su root命令切換到root權限,然後把linux-2.6.25.7.tar.bz2  文件複製到/usr/src/ 目錄下。
在ubuntu中不能以root身份登錄界面,很奇怪
3. cd 到/usr/src/ 目錄下, 執行  tar  -jxvf  linux-2.6.25.7.tar.bz2     命令解壓源代碼包。就會解壓到
/usr/src/ linux-2.6.25.7,我又把它複製到 /usr/src/ linux-2.6.25.7-widebrihgt 目錄下了,/usr/src/
linux-2.6.25.7-widebrihgt     掛載了一個 8G的盤。
4.root用戶,cd到/usr/src/ linux-2.6.25.7-widebright  目錄下
make mrproper (該命令可確保源代碼目錄下沒有不正確的.o文件     .config文件等)
內核配置工具
(1) make config (純字符提示模式)
       
(2)
make menuconfig (配置內核各選項,居於ncurse 的菜單選擇模式) 
需要ncurse 庫的支持, ubuntu中默認沒有安裝  需要安裝一下
# apt-get install libncurses5-dev   
(3)
# make xconfig     (X窗口的圖形界面,配置內核各選項)     
xconfig基於X11, 使用qt庫, 在Ubuntu中先安裝qt庫: 
# apt-get install libqt3-headers libqt3-mt-dev
我是安裝libncurses5-dev     之後用 menuconfig  來配置的,  都是用他默認配置,
除了
General setup --->
()  Local version - append to kernel release ()
這個可以在內核版本後面加上個性字符串,我輸入了widebrighgt
然後選最後一條,保存配置文件就行了,他會在 /usr/src/ linux-2.6.25.7-widebright 生成 .config 文件





5.編譯內核
只需要運行 make就行了
#make
執行之前可以先運行make clean 清空生成的內核文件,或者編譯中間有問題了,想重新編譯,可以用這
個先清空已經生成的內核文件
我在VirtualBox虛擬機的ubuntu8.04 系統裏面執行make 命令, 結果make一次花的編譯時間應該在兩個
小時以上。注意 /usr/src/ linux-2.6.25.7-widebright的剩餘空間要在2.5G以上,我一開始mount到一個
2G的盤,結果編譯時候提示沒有空間。後來重試了幾次,花了很多時間,最後mount了一個8G的盤,終
於編譯成功了。 看他完成後,佔用的控件大概在1.8G左右。
這個make相當於,手工執行了一下兩步:
# make bzImage 
# make modules (編譯可加載模塊)
其中make bzImage  將在  /usr/src/ linux-2.6.25.7-widebrihgt/arch/i386/boot 目錄下生成一個名字爲
bzImage的內核鏡像文件。  make zImage  命令其實可以生成內核鏡像的,bzImage 的區別就是它是壓
縮的。
make modules 則是生產大量的 *.ko  內核文件,就是模塊化的內核驅動等等吧,你不把它編譯進去
bzImage裏面去的都會另外單獨生成的一個ko文件了,以後需要的時候再由內核加載這個ko模塊。
6.安裝內核
(1)
執行 make install  命令
           
我運行了這一步後,提示需要在GRUB menu.lst 配置文件中把 入口 點指向 /boot/vmlinuz-
2.6.25.7widebright  文件。  應該是已經把上面一步生成的bzImage複製到系統的 /boot 目錄去了, ls
-l看一下 /boot 目錄,可以已經把vmlinuz 文件鏈接到 vmlinuz-2.6.25.7widebright 文件  System.map
文件鏈接到     System.map-2.6.25.7widebright 文件,config 文件鏈接到 config-2.6.25.7widebright 文
件。
(2)
沒有看到模塊的配置信息輸出,所以我又執行了一下 make modules_install 命令,這個是安裝模塊的。
這個會安裝很多 ko文件,最後輸出 DEPMOD  2.6.25.7widebright。不懂這個流程是什麼樣子的。不過
在/lib/modules/ 目錄下面生成了一個 2.6.25.7widebright的目錄,下面 目錄就是上面make modules生
成的那些ko內核模塊文件。
(3)  我上面的編譯過程好像沒有生成initrd鏡像文件,不知道怎麼回事,只好手工來了。什麼是initrd鏡
像請看最後附的那篇文章
生成initrd鏡像文件,redhat系統下面用new-kernel-pkg  命令應該就可以了,後面那篇文章說的mkinitrd
命令不知道是什麼系統。 ubuntu系統下面在網上搜索了一下,應該是用 mkinittramfs 命令來生成的。
運行一下 "mkinitramfs  -o  initrd.img-2.6.25.7widebrihgt     2.6.25.7widebrihgt" ,將在當前目錄下生成
一個名字爲 initrd.img-2.6.25.7widebrihgt大小7.1M左右的initrd 鏡像文件。最後我把它移到 /boot/ 目
錄裏面去。 
注意:最後那個參數“2.6.25.7widebrihgt” 是version,指定 內核版本,就是/lib/modules/  目錄下相應的
文件夾名字。這個一定要指定的,不然他默認使用的是正在運行的系統的版本,最後系統就不能引導成
功。
(4)檢查一下 grub的配置文件
cat  /boot/grub/menu.lst ,  看來make install 命令沒有自動把新編譯的內核的配置寫到grub的配置文
件裏面。修改 timeout  屬性 爲 10,讓等待的時間長一點,然後仿造原有的配置新建一項放在最前面,因爲一開始的default 的值設置爲0的,默認是第一項。增加的內容如下
title          Ubuntu 8.04, kernel 2.6.25-7-widebright
root          (hd0,0)
kernel          /boot/vmlinuz-2.6.25.7widebright root=UUID=a082d103-894e-443a-bf58-8b128c7e5dd1 ro quiet splash locale=zh_CN
initrd          /boot/initrd.img-2.6.25.7widebright
quiet
注意其中的 kernel 和initrd 都指向自己的鏡像文件。 root的 UUID可能沒個人都不一樣的,可以參考GRUB的配置文件說明。






做完上面步驟之後,重啓系統,等到系統提示按 ESC 鍵的時候,可以選擇和進入GRUB的菜單。可以看到自己的內核版本已經顯示出來了。

選擇進入之後,一切正常。
使用uname -a 命令查看,可以看到當前內核已經被更新了
widebright@widebright-desktop:~$ uname -r
2.6.25.7widebright
widebright@widebright-desktop:~$ uname -a
Linux widebright-desktop 2.6.25.7widebright #1 SMP Sat Jun 21 05:37:09 CST 2008 i686 GNU/Linux
widebright@widebright-desktop:~$




=======另附一篇initrd鏡像相關文章==============================================
initrd 鏡像文件的作用與製作
我們在安裝新內核的時候,通常都會編輯lilo.conf 和grub.conf 文件。裏面有一段“initrd=/boot/initrd-
***.img”(其中的***表示內核的版本號)的我們都很少會注意到,有時候還會發現這 一行不要也可以
正常開機。那這個initrd***.img究竟是用來幹什麼的呢?
其實initrd***.img是一個鏡像文件,類似ramdisk,把一段程序打包到img裏,然後在開機的時候在內存
裏開闢一段區域,一般是2m,釋 放到那裏運行,都是一些初始化的程序,比如sisc_mod、ext3、
sd_mod等模塊和insmod、nash等命令。不同內核,初始化的img可 以相同,也可以不同,如果沒有,
可以在grub.conf里加上no initrd,它就跳過initrd的檢測和執行了,以前好像就沒有,後來纔有的。
它的作用是在沒有mount /分區以前,系統要執行一些操作,比如掛載scsi驅動,它就把initrd釋放到內
存裏,作一個虛擬的/,然後執行其根目錄下的一個腳本 “linuxrc”,運行insmod和nash命令掛裝模塊。
爲什麼有的時候我們在lilo或grub的配置文件中不加入該行都可以正常開機呢?這是因 爲我們一般的PC
機都沒有使用scsi硬盤等需要先加載其驅動的設備,所以就算沒有initrd***.img也可以正常開機。但是
如果我們要在服務器上 爲其編譯新內核那就一定不要忘記也爲其新建一個initrd文件呀!
好,下面來看看如何查看initrd***.img裏面的內容和如何爲你的新內核創建一個新的initrd.img文件。
查看initrd.img:
initrd***.img雖然後綴是“img”,但其實它是一個gz格式的文件,我們可以先把它解壓,然後載掛裝到
目錄下:
1、cp initrd.img initrd.gz
2、guzip initrd.gz
3、mount -o loop initrd /mnt/floppy
進入/mnt/floppy目錄,我們就可以看到initrd***.img文件的廬山真面目了。
製作initrd文件
當我們編譯了一個新的內核,也不要忘了爲我們的scsi設備做一個新的initrd鏡像:
語法:
mkinitrd 文件名 內核的目錄名
示例:
mkinitrd initrd-2.4.19.img 2.4.19
initrd-2.4.19.img文件是自己任意取的,但最好對應自己的內核版本號。
2.4.19是在/lib/modules中的目錄名,對應內核的版本。
當然,我們也可以在掛裝了initrd***.img文件後直接添加模塊到/lib目錄中,然後修改linuxrc腳本讓其開
機進行掛裝。但必須具備一定的shell腳本的能力纔行。
附:
一次幫朋友裝好系統後運行sudo,出現下列錯誤,記錄在這了
更改時間爲正確時間後,沒有重啓,重新進入終端時出現: 
"sudo: timestamp too far in the future: Feb 26 06:54:27 2008"
1、先把時間更改爲 大於<sudo: timestamp too far in the future:>後面出現的時間(Feb 26 06:54:27 2008)。
2、在終端使用命令:sudo -k。
3、把時間調整正確。
                
                
                
如果查看原文請點:http://blog.chinaunix.net/u2/76292/showart_1285998.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章