之前嘗試過將系統升級到2.6.31,結果失敗了,由於工作太緊張,也沒有去繼續嘗試,最近的時間稍微有些空,就又想起來這事情了。到www.kernel.org看了下,最新的內核版本都到2.6.33了,就打算直接升級2.6.33了。
一、環境
使用的Vmware安裝裝的RedHat5.3,下面都是使用的root用戶進行操作
#uname -r
2.6.18-53.el5
二、升級過程
1) 下載內核
升級之前到www.kernel.org看看有沒有最新的內核,目前為止最新的是2.6.33,下載地址是:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.tar.bz2
2) 將linux-2.6.33.tar.bz2拷貝到/usr/local/src目錄下面,使用下面的命令解壓,得到文件夾linux-2.6.33
tar xjvf linux-2.6.33.tar.bz2
3) make distclean
假如是第一次編譯,這一步驟可以省掉的。
4) 復制原有的config文件到linux-2.6.33目錄
#cd /usr/local/src/linux-2.6.33
# cp /boot/config-2.6.18-53.el5 .config
5) make menuconfig
選擇Load an Alternate Configuration File,導入.config文件,更加自己的需要添加功能或者進行精簡。
注:內核配置有兩種方法,一種是直接置入內核* ;另一種是編成模塊M ;兩種方法各有優點;直接編入內核的,比如設備的啟動,不再需要加載模塊的這一過程了;而編譯成模塊,則需要加載設備的內核支持的模塊;但直接把所有的東西都編入內核也不是可行的,內核體積會變大,系統負載也會過重。我們編內核時最好把極為重要的編入內核;其它的如果您不明白的,最好用默認[3]。
修改完畢選擇Save an Alternate Configuration File,然後退出配置。
6) 修改.config文件
在.config文件搜索CONFIG_SYSFS_DEPRECATED_V2,會發現# CONFIG_SYSFS_DEPRECATED_V2 is not set這一行,將該行修改為CONFIG_SYSFS_DEPRECATED_V2=y
假如不修改該行,在升級重新啟動後會報如下的錯,導致啟動失敗
Volume group "VolGroup00" not found
Unalbe to access resume device (/dev/VolGroup00/LogVol00)
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
switchroot: mount failed: No such file or directory
Kernel panic - not syncing:Attempted to kill init!
7) 編譯內核
#make all
大概需要半個小時到一個小時的時間。
8) #make modules_install
9) #make install
這時候會出現3個警告[2]
WARNING: No module dm-mem-cache found for kernel 2.6.33, continuing anyway
WARNING: No module dm-message found for kernel 2.6.33, continuing anyway
WARNING: No module dm-raid45 found for kernel 2.6.33, continuing anyway
經過測試,這3個警告不會影響內核的升級,參考資料[2]中有相關的說明。
10) 修改initrd文件
假如在升級重啟後會報的錯誤insmod: error inserting ‘/lib/dm-region-hash.ko’: –1 File exits,這是由於initrd裡面的init中加載dm-region-hash.ko這個模塊重復了,因此需要修改生成的initrd文件(不是所有的機器都會出現這個錯),修改的方式如下[1],方法見參考資料1:
a) 解壓initrd
# cp /boot/initrd-2.6.33.img /tmp
# cd /tmp/
# ls
initrd-2.6.33.img
# mkdir newinitrd
# cd newinitrd/
# zcat ../initrd-2.6.33.img |cpio -i
# ls
bin dev etc init lib proc sbin sys sysroot
b) 編輯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
c) 重新打包initrd
# find .|cpio -c -o > ../initrd
# cd ..
# gzip -9 < initrd > initrd-2.6.33.img
d) 將initrd重新復制到/boot目錄下
#cp initrd-2.6.33.img /boot
11) 重新啟動
啟動成功。
#uname –r
2.6.33