Linux升級內核總結


Linux內核升級總結。

一、編譯內核步驟
1、#uname –r 確定系統的原內核版本,然后下載較新版本的Linux內核源碼包
http://www.kernel.org/pub/linux/kernel/v2.6/,版本跨度不要太大,至少大版本應該是相同的,比如都是2.6.xx.xx,下面以內核文件linux-2.6.36.tar.bz2為例進行說明。

2、將下載好的內核源碼包放到/usr/src目錄下,解壓文件,得到linux-2.6.36目錄

#cp linux-2.6.36.tar.bz2 /usr/src #cd /usr/src #tar xjvf linux-2.6.36.tar.bz2

3、進入linux-2.6.36目錄,並將原內核配置文件復制到該目錄,並重命名為.config

#cd linux-2.6.36 #cp /boot/config-linux-2.6.18.15PAE .config

4、執行make menuconfig,首先選擇“Load an Alternative Configuration File”找到.config文件載入原來的內核配置,然后在原配置基礎上修改成新內核的配置,make menuconfig配置內核編譯選項時,應該在general setup里選擇兼容老版本程序的名字空間編譯選項,還有一個是,在內核源碼包里的配置文件 ./config文件 中有個選項是CONFIG_SYSFS_DEPRECATED_V2 要設置為y。最后選擇“Save an Alternative Configuration File”保存配置。

在配置內核時,選項前面是[*]表示直接將該功能或驅動編譯到內核(build-in),[M]表示把該項功能或驅動編譯成可加載的模塊(module),[ ]表示不啟用該功能。有些選項要么不啟用 ,要么就只能選擇[*],或者只能選擇[M]。<Space>用於更改選項,<Enter>進入下一級選項,按兩下<ESC>可返回上一級。

5、驗證配置文件
#cat .config | grep xxx 看看相關參數是否已經打開

6、開始編譯、安裝

#make –jn (2.6內核無需使用make dep和make bzImage命令,直接make就能編譯。n為數字,代表同時編譯的進程數,這樣能加快編譯速度,根據機器性能選擇15-25之間即可) #make modules #make modules_install #make install

7、內核升級完成,修改/boot/grub/grub.config,將新內核作為默認啟動項

#cd /boot #ll(可以看到在/boot下面新生成了名為initrd-2.6.36.img的內核鏡像文件) #vim grub/grub.config

 

二、新內核引導報錯的解決方法
問題一:
找不到文件系統,提示Volume group "VolGroup00" not found;

有兩種可能的原因:
A、initrd是舊版本mkinitrd生成的。
解決方法:加入對舊版sysfs路徑的支持,通過make menuconfig配置內核時選中以下選項:
General setup -->[*] enable deprecated sysfs features to support old userspace tools
保存后驗證.config文件中是否有以下內容:
CONFIG_SYSFS_DEPRECATED_V2=y

修改這項是因為舊版的mkinitrd及其nash在內核沒有CONFIG_SYSFS_DEPRECATED_V2參數時默認使用舊版sysfs路徑格式,從而在新內核下無法正確訪問/sys內的硬盤信息節點。

B、新內核中沒有當前Raid卡的驅動。
解決方法:將Raid卡驅動編譯到內核鏡像中,具體步驟如下:
1、以Adaptec 6805 Raid卡為例,到官網下載Raid卡驅動程序的源代碼文件:aacraid-linux-src-1.1.7-29100.tgz
2、解壓源碼RPM,並將驅動程序源代碼復制到/usr/src/linux-2.6.36/drivers/scsi目錄下

#cp aacraid-1.1.7-29100.src.rpm /tmp #cd /tmp #rpm2cpio aacraid-1.1.7-29100.src.rpm | cpio -iuvd #mkdir aacraid #mv aacraid_source.tgz aacraid #cd aacraid #tar xzvf aacraid_source.tgz #rm -f aacraid_source.tar #cd .. #cp –r aacraid /usr/src/linux-2.6.36/drivers/scsi (提示覆蓋文件時選yes)

3、重新編譯內核,注意以下選項一定要選上:
select the Device Drivers -> SCSI device support -> SCSI low-level drivers -> Adaptec AACRAID support

關於重新編譯內核
以上兩種可能的原因在解決的時候都需要重新編譯內核,內核源碼是可以重復編譯的,只不過在重新編譯之前,先清除沒用的文件。

#cd /usr/src/linux-2.6.36 #make mrproper #make menuconfig

以下就是正常編譯步驟了...

問題二:
insmod: error inserting ‘/lib/dm-region-hash.ko’: –1 File exits
這是由於initrd文件里面的init文件在加載dm-region-hash.ko這個模塊時重復了,因此需要修改新生成的內核鏡像文件,步驟如下:
1、解壓initrd

# cp /boot/initrd-2.6.36.img /tmp # cd /tmp/ # mkdir newinitrd # cd newinitrd/ # zcat ../initrd-2.6.36.img | cpio -i # ls bin dev etc init lib proc sbin sys sysroot

2、編輯init,刪掉重復的最后兩行

echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko

3、重新打包initrd

# find . | cpio -c -o > ../initrd # cd .. # gzip -9 < initrd > initrd-2.6.36.img

4、將initrd重新復制到/boot目錄下

# cp initrd-2.6.36.img /boot

5、重啟服務器

注意:在編輯init文件時,一定要刪除后面的重復項,不要刪除前面的,否則重啟引導時會提示insmod: error insering '/lib/dm-mirror.ko -1 Unknow symbol in module

 

問題三:

Mount: could not find filesystem  ‘ /dev/root’

Setuproot : moving /dev failed : No such file or directory

Setuproot : error mounting /proc: No such file or directory

Setuproot : error mounting /sys: No such file or directory

Kernel panic – not syncing : Attempted to kill init! 

原因有兩個,一個是新內核名字空間不兼容問題,解決方法是make menuconfig配置內核編譯選項時,應該在general setup里選擇兼容老版本程序的名字空間編譯選項,還有一個是,在內核源碼包里的配置文件 ./config文件中有個選項是CONFIG_SYSFS_DEPRECATED_V2 要設置為y。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM