歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Ubuntu 10.04手動更新kernel

1:前奏

請容許我說一些廢話,呵呵,很久以來都說要自己手動更新一下linux的kernel,這個情節現在總算是了了。

如果操作過程中提示缺少什麼東西,請自行用apt-get install 安裝,該安裝問題不在本文范圍內,請問google即可。

2:步驟

A:  get kernel from http://www.kernel.org/pub/linux/kernel/v2.6/

這裡我選了   linux-2.6.36.2.tar.bz2 http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.2.tar.bz2


B: 解壓 :   

  1. cd /usr/src  
  2. tar -xjf /home/mayer/all/smb_share/linux-2.6.36.2.tar.bz2      #我下載的文件放在了這裡   
  3. cd linux-2.6.36.2/  

C: 編譯

  1. su    #切換到root用戶,以免每次在下面的命令前都加sudo   
  2. pwd  
/usr/src/linux-2.6.36.2    #該行是pwd的輸出,不是命令哦,下劃線輸出的均是命令的輸出,下同
  1. ls /usr/src/ | grep 'linux'  
linux-2.6.36.2
linux-headers-2.6.32-25
linux-headers-2.6.32-25-generic
linux-headers-2.6.32-27
linux-headers-2.6.32-27-generic
  1. cp /usr/src/linux-headers-2.6.32-27-generic/.config .config   #拷貝一個上一個的config文件過來,注意文件有一個點,是個隱藏文件   
  2. cp /boot/config-`uname -r`  .oldconfig   #這兩步cp拷貝的動作不是必須的,只是減少一些在下面的kernel的配置中省事一些,如果你不進行這兩步也沒關系   
  3.   
  4. make menuconfig #在這裡你要根據直接的需求決定是否需要新的kernel的某些新功能(輸入N/m/y來決定),如果你進行了上面兩步的話。否則會讓你在界面中選擇你需要的東東   
  5.   
  6. make bzImage #編譯kernel   
  7.   
  8. make modules #編譯模塊  

D: 安裝kernel

  1. make modules_install  #必須先安裝模塊,成功後會在/lib/modules/目錄生成一個以kernel名字命名的目錄   
  2. ls /lib/modules  

2.6.32-21-generic  2.6.32-25-generic  2.6.32-27-generic  2.6.36.2

  1. ls /boot/  
abi-2.6.32-25-generic         memtest86+.bin
abi-2.6.32-27-generic         System.map-2.6.32-25-generic
config-2.6.32-25-generic      System.map-2.6.32-27-generic
config-2.6.32-27-generic      vmcoreinfo-2.6.32-25-generic
grub                          vmcoreinfo-2.6.32-27-generic
initrd.img-2.6.32-25-generic  vmlinuz-2.6.32-25-generic
initrd.img-2.6.32-27-generic  vmlinuz-2.6.32-27-generic
  1. make install  

sh /usr/src/linux-2.6.36.2/arch/x86/boot/install.sh 2.6.36.2 arch/x86/boot/bzImage System.map "/boot"

  1. ls /boot/     

abi-2.6.32-25-generic         System.map-2.6.32-25-generic
abi-2.6.32-27-generic         System.map-2.6.32-27-generic
config-2.6.32-25-generic      System.map-2.6.36.2
config-2.6.32-27-generic      vmcoreinfo-2.6.32-25-generic
config-2.6.36.2               vmcoreinfo-2.6.32-27-generic
grub                            vmlinuz-2.6.32-25-generic
initrd.img-2.6.32-25-generic  vmlinuz-2.6.32-27-generic
initrd.img-2.6.32-27-generic  vmlinuz-2.6.36.2
memtest86+.bin

  1. mkinitramfs 2.6.36.2 -o /boot/initrd.img-2.6.36.2  
如果不進行這一步可能不能成功引導kernel,原因是:在grub引導kernel的時候無法識別kernel所在的位置,即沒有驅動程序來加載硬盤的分區,而initrd恰好是干這件事的。
  1. ls /boot/     
abi-2.6.32-21-generic     config-2.6.36.2               memtest86+.bin                vmcoreinfo-2.6.32-25-generic
abi-2.6.32-25-generic     grub                          System.map-2.6.32-21-generic  vmcoreinfo-2.6.32-27-generic
abi-2.6.32-27-generic     initrd.img-2.6.32-21-generic  System.map-2.6.32-25-generic  vmlinuz-2.6.32-21-generic
config-2.6.32-21-generic  initrd.img-2.6.32-25-generic  System.map-2.6.32-27-generic  vmlinuz-2.6.32-25-generic
config-2.6.32-25-generic  initrd.img-2.6.32-27-generic  System.map-2.6.36.2           vmlinuz-2.6.32-27-generic
config-2.6.32-27-generic  initrd.img-2.6.36.2           vmcoreinfo-2.6.32-21-generic  vmlinuz-2.6.36.2
  1. update-grub                #更新grub,讓我們的kernel能被grub識別並添加到啟動菜單中去  
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.36.2
Found initrd image: /boot/initrd.img-2.6.36.2
Found linux image: /boot/vmlinuz-2.6.32-27-generic
Found initrd image: /boot/initrd.img-2.6.32-27-generic
Found linux image: /boot/vmlinuz-2.6.32-25-generic
Found initrd image: /boot/initrd.img-2.6.32-25-generic
Found linux image: /boot/vmlinuz-2.6.32-21-generic
Found initrd image: /boot/initrd.img-2.6.32-21-generic
Found memtest86+ image: /boot/memtest86+.bin
done

執行上面的命令後,可以在中發現我們的新kernel被添加進去了,見下面的vi部分輸出,自動為我們添加了兩項哦

  1. vi /boot/grub/grub.cfg   
### BEGIN /etc/grub.d/10_linux ###

menuentry 'Ubuntu,Linux 2.6.36.2' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod ext2
        set root='(hd0,1)'
        search --no-floppy --fs-uuid --set 62a097ef-4767-4b5e-8494-ef5fa3298037
        linux   /boot/vmlinuz-2.6.36.2 root=UUID=62a097ef-4767-4b5e-8494-ef5fa3298037 ro   quiet splash
        initrd  /boot/initrd.img-2.6.36.2
}
menuentry 'Ubuntu,Linux 2.6.36.2 (恢復模式)' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod ext2
        set root='(hd0,1)'
        search --no-floppy --fs-uuid --set 62a097ef-4767-4b5e-8494-ef5fa3298037
        echo    '載入 Linux ...'
        linux   /boot/vmlinuz-2.6.36.2 root=UUID=62a097ef-4767-4b5e-8494-ef5fa3298037 rosingle
        echo    '載入引導虛擬磁盤 ...'
        initrd  /boot/initrd.img-2.6.36.2
}
menuentry 'Ubuntu,Linux 2.6.32-27-generic' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod ext2
        set root='(hd0,1)'
        search --no-floppy --fs-uuid --set 62a097ef-4767-4b5e-8494-ef5fa3298037
        linux   /boot/vmlinuz-2.6.32-27-generic root=UUID=62a097ef-4767-4b5e-8494-ef5fa3298037 ro   quiet splash
        initrd  /boot/initrd.img-2.6.32-27-generic

}


E:  重啟驗證

為了以防萬一,在重啟驗證前我們修改一個地方,顯示啟動菜單,默認可能不會顯示的:

  1. vi /etc/default/grub<strong>  
  2. </strong>  
GRUB_DEFAULT=0  #默認選擇第幾個菜單選項,第一個是0
#GRUB_HIDDEN_TIMEOUT=0   #注釋掉這一行

GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""


如果你按照上述步驟來操作的話,you can enter you desktop with new kernel, and view current kernel with command: uname

  1. uname -r  
2.6.36.2
  1. uname -a  

Linux mayer-ubuntu 2.6.36.2 #1 SMP Sat Sep 3 01:28:58 CST 2011 i686 GNU/Linux

3:後悔藥

哈哈,這裡提供一劑良方來處理意外的情況,理論上,如果你按照上述步驟操作的話,可以正常進行桌面的,如果不可以,我們可以選擇前一個kernel來進行啟動系統,當然,這需要你進行步驟2中的重啟驗證中的修改,如果你忘記了修改,而又不能正常引導。而又沒有出現grub菜單讓我選擇以前的kernel來啟動怎麼辦?

有人說可以在開機的時候按shift鍵來顯示,不過我在虛擬機vmware player中發現這個方法不靈光

還有一個救命的招數:

用一個ubuntu 10.04或以後的版本來引導進入桌面,不要選擇安裝,選擇試用就行:

進入系統後將原來的 包含 /etc 分區的分區(多半是根分區了)掛載到試用的linux中,然後按照步驟2中的重啟驗證中的修改默認的啟動kernel即可

比如 我的/etc 沒有單獨分區,所以即在根分區/, 並且我的根分區在 /dev/sda1   (sudo fdisk -l  #可以看到當前硬盤的分區狀況)

  1. mkdir /tmp/sda1  
  2. sudo mount -t  etx4 /dev/sda1 /tmp/sda1  #如果你不知道分區格式,可以省略 -t ext4   
  3. sudo vi /tmp/sda1/etc/default/grub    #按照步驟2中的重啟驗證中的修改默認的啟動kernel  

4:後記

茫茫天數此中求,世道興衰不自由。

萬萬千千說不盡,不如推背去歸休。

Linux這種宏內核的前途如何呢?哎,算了。

Copyright © Linux教程網 All Rights Reserved