Ubutun下編譯Kernel

來源:互聯網
上載者:User

話說編譯過Kernel,才算入門LINUX! 以前嘗試過多次,都莫名奇妙的錯誤,今天又折騰了一下,終於看到 CC,LD....

編譯Linux核心是核心開發的基本功,如果我們通過直接修改Linux核心代碼來增加核心功能,那麼修改後的核心代碼必須要重新編譯產生新的映像檔案,然後載入該映像檔案便可以啟用新核心。

 不同的Linux發行版本,其核心編譯過程會有所不同。這裡所用平台是Ubutun9.10 Linux kernel為 2.6.31-23-generic,待編譯的Linux kernel為2.6.36.4。此處僅僅是編譯一個乾淨的核心並且載入成功,而並不對核心進行修改。

第一步:下載核心

一般情況下,待編譯的核心(即新核心)的版本不能低於正在啟動並執行版本,如果兩者版本差距較大,則可能需要更新如gcc,binutils之類的編譯工具。這裡只採用Linux發行版所對應的核心版本進行編譯,這樣所有核心編譯工具都是現成的,無須更新。

1)先查看當前環境下的核心版本號碼

#uname –r

2.6.31-23-generic

2)下載相應的核心壓縮包

網址:http://www.kernel.org/(筆者選擇的是linux-2.6.36.4.tar.bz2,只有67.0MB,起初懷疑下錯了,怎麼這麼小>_<,解壓縮後376.4MB)。將核心壓縮包複製到Linux下某個目錄,如/usr/src .

 3)解壓縮包產生代碼樹/usr/src/linux-2.6.36.4

指令如下:root@yuebao-desktop:~# tar jxvf   /home/yuebao/Downloads/linux-2.6.36.4.tar.bz2  -C  /usr/src/

#cd /usr/src/linux-2.6.36.4

說明:

1.從這裡切到了root,後面的編譯全部在root下進行。

2.如果選擇的壓縮包尾碼是.gz,上3)中的第二條指令中的jxvf應換成zxvf。

第二步:產生核心設定檔.config

Linux核心代碼非常龐大,使用於許多體繫結構,包含大量驅動程式。在產生核心的時候要根據實際情況進行配置,所有的配置將儲存在核心代碼樹頂級目錄下的一個名為.config的設定檔中。

 1)、複製設定檔範本

設定檔可以從頭開始產生,一般沒這必要,因為當前正在啟動並執行核心已經有對應的設定檔,在/boot目錄下。將其做模板複製到/usr/src/linux-2.6.36.4目錄下:

#make mrproper

#cp /boot/config-‘uname –r’    ./.config

命 令“make mrproper”用來保證核心樹是乾淨的,如果核心樹已經編譯過,該命令有效;如果核心樹第一次編譯,則可以省略該命令。命令“cp /boot/config-‘uname –r’ ./.config”中“‘uname –r’”代表2.6.31-23-generic,“./.config”中前一點表示將拷貝放置在開頭進入的預設目錄(即/usr/src /linux-2.6.36.4)中,並將其命名為.config的隱含檔案。

2)、產生新核心的.config設定檔

拷貝後雖然有了模板,但是.config檔案的配置並不一定囊括了新核心的所有編譯選項,可以使用下面的命令:

 #make oldconfig或#make silentoldconfig

命 令“#make oldconfig”讀取.config檔案並根據新核心版本更新它。具體是:該命令輸出新核心所有的配置值,如果配置項在.config中有設定,則輸 出設定值;如果是新項,程式會暫停要使用者輸入設定值,如果不知道如何配置,可以一路enter,直到結束,採用預設配置。命令“#make silentoldconfig”和命令“#make oldconfig”功能相似,但他不輸出資訊,除非是新選項要求使用者輸入的時候。

到此,重建的.config檔案就可以使用了。

第三步:編譯和安裝新的核心

1)、可以定義自己的核心版本號碼

在編譯核心之前,使用者可以定義自己的核心版本號碼,這樣做目的是為了便於識別。在核心代碼樹的根目錄下有檔案Makefile,它的前4行的最後一行“EXTRAVERSION=.4”中的值.4可以修改。(當然可以對Makefile檔案不做任何處理)

2)、編譯新核心

執行下面三個命令:

#make all

#make modules_install

#make install

命 令“make all”用於產生期望的核心映像及模組;

“make modules_install”將安裝模組到“ /lib/modules/<待編譯核心版本號碼>”(本地檔案系統,不是/usr/src/linux-2.6.36.4)下面,在此目錄下會建立符號連結build到你的核心源碼目錄,我的 build -> /usr/src/linux-2.6.36.4,其中的一個作用就是 寫自己模組的Makefile時,會用到,如helloWorld的Makefile,可以這樣寫

KERNELDIR ?= /lib/modules/2.6.36.4/build而不需要直接指明 /usr/src/linux-2.6.36.4。另外你會在“/lib/modules”檔案夾中看到其他版本核心的 modules,包括當前系統內容的,不要手癢把這些檔案夾刪除了;

“make install”最終將核心映像等幾個檔案複製到“/boot”目錄,把編譯檔案夾裡面的“arch/x86/boot/bzImage”檔案複製到“/boot”,同時還會複製 config 和 System.map 檔案,最終在“/boot”會多出如下3個檔案:
/boot/config-2.6.36.4
/boot/System.map-2.6.36.4
/boot/vmlinuz-2.6.36.4。

是不是發現缺少了一個 initrd.img 檔案(初始ram磁碟檔案)?使用下面命令建立一個即可:
$  mkinitramfs 2.6.36.4  -o /boot/initrd.img-2.6.36.4  

說明:對於雙核處理器,命令“make all”可改用“make -j2 all”以加快速度。

3)、可以修改引導程式GRUB

如果上述三個命令均執行成功,使用者可以觀察到引導程式grub的設定檔/boot/grub/menu.lst並將其進行合理修改配置。開啟menu.lst的方法之一是:

#gedit /boot/grub/menu.lst

說明:1、命令“gedit /boot/grub/menu.lst”只是用gedit開啟設定檔menu.lst,其他還可以用eamcs,vim,cat,tail等。

           2、為了以後能直接操作菜單,可把menu.lst檔案中hiddenmenu那一行注釋掉(前加#)或刪除,並且可以根據需要設定其中的default和timeout的值,分別表示預設啟動項及等待時間。

假如你(對新核心沒什麼把握)不希望修改 GRUB 啟動菜單,則可以直接在啟動 Linux 時手動指定新核心,方法如下:
重啟電腦,在 GRUB 菜單介面(假如沒有看到的話則重啟電腦時按下ESC鍵)按“c”進入命令模式,先設定開機檔案的分區,下面假設 “/boot”位於第一塊硬碟第一個分區,如果在其他分區則把下面的數字“1”改成“2,3,5,6,7……”等:
set root=(hd0, 1)

指定核心映像和虛擬ram磁碟檔案位置:
           linux /boot/vmlinuz-2.6.36.4 root=/dev/sda1
           initrd /boot/initrd.img-2.6.36.4

注意,在 GRUB 命令模式下也可以按“TAB”鍵自動補完的,不要一個字一個字地敲。最後輸入“boot”啟動。

       4)、重啟查看

用命令#reboot重啟系統就可以看到GRUB菜單已經包含了新編譯的內

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.