Ubuntu 8.04 Linux系統下面編譯更新核心版本

來源:互聯網
上載者:User

在 VirtualBox 虛擬機器上面測試的,ubuntu 8.04系統。
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指令碼的能力才行。

               

               

               

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.