此處將內核由高版本替換成低版本。替換前的系統爲ubuntu 12.04 kernel 3.8.0. 替換後的內核版本爲2.6.35.html
首先下載須要替換的內核文件,下載連接:https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.tar.gzlinux
下載完成後開始進行解壓編程
$ sudo tar -zxf linux-2.6.35.tar.gz /usr/src
如今開始進行替換,步驟以下:ubuntu
1)安裝必要的軟件包。在正式替換以前先安裝幾個必要的軟件包:ide
$ sudo apt-get install build-essential kernel-package libncurses5-dev libqt3-headers
各個包的主要做用以下:工具
build-essential: 基本的編程庫(gcc, make等)post
kernel-package: Debian 系統裏生成 kernel-image 的一些配置文件和工具ui
libncurses5-dev: make menuconfig要調用的es5
libqt3-headers: make xconfig要調用的spa
其餘的工具在升級過程當中能夠根據提示安裝。
2)解壓。將已經下載的linux-2.6.35.tar.gz拷貝到/usr/src目錄下,而後解壓到/usr/src/linux-2.6.35目錄下。
3)拷貝原有配置文件。把正在使用中的內核配置文件/usr/src/linux-headers-3.8.0-29-generic/.config 拷到/usr/src/linux-2.6.35目錄下
$ sudo cp /usr/src/linux-headers-3.8.0-29-generic/.config /usr/src/linux-2.6.35
4)導入配置文件。運行如下命令:
$ cd /usr/src/linux-2.6.35 $ sudo make menuconfig
//*************可能出現的問題*************
問題:提示unable to find the ncurses libraries
解決方案:sudo apt-get install ncurses-dev
*************///
這時,終端會彈出一個配置界面,注意主菜單最後有兩項:
load a kernel configuration...
save a kernel configuration...
先選第一項 load ....,意思是,利用當前的內核配置詳單來設置將要編譯的內核,而後選save這一項保存,最後退出配置界面。
5)開始編譯,依次輸入如下命令:
$ sudo make mrproper //清除之前曾經編譯過的舊文件,若是你是第一次編譯,可不執行。 $ sudo make //編譯,此過程須要較長時間。
//*************可能出現的問題*************
問題1:gcc: error: elf_i386: no such file or directory
解決方案:
在文件:/usr/src/linux-2.6.35/arch/x86/vdso/Makefile中:
replace "-m elf_x86_64" by "-m64" on the line starting with VDSO_LDFLAGS_vdso.lds
replace "-m elf_x86" by "-m32" on the line starting with VDSO_LDFLAGS_vdso32.lds
問題2:error: duplicate member ‘page’
解決方案:
打開文件drivers/net/igbvf/igbvf.h,而後將129行的代碼註釋掉便可。
struct page *page //將此代碼刪除或註釋掉
**************************//
$ sudo make install $ sudo make modules //編譯模塊
//*************可能出現的問題*************
問題:modpost: found 96 section mismatch(es).
‘make CONFIG_DEBUG_SECTION_MISMATCH=Y’
解決方案:
sudo make CONFIG_DEBUG_SECTION_MISMATCH=y
**************************//
$ sudo make modules_install //安裝模塊
6)最後建立initrd文件:
# mkinitramfs -o /boot/initrd.img-2.6.35
7)更新grub引導列表
$ sudo update-grub $ sudo gedit /boot/grub/grub.cfg
將Code3拷貝至Code1和Code2之間,即將Ubuntu, with Linux 2.6.35啓動項拷貝至最前面,這樣在重啓時系統會自動選擇第一個做爲默認啓動,因而就能進入內核爲Linux 2.6.35的系統。
Code1:
if [ "${linux_gfx_mode}" != "text" ]; then load_video; fi
Code2:
menuentry 'Ubuntu, with Linux 3.8.0-29-generic' --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 a5208505-6372-4e32-b5f8-8b554b2a0b85 linux /boot/vmlinuz-3.8.0-29-generic root=UUID=a5208505-6372-4e32-b5f8-8b554b2a0b85 ro quiet splash $vt_handoff initrd /boot/initrd.img-3.8.0-29-generic }
Code3:
menuentry 'Ubuntu, with Linux 2.6.35' --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 a5208505-6372-4e32-b5f8-8b554b2a0b85 linux /boot/vmlinuz-2.6.35 root=UUID=a5208505-6372-4e32-b5f8-8b554b2a0b85 ro quiet splash $vt_handoff initrd /boot/initrd.img-2.6.35 }
可能出現的問題:
問題一:在重啓後可能會出現以下問題:
warning: can't open directory /lib/modules/2.6.34/modules.dep, no such files or directory
解決方案:
這時,能夠先從舊內核中進入系統,而後執行如下命令:
$ su root //得到root權限 # cd /boot # cp initrd.img-2.6.35 initrd-2.6.35.old //備份原有文件 # depmod –a //檢查全部模塊 # update-initramfs –k 2.6.35 –c # cd /tmp # gzip –dc /boot/initrd.img-2.6.35| cpio –id # touch lib/modules/2.6.35/modules.dep # find ./ | cpio –H newc –o > /boot/initrd.img-2.6.35.new # gzip /boot/initrd.img-2.6.35.new # cd /boot # mv initrd.img-2.6.35.new.gz initrd.img-2.6.35
此部分的參考連接:
http://kpjack.blog.51cto.com/627289/318296/
內核替換更多介紹: