1、LINUX内核升级指导LINUX内核升级指导薛老师本例讲解如何在vm虚拟机环境下,从redhat 9.0 2.4内核版本升级到2.6.18版本,因内核跨度较大,且虚拟机默认设置等问题,期间有些问题需要特别注意,这里整理各方面资料,以对实际操作做以指导。注意:本例所有安装包都可以在一、准备工作启动Linux系统,并用根用户登录,进入终端模式下。1、查看Linux内核版本# uname a目前的版本显示显示的是2.4.20,那就进入下一步 2、下载2.6内核源码 linux-2.6.18.tar.bz23、下载内核升级工具(因内核相差较大,很多软件包需要升级,否则新内核将有很多基本功能不能使用)(
2、1)下载module-init-tools-3.2.tar.bz2(2)下载mkinitrd-4.1.18-2.i386.rpm(3)下载lvm2-2.00.25-1.01.i386.rpm(4)下载device-mapper-1.00.19-2.i386.rpm(5)下载binutils-2.17.tar.gz(此项忘了是否是必须,自己验证下吧) 安装时依次执行如下命令:tar zxf binutils-2.17.tar.gzcd binutils-2.17./configureMakeMake install二、配置工作4、为了简化操作,将下载好的内核和4个升级工具都拷贝到/usr/src
3、文件夹下。5、拷贝完毕,开始解压新内核,具体操作请依次执行以下命令: # tar jvxf linux-2.6.18.tar.bz2 (解压新内核)6、安装module-init-tools工具包在/usr/src目录下,依次执行下列命令:# tar jvxf module-init-tools-3.2.tar.bz2 (解压module-init-tools)# cd module-init-tools-3.2 (由/usr/src目录进入module-init-tools目录下)#./configure -prefix=/# make moveold# make all install#.
4、/generate-modprobe.conf /etc/modprobe.conf命令make moveold将把系统原来的modutils工具程序改名为*.old(比如,lsmod.old等等).这将使得你可以继续使用原有的linux-2.4.x系统, 因为在2.4.x系统下, 新的module-init-tools工具包实际上是倚赖原来*.old程序来加载内核模块. 如果忘记了这一步也不要紧张, 可以先下载并安装原来的modutils程序包, 然后按照上面的步骤重来一遍就可以了.7、安装另外三个升级工具回到/usr/src目录下,依次执行下列3个命令来安装另外三个升级工具:# rpm -
5、ivh -nodeps mkinitrd-4.1.18-2.i386.rpm (注意,这里一定要加入-nodeps参数,下同)# rpm -ivh -nodeps lvm2-2.00.25-1.01.i386.rpm# rpm -ivh -nodeps device-mapper-1.00.19-2.i386.rpm如果不更新以上几个升级包,在后面编译内核时会提示以下错误:(注意:如果可以上网可以用Uvh参数的升级方式安装rpm包)mkinitrd failedmake1: * install Error 1make: * install Error 28、配置内核选项。# cd linux-
6、2.6.18 (进入到/usr/src/linux-2.6.18目录下,然后在文档Documentation/Changes中给出了欲成功地升级到kernel-2.6.x所需的最小系统软件要求)# make mrproper (该命令可确保源代码目录下没有不正确的.o文件,非必须)# make menuconfig (文本窗口配置内核各选项)运行这个命令有时会出现一个图形界面,列出了所有的内核配置选项,有的选项下还有子选项,你可以用方向键来选择,用Y键来确定。经过我多次试验,大多数选项默认就行,以下几个选项必须选择(请认真核对下面每一个选项,否则编译很有可能前功尽弃,确认下列标记的选项对应被选
7、择为内核而不是内核模块,其余默认即可):(1)Loadable Module support选项中,一定要选上“Module unloading”和“Automatic kernel module loading”这两项;(2)Device Drivers-Block Devices中一定要选上Loopback device support;Device Drivers-Multi-device support(RAID and LVM)”处要选上“device mapper support”;Device Drivers-Graphics support”, 一定要选上” Support f
8、or frame buffer devices”;Device Drivers -USB support -选上”USB Mass Storage support”(如果是在实环境中,想要更多USB支持,就全选吧。我的是在虚拟机中,用不着了)Device Drivers -; Network device support -;Ethernet (10 or 100Mbit) -; ; AMD PCnet32 PCI support(3) File system-(以下9个选项是关于ext2和ext3文件系统配置,全部选上)Second extended fs supportExt2 exten
9、ded attributesExt2 POSIX Access Control ListsExt2 Security LabelsExt3 journalling file system supportExt3 extended attributesExt3 POSIX Access Control ListsExt3 Security LabelsJBB (ext3) debugging supportFile system-DOS/FAT/NT Filesystems -选上“ NTFS file system support”(新版本获得对ntfs分区的支持,和NT共存时非常有用,当然如
10、果你只是虚拟机玩玩的话,可以忽略本项);File Systems - Miscellaneous filesystems - Compressed ROM file system support (cramfs)(光驱的支持)ext2和ext3文件系统配置很重要,也是必需的,如果对Ext3、Ext2文件的支持直接编译进内核,在你reboot时机器就会当掉,出现如下错误信息:kernel panic : no init found ,try passing init = option to kernel.或者是:VFS:Cannot open root device hdxy or unknow
11、-block(0,0)Please append a correct root= boot optionkernel panic:VFS:Unable to mount root fs on unknown-block(0,0)或者是:mount: error 19 mounting ext3pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed: 2umount /initrd/proc fail: 2Freeing unused kernel memory: 244k freedKernel panic not syncing: No
12、init found. Try passing init = option to kernel(4)如果你在vmware下重新编译内核,硬盘采用的是默认的scsi的,以下选项必选,非常注意:Device Drivers -SCSI device support -SCSI disk supportDevice Drivers-SCSI device support-SCSI low-level drivers-; BusLogic SCSI support(虚拟机为默认的scsi硬盘时,改为M从新编译内核模块,以生成独立的scis驱动程序)三、编译工作9、编译步骤在/usr/src/linux
13、-2.6.18目录下,执行以下命令即可编译。# make dep (建立编译时所需的从属文件。注意:如果内核从未编译过,此步可跳过)# make clean (清除内核编译的目标文件)# make bzImage (注意大小写I。这一步才真正编译内核)内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译,所以直接用make bzImage来编译。# make modules (编译可加载模块,选择的外部模块越多时间越长,建议刚
14、开始的时候不要删除默认模块,先熟悉一下内核后再说)# make modules_install (安装可加载模块)安装成功后,系统会在/lib/modules目录下生成一个2.6.18子目录,里面存放着新内核的所有可加载模块。# make install (安装新内核)注意:make install的时候可能会出现如下错误信息:No module BusLogic found for kernel 2.4.12mkinitrd failed此问题一般只出现在SCSI硬盘VMWARE+REDHAT架构中,因为BusLogic被编译进了内核而不是一个module的形式(2.4内核的Buslogic
15、模块即使静态编译进内核也不行)。解决方式是直接将可以BusLogic.o文件复制过去:# cp /usr/src/linux-2.6.18/drivers/scsi/BusLogic.o /lib/modules/2.6.18/kernel/drivers/scsi不过别忘记,复制过后再执行一下make install。(如果make menuconfig时,把BusLogic模块选成M-Module模式-就不会出现这个提示。)注意:如果出现no module /bin/true found for kernel 2.6.10系升级包造成,如下解决办法,原理不详,但有效编辑 /sbin/mki
16、nitrdfor n in $scsimodules; do# for now allow scsi modules to come from anywhere. There are some# RAID controllers with drivers in block/findmodule $ndone改成#for n in $scsimodules; do#findmodule $n# done即注释掉程序代码,再次make install 成功四、启动新内核10、新内核已经自动拷贝到/boot文件夹下, 新版本的内核安装已经不需要手动操作。11、修改Grub启动管理器# df (查看根
17、目录在那个分区,下一步要用到。注意,这里根分区不时boot的那个50M的分区,而一般是你最大的那个分区,也就是”/”,千万不要搞错哦。我的为 /dev/sda1)# vi /boot/menu.lst redhat貌似应该编辑这个,如果没有的话,看看grub.conf 内容相同default=1timeout=10splashimage=(hd0,0)/grub/splash.xpm.gztitle Red Hat Linux (2.6.18)root (hd0,0)kernel /vmlinuz-2.6.18 ro root= LABEL=/initrd /initrd-2.6.18.img
18、做两处修改:(1) 将default=1改为default=0(下方启动列表的序号,从0开始,不改的话,重启之后默认进入第二项2.4内核)(2) 将kernel行的“LABEL=/”换成根目录所在的分区,2.6内核在某些平台上不认LABLE标签(上一步查看的就是,我的如下)default=0timeout=10splashimage=(hd0,0)/grub/splash.xpm.gztitle Red Hat Linux (2.6.18)root (hd0,0)kernel /vmlinuz-2.6.18 ro root=/dev/sda1initrd /initrd-2.6.18.imgt
19、itle Red Hat Linux (2.4.20-8)root (hd0,0)kernel /vmlinuz-2.4.20-8 ro root=LABEL=/initrd /initrd-2.4.20-8.img12,重启,此时可以通过grub启动列表进入2.4或2.6内核,但是此时的内核缺少很多关键功能。13.rpm出错,需升级rpm最简单的做法如下修改/usr/lib/rpm/macros 在里面寻找 代码: %_dbi_cdb create cdb mpool mp_mmapsize=16Mb mp_size=1Mb 修改成 代码: %_dbi_cdb create cdb mpoo
20、l mp_mmapsize=16Mb mp_size=1Mb private14. 支持Hotplug下列配置使2.6.18内核可以mount光驱等其他设备:首先要在内核配置时配置了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#U
21、NAME=uname -rKERNELVER=$UNAME:0:3if $KERNELVER = 2.6 ; then# This is kernel-2.6.x#KSYMS=/proc/kallsymselse# This is kernel-2.4.x#KSYMS=/proc/ksymsfi然后, 把rc.sysinit文件中所有出现/proc/ksyms的地方都换成$KSYMS变量引用. 配置好后, 还必需下载hotplug的用户态辅助工具在VI下使用以下命令将原路径全换成全局变量,注意里面的斜杠不是字符V:1,$ s/proc/ksyms/$KSYMS/g 替换 /etc/rc.sys
22、init中的字符串包: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 ; thenmount -f /sysfio 找到行: action $Mounting proc filesystem: mount -
23、n -t proc /proc /proc, 在其下面增加这样一行:# Mount /sys for kernel-2.6.x#if $KERNELVER = 2.6 ; thenaction $Mounting sysfs filesystem: mount -n -t sysfs /sys /sysfi接下来, 在/etc/fstab文件中, 加入这样一行:none /sys sysfs defaults 0 0最后, 修改/etc/init.d/halt脚本中的halt_get_remaining函数:将:awk $2 /$|/proc|/dev/next改为:awk $2 /$|/pr
24、oc|/sys|/dev/next8. 支持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
25、usb-ohcialias usb-controller1 ehci-hcd因此, 要把它改为:alias usb-controller ohci-hcdalias usb-controller1 ehci-hcd如果不做这样的修改, 那么使用USB-1.1 host控制器的机器在启动内核的时候将着不到相应的驱动模块.支持USB键盘的模块名字也从keybdev变为usbkbd, 支持USB鼠标的模块名字也从mousedev改为usbmouse. 因此, 我们必需修改启动脚本/etc/rc.sysinit文件. 同时为了兼容原有的2.4.x系统, 我们在脚本的一开始定义两个变量:# - KERN
26、EL 2.6.x support -# This is for compatibility between kernel-2.4.x and kernel-2.6.x#UNAME=uname -rKERNELVER=$UNAME:0:3if $KERNELVER = 2.6 ; then# This is kernel-2.6.x#KSYMS=/proc/kallsymsKEYBDEV_NAME=usbkbdMOUSEDEV_NAME=usbmouseelse# This is kernel-2.4.x#KSYMS=/proc/ksymsKEYBDEV_NAME=keybdevMOUSEDEV
27、_NAME=mousedevfi然后, 把/etc/rc.sysinit脚本文件中出现keybdev和mousedev的地方都改为$KEYBDEV_NAME和$MOUSEDEV_NAME.(参看前面的VI替换命令) 把脚本文件/etc/rc.sysinit中的needusbstorage部分从:needusbstorage=if $usb = 1 ; thenneedusbstorage=LC_ALL=C grep -e I.*Cls=08 /proc/bus/usb/devices 2/dev/nullLC_ALL=C grep hid /proc/bus/usb/drivers | act
28、ion $Initializing USB HID interface: modprobe hid 2 /dev/nullaction $Initializing USB keyboard: modprobe $KEYBDEV_NAME 2 /dev/nullaction $Initializing USB mouse: modprobe $MOUSEDEV_NAME 2 /dev/nullfi改为:needusbstorage=if $usb = 1 ; thenif $KERNELVER = 2.6 ; thenneedusbstorage=LC_ALL=C grep -e I.*Cls=
29、08 /sys/bus/usb/devices 2/dev/nullLC_ALL=C grep hid /sys/bus/usb/drivers | action $Initializing USB HID interface: modprobe usbhid 2 /dev/nullelseneedusbstorage=LC_ALL=C grep -e I.*Cls=08 /proc/bus/usb/devices 2/dev/nullLC_ALL=C grep hid /proc/bus/usb/drivers | action $Initializing USB HID interface: modprobe hid 2 /dev/nullfiaction $Initializing USB keyboard: modprobe $KEYBDEV_NAME 2 /dev/nullaction $Initializing USB mouse: modprobe $MOUSEDEV_NAME 2 /dev/nullfi退出,重启,基本上就可以正常使用2.6.18的内核了,目前未发现有其他问题,有问题的话多数还是发生在内核配置出错,有时间可以详细了解下内核配置的含义。附录:转载的内核配置说明列
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1