歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Ubuntu 10.04手動更新kernel

Ubuntu 10.04手動更新kernel

日期:2017/2/28 16:07:40   编辑:Linux教程

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. make menuconfig #在這裡你要根據直接的需求決定是否需要新的kernel的某些新功能(輸入N/m/y來決定),如果你進行了上面兩步的話。否則會讓你在界面中選擇你需要的東東
  4. make bzImage #編譯kernel
  5. 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