Linux 2.4->2.6內核升級指南

轉載:原文:http://linux.chinaitlab.com/kernel/390371.html

前言: linux-2.6.x內核發佈後, 罈子裏的兄弟們肯定都迫不及待地要升級原有的2.4.x內核. 但是由於與2.6.x內核配套的系統程序並沒有相應的來得及更新, 升級過程會碰到很多問題, 因此覺得有必要把我的經驗與大家share一下:-) XD們以後碰到類似問題時, 請先閱讀本文, 而不要一上來就盲目發帖.

ps, you are welcome to fix me.

1. 備份重要的數據

這是個好習慣,就不用多說了:-)

2. 下載最新的2.6.x內核源碼包

這個當然要到官方網站www.kernel.org或者它的mirror站點去下載了, 最好別到那些unknown的網站去下, 因爲那些源碼包有可能被惡意做了手腳. 最新的linux-2.***.tar.bz2源碼包大概有33M左右. 下載的時候可以泡杯coffee, 然後點根菸......

在/usr/src/目錄下解開源碼包, 得到源代碼目錄/usr/src/linux-2.***/. 在對kernel做任何事情之前, 建議你先看一下它的README文件和Documentation/Changes文件, 從中你會得到不少有用的信息. 這些信息會讓你在隨後的升級過程避免很多不必要的麻煩.

在文檔Documentation/Changes中給出了欲成功地升級到kernel-2.6.x所需的最小系統軟件要求, 比如對於kernel-2.***是這樣的:

o Gnu C 2.95.3 # gcc --version
o Gnu make 3.79.1 # make --version
o binutils 2.12 # ld -v
o util-linux 2.10o # fdformat --version
o module-init-tools 0.9.10 # depmod -V
o e2fsprogs 1.29 # tune2fs
o jfsutils 1.1.3 # fsck.jfs -V
o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
o xfsprogs 2.6.0 # xfs_db -V
o pcmcia-cs 3.1.21 # cardmgr -V
o quota-tools 3.09 # quota -V
o PPP 2.4.0 # pppd --version
o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version
o nfs-utils 1.0.5 # showmount --version
o procps 3.2.0 # ps --version
o oprofile 0.5.3 # oprofiled --version

對於RH8/9的用戶而言, 上述要求基本上都能滿足. 大概只有兩個程序需要更新: modutils工具包和mkinitrd程序.

3. 安裝module-init-tools-3.0.tar.gz工具包

linux-2.6.x內核的module處理過程有所改變(很多原先在用戶態下由modutils處理的工作都放到內核裏去完成了), 因此2.4.x下的modutils工具包已經不在適合新的2.6.x內核, 必需將其升級到module-init-tools工具包. 該工具包的最新版本是3.0(ps, 該工具包的版本從0.9.15一下跳到3.0, 其跨度之大...hoho). 可以下載module-init-tools-3.0.tar.gz源碼包的地方有兩個:

o Rusty's Linux Kernel Page: http://www.kernel.org/pub/linux/ker...ools-3.0.tar.gz
o http://www.kernel.org/pub/linux/uti...ools-3.0.tar.gz

接下來, 按照下列步驟安裝module-init-tools工具包:

# configure --prefix=/
# make moveold
# make all install
# ./generate-modprobe.conf /etc/modprobe.conf

命令"make moveold"將把系統原來的modutils工具程序改名爲"*.old"(比如,lsmod.old等等). NOTE! 這是非常重要的一步, 千萬不要省略. 這將使得你可以繼續使用原有的linux-2.4.x系統, 因爲在2.4.x系統下, 新的module-init-tools工具包實際上是倚賴原來"*.old"程序來加載內核模塊. 如果忘記了這一步也不要緊張, 可以先下載並安裝原來的modutils程序包, 然後按照上面的步驟重來一遍就可以了.

新的module-init-tools工具包不再使用原來的/etc/modules.conf配置文件了, 而是使用新的配置文件/etc/modprobe.conf. 因此必需用命令"./generate-modprobe.conf /etc/modprobe.conf"來生成新的配置文件/etc/modprobe.conf. 但是令人不爽的是, 這個生成的新配置文件存在BUG, 下面我們將會提到.

4. 更新mkinitrd程序

可以到站點http://people.redhat.com/arjanv/2.6...1-2.i386.rpm包. 由於mkinitrd程序包依賴於device-mapper包, 而device-mapper包又倚賴於lvm2包, 因此你還要同時下載device-mapper-1.00.07-1.i386.rpm包和lvm2-2.00.08-2.i386.rpm包.

5. 配置,編譯和安裝linux-2.6.x內核

新內核在Makefile方面的改動很大, "make menuconfig"和"make xconfig"繼續存在, 但是"make xconfig"被改寫了, 不再使用原來的Tcl/Tk語言, 而是基於QT庫了. 新增加了"make gconfig", 它是基於GTK庫的. "make xconfig"和"make gconfig"比原來更強大而且更易於使用了. 但不幸的是, 它們好像還不太穩定......因此, 還是使用我最喜歡的"make menuconfig"吧:-)

關於新內核的配置想提幾點:

o 關於"Loadable Module support"選項, 一定要選上"Module unloading"和"Automatic kernel module loading"這兩個選項.
o 關於"Processor type and features"選項, 一定要選上"Preemptible Kernel"選項, 這是2.6.x內核優於2.4.x內核的重要原因之一.
o 關於"Block Devices"的配置, 一定要選上對loopback和ramdisk的支持.
o 關於"Multi-device support(RAID and LVM)", 要選上"device mapper".
o 關於"Input device support", 記得要選上"Keyboards"和"Mice"的支持.
o 關於"Graphics support", 要選上對frame buffer的支持.
o 關於ALSA, 要選上"OSS API emulation"選項. OSS可以不用了.
o 關於USB, 能選的都選上吧:-)
o 關於文件系統, 選上常用的那幾種就可以了. 如果要體驗sysfs的話, 要選上對sysfs的支持.

配製好內核後, 就可以直接編譯了, "make dep"這一步已經顯示地需要了.

# make bzImage
# make modules
# make modules_install
# make install

上面的命令"make install"將: (1)把壓縮內核映象拷貝到/boot目錄下, 並創建相應的System.map符號鏈接; (2)修改bootloader的配置文件; (3)調用mkinitrd程序創建內核的initrd映象. 對於GRUB而言, 將在/boot/grub/grub.conf配置文件增加如下類似的配置行:

title Red Hat Linux (2.***)
root(hd0, 1)
kernel /boot/vmlinuz-2.*** ro root=LABEL=/
initrd /boot/initrd-2.***.img

不幸的是, 新內核並不識別"root=LABEL=/"這個啓動參數. 如果現在你就重新啓動新內核的話, 將發生kernel panic錯誤. 因此, 必需把這個"root=LABEL=/"啓動參數去掉, 就OK了.

到這裏, 你已經可以重啓機器, 用kernel-2.***啓動了. 當然, 多半你不會成功, 不是沒鼠標就是沒鍵盤:-)

6. 支持Hotplug

當然, 首先要在內核配置時配置了HOTPLUG的支持. 然後, 由於/proc/ksyms改名爲/proc/kallsyms, 所以必需修改啓動腳本/etc/rc.sysinit. 爲了兼容原有的linux-2.4.x系統, 可以加上下面幾行:

#
# ----- KERNEL 2.6.x support ------
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
fi

然後, 把rc.sysinit文件中所有出現/proc/ksyms的地方都換成"$KSYMS"變量引用. 配置好後, 還必需下載hotplug的用戶態輔助工具包:http://www.kernel.org/pub/linux/uti...4_03_11.tar.gz. 解開這個包以後, 直接"make install"就可以了. 它將產生/etc/hotplug/配置目錄.

7. 體驗sysfs

首先, 創建目錄/sys:

# mkdir /sys

然後, 按照下列步驟修改啓動腳本/etc/rc.sysinit文件:

o 找到行: mount -f /proc", 在下面增加:

if [ "$KERNELVER" = "2.6" ]; then
mount -f /sys
fi

o 找到行: action $"Mounting proc filesystem: " mount -n -t proc /proc /proc, 在其下面增加這樣一行:

#
# Mount /sys for kernel-2.6.x
#
if [ "$KERNELVER" = "2.6" ]; then
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
fi

接下來, 在/etc/fstab文件中, 加入這樣一行:

none /sys sysfs defaults 0 0

最後, 修改/etc/init.d/halt腳本中的halt_get_remaining函數:

將:
awk '$2 ~ /^//$|^//proc|^//dev/{next}
改爲:
awk '$2 ~ /^//$|^//proc|^//sys|^//dev/{next}

8. 支持USB設備

linux-2.6.x的USB驅動模塊的名字已經改變了, 所以由此引起的問題多多......, 對應於USB-2.0的host控制器的內核模塊名字仍然是ehci-hcd, 對應USB-1.1的host控制器的內核模塊名字已經從usb-ohci改爲ochi-hcd, 對應於通用USB host控制器的內核模塊名字已經從usb-uhci該爲uhci-hcd.

然而不幸的是, 在安裝module-init-tools程序包時生成的/etc/modprobe.conf配置文件卻仍然使用usb-ohci這個名字. 例如:

alias usb-controller usb-ohci
alias usb-controller1 ehci-hcd

因此, 要把它改爲:

alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd

如果不做這樣的修改, 那麼使用USB-1.1 host控制器的機器在啓動內核的時候將着不到相應的驅動模塊.

支持USB鍵盤的模塊名字也從keybdev變爲usbkbd, 支持USB鼠標的模塊名字也從mousedev改爲usbmouse. 因此, 我們必需修改啓動腳本/etc/rc.sysinit文件. 同時爲了兼容原有的2.4.x系統, 我們在腳本的一開始定義兩個變量:

#
# ----- KERNEL 2.6.x support ------
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
KEYBDEV_NAME=usbkbd
MOUSEDEV_NAME=usbmouse
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
KEYBDEV_NAME=keybdev
MOUSEDEV_NAME=mousedev
fi

然後, 把/etc/rc.sysinit腳本文件中出現keybdev和mousedev的地方都改爲$KEYBDEV_NAME和$MOUSEDEV_NAME. 把腳本文件/etc/rc.sysinit中的needusbstorage部分從:

needusbstorage=
if [ $usb = "1" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null

action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi

改爲:

needusbstorage=
if [ $usb = "1" ]; then
if [ "$KERNELVER" = "2.6" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /sys/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
else
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
fi
action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi

好了, 到此爲止, 我們應該可以重新啓動機器了, 趕快去體驗最新的kernel-2.***吧:-)

9. 其它

o 關於在linux-2.6.x系統上不能正常使用RPM命令的問題, 請參閱文檔[2]和[6].
o 關於聲卡的問題, 可以參閱參考文檔[2]和[6].
o 關於在linux-2.6.x系統上運行vmware的問題, 請參閱參考文檔[2]和[6].

10. 參考文檔

[1] Kernel 2.6.x, the new breed: http://linuxbooks.pananix.com/kernel2.6.html
[2] Upgrading RH9 to 2.6.0-test4: http://www.fearthecow.net/index.pl?...amp;page=kernel
[3] HowTo Upgrade To The 2.6 Kernel: http://kerneltrap.org/node/view/799
[4] Building Linux Kernel 2.6 on Red Hat 8: http://www.sabalsoftware.com/articl...26OnRedhat8.php
[5] Migrating to Linux kernel 2.6 on recent Redhat systems: http://linux-sxs.org/upgrading/migration26.html
[6] Migrating to Linux Kernel 2.6: http://thomer.com/linux/migrate-to-2.6.html  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章