Ubuntu 內核編譯

實驗環境:Ubuntu12.04LTS  內核版本  3.5.0   更新內核版本3.9.0   

首先是準備條件:

①、有一臺裝有ubuntu 12.04的機器

②、先移步到http://www.kernel.org/下載linux穩定版內核(注:可以從科大鏡像下載,速度快 http://mirrors.ustc.edu.cn/linux-kernel/   )

③、擁有root權限  

④、並將下載好的內核解壓到/usr/src下,使用命令如下:

        #tar jxvf   linux-3.3.4.tar.bz2

       這樣你就可以得到一個名叫linux-3.3.4

好,現在一切都準備好了,接下來就開始配置,編譯,安裝新內核吧!

1, 進入剛纔的文件夾 /usr/src/linux-3.3.4,輸入命令:

     $ make mrproper

     該命令的功能在於清除當前目錄下殘留的.config和.o文件,這些文件一般是以前編譯時未清理而殘留的。而對於第一次編譯的代碼來說,不存在這些殘留文件,所以可以略過此步,但是如果該源代碼以前被編譯過,那麼強烈建議執行此命令,否則後面可能會出現未知的問題。

2, 配置編譯選項

     作爲操作系統的內核,其內容和功能必然非常繁雜,包括處理器調度,內存管理,文件系統管理,進程通訊以及設備管理等等,而對於不同的硬件,其配置選項也不相同,所以在編譯源代碼之前必須設置編譯選項。其實我覺得這一步是升級內核整個過程中最有技術含量的,因爲要根據自己的需要正確選擇yes or no需要對計算機方方面面的知識都有所瞭解。但是這裏的選項實在是太多了,大概有幾百項之多,我以前曾嘗試着一項一項的選,但是最後還是放棄了,因爲有很多選項不是很明白。

     既然這樣,難道沒有什麼簡便的方法麼? 當然有!那就是make menuconfig 或者make xconfig。我使用的是make menuconfig,但是前提條件是要裝ncurses。

        ncurses 到http://ftp.gnu.org/pub/gnu/ncurses/下載,可以放到任何目錄進行安裝:

                        tar zxvf  ncurses<version>.tar.gz  #解壓縮並且釋放 文件包

cd ncurses<version>        #進入解壓縮的目錄(注意版本)
./configure                        #按照你的系統環境製作安裝配置文件
make                                 #編譯源代碼並且編譯NCURSES庫
su root                              #切換到root用戶環境
make install                     #安裝編譯好的NCURSES庫

     另外,在make menuconfig過程中也會有一些選項需要你來設置*, y, n 或者m,選擇*表示選項中的內容被直接編入內核中,選擇m表示選項中的內容不編入內核,而只是編成獨立的module,用到時才調用。

     ok, 在當前文件路徑下,輸入命令:

    make menuconfig(或者用 make xconfig,我沒有啓用成功)

    根據菜單提示,選擇編譯配置選項,並保存配置文件爲.config(也可以直接複製現有的.config文件,我是這樣做的!!!)(注:這是因爲現在的內核設置針對了大多數的電腦配置,一般包含了基本上的配置,當然寫到這裏你也可以知道,很多配置對於我們一臺機子來說有些多餘的了,有了一定基礎之後具體可以參照內核板塊說明,自己設定。)

3,確定依賴性

    根據以往的經驗,這一步是必須的,但是這次編譯的時候,系統提醒我沒必須要執行這個命令:

    make dep

    如果用現有的.config文件,這裏會有很多內核新增加的驅動和功能讓你確認是否編入內核中,這個你就自己看着輸入y/n/m/?吧!(注:因爲我是沒有設置,所以沒有這三個選項)

4,清除編譯中間文件

    輸入命令:make clean

注:接下來的 5,6 兩個步驟可以使用  make -j4   命令,4是你內核數的兩倍,比如我的機子是T2450 雙核,所以2*2=4,當然你也可以設定另外的常數,但不要超過100,經一些網友實驗得到,*2的效率會好點。如果你還是走5,6兩步的話,速度會慢點咯

5,生成新內核(這是我用的時間07:38-07:57,19分鐘。這裏時間的長短都取決於你機器的性能)

    就是把配置過程中,我們選中編入內核中的程序編譯鏈接生產linux內核,輸入命令:

    make bzImage

6,生成modules(這是我用的時間07:58-09:28)

    和上步差不多,就是把配置過程中,我們選中編成modules的程序編譯鏈接成modules,輸入命令:

    make modules

(注:經過5,6兩步之後,你可以查看是否編譯成功 以下的是x86結構下的內核位置

  1. <span style="color:#FF0000;">root@thinking-N-A:/usr/src/linux-3.9# ls -l arch/x86/boot/bzImage   
  2. -rw-r--r-- 1 root root 5380928 Jun  8 01:11 arch/x86/boot/bzImage  
  3. </span>  


7,安裝modules

    就是把剛纔編譯生產的modules拷到系統文件夾下,以供新內核調用。輸入命令:

    make modules_install

(注:經這一步之後,輸入如下命令,看是否成功

  1. <span style="color:#FF0000;">root@thinking-N-A:/usr/src/linux-3.9# ls -l /lib/modules/  
  2. total 8  
  3. drwxr-xr-x 4 root root 4096 Feb 14 06:09 3.5.0-23-generic      //這個是我原來的內核  
  4. drwxr-xr-x 3 root root 4096 Jun  8 09:40 3.9.0     
  5. </span>  
 


    一切都自動做好了。

8,建立要載入ramdisk的映像文件

(注:如果你的機子是2005年入手的,基本上都是scsi磁盤,也可以查看自己機子的磁盤類型,切換到root權限下,輸入命令 fdisk -l


  1. root@thinking-N-A:/usr/src/linux-3.9# fdisk -l  
  2.   
  3. Disk /dev/sda: 156.3 GB, 156292685824 bytes  
  4. 255 heads, 63 sectors/track, 19001 cylinders, total 305259152 sectors  
  5. Units = sectors of 1 * 512 = 512 bytes  
  6. Sector size (logical/physical): 512 bytes / 512 bytes  
  7. I/O size (minimum/optimal): 512 bytes / 512 bytes  
  8. Disk identifier: 0x8c3283fe  
  9.   
  10.    Device Boot      Start         End      Blocks   Id  System  
  11. /dev/sda1   *        2048      206847      102400    7  HPFS/NTFS/exFAT  
  12. /dev/sda2          206848    67690495    33741824    7  HPFS/NTFS/exFAT  
  13. /dev/sda3        67690496    92266495    12288000    7  HPFS/NTFS/exFAT  
  14. /dev/sda4        92268542   305258495   106494977    f  W95 Ext'd (LBA)  
  15. /dev/sda5        92268544   215148543    61440000    7  HPFS/NTFS/exFAT  
  16. /dev/sda6       215150592   265930751    25390080   83  Linux  
  17. /dev/sda7       265932800   297445375    15756288   83  Linux  
  18. /dev/sda8       297447424   305258495     3905536   82  Linux swap / Solaris  

dev/sda  都爲scsi硬盤

且下面的步驟是針對所有機子的咯

下面的步驟缺少了一個步驟,即將.config 文件拷貝到 /boot 文件下,故首先要進行

  1. <span style="color:#FF0000;"><strong>root@thinking-N-A:/# cp /usr/src/linux-3.9/.config /boot/config-3.9.0</strong></span>  
其中 config-3.9.0 的命名規則爲  config-(版本號)
如若沒有這一步的話,會導致報一個 grep  文件不存在錯誤

)

   如果linux系統安裝在scsi磁盤上,這步是必須的,否則可以跳過。我的linux是裝在vmware上的,用的是虛擬的scsi磁盤,所以必須 要這一步。輸入命令:

   mkinitramfs -o /boot/initrd-linux3.3.4.img  3.3.4

   如果你的linux不是ubuntu,而是其他的發行版本,那麼使用的命令可能不是mkinitramfs,而是mkinitrd,但功能和用法類似。

9,按裝內核

   輸入命令:make install

   (注,這一步也會自動更新grup項)

   此時系統會把linux內核的鏡像文件還有System.map考入到/boot下,然後會自動生成引導菜單。

10, 配置grub引導程序

     (下面的這步我沒做哈,因爲我還比較喜歡自己在開機的時候選擇內核版本)

       既然新的內核編譯並安裝好了,那麼我們要配置系統的引導程序用新內核正確引導,這一步我的是自動添加的,如果沒有自動添加進去就自動動手修改添加吧。對象是/boot/grub/grub.cfg,首先用chmod更改該文件的只讀屬性。然後參照裏面的已有內容添加一個新啓動項,我的新啓動項是:


menuentry 'Ubuntu,Linux 3.3.4' --class ubuntu --class gnu-linux --class gnu --class os {

        recordfail

        gfxmode $linux_gfx_mode

        insmod gzio

        insmod part_msdos

        insmod ext2

        set root='(hd0,msdos1)'

        search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e

        linux        /boot/vmlinuz-3.3.4 root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro   quiet splash $vt_handoff

        initrd        /boot/initrd.img-3.3.4

}

menuentry 'Ubuntu,Linux 3.3.4 (恢復模式)' --class ubuntu --class gnu-linux --class gnu --class os {

        recordfail

        insmod gzio

        insmod part_msdos

        insmod ext2

        set root='(hd0,msdos1)'

        search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e

        echo        '載入 Linux 3.3.4 ...'

        linux        /boot/vmlinuz-3.3.4 root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro recovery nomodeset

        echo        '載入初始化內存盤...'

        initrd        /boot/initrd.img-3.3.4

}

submenu "Previous Linux versions" {

menuentry 'Ubuntu,Linux 3.2.0-24-generic-pae' --class ubuntu --class gnu-linux --class gnu --class os {

        recordfail

        gfxmode $linux_gfx_mode

        insmod gzio

        insmod part_msdos

        insmod ext2

        set root='(hd0,msdos1)'

        search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e

        linux        /boot/vmlinuz-3.2.0-24-generic-pae root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro   quiet splash $vt_handoff

        initrd        /boot/initrd.img-3.2.0-24-generic-pae

}

menuentry 'Ubuntu,Linux 3.2.0-24-generic-pae (恢復模式)' --class ubuntu --class gnu-linux --class gnu --class os {

        recordfail

        insmod gzio

        insmod part_msdos

        insmod ext2

        set root='(hd0,msdos1)'

        search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e

        echo        '載入 Linux 3.2.0-24-generic-pae ...'

        linux        /boot/vmlinuz-3.2.0-24-generic-pae root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro recovery nomodeset

        echo        '載入初始化內存盤...'

        initrd        /boot/initrd.img-3.2.0-24-generic-pae

}

    默認是從新內核鏡像啓動系統。

    萬事ok,敲下reboot,系統啓動後,從grub菜單中選中新內核引導linux,怎麼樣,系統啓動的鼓聲響了吧!

    進入後用uname -a看看是否新內核。

11、刪除舊內核文件


1,查看一下當前內核版本:uname -a
2.查看一下當前系統內的所有內核文件:dpkg --get-selections|grep linux
3.刪除內核文件:
sudo apt-get remove linux-image-3.2.0-24*sudo apt-get remove linux-headers-3.2.0-24*或(刪除當前版本之外的所有內核sudo apt-get purge ~ilinux-image-.*\(\!`uname -r`\)
4.另外一條命令: 
sudo aptitude purge ~ilinux-image-*\(\!'uname -r'\)
這樣就成功刪除了,重啓一下看看是不是沒有那些沒用的內核啓動項了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章