The Guide of Upgrading to Linux kernel 2.6.x
The Guide of Upgrading to linux kernel 2.6.x
Author: Rongkai Zhan date: 2004-3-14
前言: linux-2.6.x內核發布後, 壇子裡的兄弟們肯定都迫不及待地要升級原有的2.4.x內核. 但是由於與2.6.x內核配套的系統程序並沒有相應的來得及更新, 升級過程會碰到很多問題, 因此覺得有必要把我的經驗與大家share一下:-) XD們以後碰到類似問題時, 請先閱讀本文, 而不要一上來就盲目發帖.
ps, you are welcome to fix me.
1. 備份重要的數據
這是個好習慣,就不用多說了:-)
2. 下載最新的2.6.x內核源碼包
這個當然要到官方網站http://www.kernel.org或者它的mir...?去下載了, 最好別到那些unknown的網站去下, 因為那些源碼包有可能被惡意做了手腳. 最新的linux-2.6.4.tar.bz2源碼包大概有33M左右. 下載的時候可以泡杯coffee, 然後點根煙......
在/usr/src/目錄下解開源碼包, 得到源代碼目錄/usr/src/linux-2.6.4/. 在對kernel做任何事情之前, 建議你先看一下它的README文件和Documentation/Changes文件, 從中你會得到不少有用的信息. 這些信息會讓你在隨後的升級過程避免很多不必要的麻煩.
在文檔Documentation/Changes中給出了欲成功地升級到kernel-2.6.x所需的最小系統軟件要求, 比如對於kernel-2.6.4是這樣的:
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>&1grep 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>&1grep 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.6.4) root(hd0, 1) kernel /boot/vmlinuz-2.6.4 ro root=LABEL=/ initrd /boot/initrd-2.6.4.img
不幸的是, 新內核並不識別"root=LABEL=/"這個啟動參數. 如果現在你就重新啟動新內核的話, 將發生kernel panic錯誤. 因此, 必需把這個"root=LABEL=/"啟動參數去掉, 就OK了.
到這裡, 你已經可以重啟機器, 用kernel-2.6.4啟動了. 當然, 多半你不會成功, 不是沒鼠標就是沒鍵盤:-)
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 usbhid 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.6.4吧:-)
9. 其它
o 關於在linux-2.6.x系統上不能正常使用RPM命令的問題, 請參閱文檔[2]和[6]. o 關於聲卡的問題, 可以參閱參考文檔[2]和[6]. o 關於在linux-2.6.x系統上運行vmware的問題, 請參閱參考文檔[2]和[6].
9. 其它
o 關於在linux-2.6.x系統上不能正常使用RPM命令的問題, 請參閱文檔[2]和[6]. o 關於聲卡的問題, 可以參閱參考文檔[2]和[6]. o 關於在linux-2.6.x系統上運行vmware的問題, 請參閱參考文檔[2]和[6].