歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

Linux2.4->2.6內核升級指南

    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].



    好了, 到此為止, 我們應該可以重新啟動機器了, 趕快去體驗最新的kernel-2.6.4吧:-)

    9. 其它

    o 關於在linux-2.6.x系統上不能正常使用RPM命令的問題, 請參閱文檔[2]和[6].    o 關於聲卡的問題, 可以參閱參考文檔[2]和[6].    o 關於在linux-2.6.x系統上運行vmware的問題, 請參閱參考文檔[2]和[6].



Copyright © Linux教程網 All Rights Reserved