LINUX内核升级指导.docx
《LINUX内核升级指导.docx》由会员分享,可在线阅读,更多相关《LINUX内核升级指导.docx(19页珍藏版)》请在冰豆网上搜索。
![LINUX内核升级指导.docx](https://file1.bdocx.com/fileroot1/2022-12/12/79eefff5-6c82-4a0a-aa8f-faaf627437e2/79eefff5-6c82-4a0a-aa8f-faaf627437e21.gif)
LINUX内核升级指导
LINUX内核升级指导
——薛老师
本例讲解如何在vm虚拟机环境下,从redhat9.02.4内核版本升级到2.6.18版本,因内核跨度较大,且虚拟机默认设置等问题,期间有些问题需要特别注意,这里整理各方面资料,以对实际操作做以指导。
注意:
本例所有安装包都可以在
一、准备工作
启动Linux系统,并用根用户登录,进入终端模式下。
1、查看Linux内核版本
#uname–a
目前的版本显示显示的是2.4.20,
那就进入下一步
2、下载2.6内核源码linux-2.6.18.tar.bz2
3、下载内核升级工具(因内核相差较大,很多软件包需要升级,否则新内核将有很多基本功能不能使用)
(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(此项忘了是否是必须,自己验证下吧)
安装时依次执行如下命令:
tarzxfbinutils-2.17.tar.gz
cdbinutils-2.17
./configure
Make
Makeinstall
二、配置工作
4、为了简化操作,将下载好的内核和4个升级工具都拷贝到/usr/src文件夹下。
5、拷贝完毕,开始解压新内核,具体操作请依次执行以下命令:
#tarjvxflinux-2.6.18.tar.bz2(解压新内核)
6、安装module-init-tools工具包
在/usr/src目录下,依次执行下列命令:
#tarjvxfmodule-init-tools-3.2.tar.bz2(解压module-init-tools)
#cdmodule-init-tools-3.2(由/usr/src目录进入module-init-tools目录下)
#./configure--prefix=/
#makemoveold
#makeallinstall
#./generate-modprobe.conf/etc/modprobe.conf
命令"makemoveold"将把系统原来的modutils工具程序改名为"*.old"(比如,lsmod.old等等).这将使得你可以继续使用原有的linux-2.4.x系统,因为在2.4.x系统下,新的module-init-tools工具包实际上是倚赖原来"*.old"程序来加载内核模块.如果忘记了这一步也不要紧张,可以先下载并安装原来的modutils程序包,然后按照上面的步骤重来一遍就可以了.
7、安装另外三个升级工具
回到/usr/src目录下,依次执行下列3个命令来安装另外三个升级工具:
#rpm-ivh--nodepsmkinitrd-4.1.18-2.i386.rpm(注意,这里一定要加入--nodeps参数,下同)
#rpm-ivh--nodepslvm2-2.00.25-1.01.i386.rpm
#rpm-ivh--nodepsdevice-mapper-1.00.19-2.i386.rpm
如果不更新以上几个升级包,在后面编译内核时会提示以下错误:
(注意:
如果可以上网可以用Uvh参数的升级方式安装rpm包)
mkinitrdfailed
make[1]:
***[install]Error1
make:
***[install]Error2
8、配置内核选项。
#cdlinux-2.6.18(进入到/usr/src/linux-2.6.18目录下,然后在文档Documentation/Changes中给出了欲成功地升级到kernel-2.6.x所需的最小系统软件要求)
#makemrproper(该命令可确保源代码目录下没有不正确的.o文件,非必须)
#makemenuconfig(文本窗口配置内核各选项)
运行这个命令有时会出现一个图形界面,列出了所有的内核配置选项,有的选项下还有子选项,你可以用方向键来选择,用Y键来确定。
经过我多次试验,大多数选项默认就行,以下几个选项必须选择(请认真核对下面每一个选项,否则编译很有可能前功尽弃,确认下列<*>标记的选项对应被选择为内核而不是内核模块,其余默认即可):
(1)LoadableModulesupport选项中,一定要选上“Moduleunloading”和“Automatickernelmoduleloading”这两项;
(2)DeviceDrivers--->BlockDevices中一定要选上Loopbackdevicesupport;
DeviceDrivers--->Multi-devicesupport(RAIDandLVM)”处要选上“devicemappersupport”;
DeviceDrivers--->Graphicssupport”,一定要选上”Supportforframebufferdevices”;
DeviceDrivers--->USBsupport--->选上”USBMassStoragesupport”(如果是在实环境中,想要更多USB支持,就全选吧。
我的是在虚拟机中,用不着了)
DeviceDrivers--->;Networkdevicesupport--->;Ethernet(10or100Mbit)--->;<*>;AMDPCnet32PCIsupport
(3)Filesystem--->(以下9个选项是关于ext2和ext3文件系统配置,全部选上)
Secondextendedfssupport
Ext2extendedattributes
Ext2POSIXAccessControlLists
Ext2SecurityLabels
Ext3journallingfilesystemsupport
Ext3extendedattributes
Ext3POSIXAccessControlLists
Ext3SecurityLabels
JBB(ext3)debuggingsupport
Filesystem--->DOS/FAT/NTFilesystems--->选上“NTFSfilesystemsupport”(新版本获得对ntfs分区的支持,和NT共存时非常有用,当然如果你只是虚拟机玩玩的话,可以忽略本项);
FileSystems-->Miscellaneousfilesystems---><*>CompressedROMfilesystemsupport(cramfs)(光驱的支持)
ext2和ext3文件系统配置很重要,也是必需的,如果对Ext3、Ext2文件的支持直接编译进内核,在你reboot时机器就会当掉,出现如下错误信息:
kernelpanic:
noinitfound,trypassinginit=optiontokernel.....
或者是:
VFS:
Cannotopenrootdevice"hdxy"orunknow-block(0,0)
Pleaseappendacorrect"root="bootoption
kernelpanic:
VFS:
Unabletomountrootfsonunknown-block(0,0)
或者是:
mount:
error19mountingext3
pivotroot:
pivot_root(/sysroot,/sysroot/initrd)failed:
2
umount/initrd/procfail:
2
Freeingunusedkernelmemory:
244kfreed
Kernelpanic–notsyncing:
Noinitfound.Trypassinginit=optiontokernel
(4)如果你在vmware下重新编译内核,硬盘采用的是默认的scsi的,以下选项必选,非常注意:
DeviceDrivers--->SCSIdevicesupport---><*>SCSIdisksupport
DeviceDrivers--->SCSIdevicesupport--->SCSIlow-leveldrivers--->;
<*>;BusLogicSCSIsupport(虚拟机为默认的scsi硬盘时,改为M从新编译内核模块,以生成独立的scis驱动程序)
三、编译工作
9、编译步骤
在/usr/src/linux-2.6.18目录下,执行以下命令即可编译。
#makedep(建立编译时所需的从属文件。
注意:
如果内核从未编译过,此步可跳过)
#makeclean(清除内核编译的目标文件)
#makebzImage(注意大小写I。
这一步才真正编译内核)
内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。
如果用makezImage编译,内核很大的话,系统会提示你使用makebzImage命令来编译,所以直接用makebzImage来编译。
#makemodules(编译可加载模块,选择的外部模块越多时间越长,建议刚开始的时候不要删除默认模块,先熟悉一下内核后再说)
#makemodules_install(安装可加载模块)
安装成功后,系统会在/lib/modules目录下生成一个2.6.18子目录,里面存放着新内核的所有可加载模块。
#makeinstall(安装新内核)
注意:
makeinstall的时候可能会出现如下错误信息:
NomoduleBusLogicfoundforkernel2.4.12
mkinitrdfailed
此问题一般只出现在SCSI硬盘+VMWARE+REDHAT架构中,因为BusLogic被编译进了内核而不是一个module的形式(2.4内核的Buslogic模块即使静态编译进内核也不行)。
解决方式是直接将可以BusLogic.o文件复制过去:
#cp/usr/src/linux-2.6.18/drivers/scsi/BusLogic.o/lib/modules/2.6.18/kernel/drivers/scsi
不过别忘记,复制过后再执行一下makeinstall。
(如果makemenuconfig时,把BusLogic模块选成M--Module模式--就不会出现这个提示。
)
注意:
如果出现nomodule/bin/truefoundforkernel2.6.10系升级包造成,如下解决办法,原理不详,但有效
编辑/sbin/mkinitrd
fornin$scsimodules;do
#fornowallowscsimodulestocomefromanywhere.Therearesome
#RAIDcontrollerswithdriversinblock/
findmodule$n
done
改成
#fornin$scsimodules;do
#findmodule$n
#done
即注释掉程序代码,再次makeinstall成功
四、启动新内核
10、新内核已经自动拷贝到/boot文件夹下,
新版本的内核安装已经不需要手动操作。
11、修改Grub启动管理器
#df(查看根目录在那个分区,下一步要用到。
注意,这里根分区不时boot的那个50M的分区,而一般是你最大的那个分区,也就是”/”,千万不要搞错哦。
我的为/dev/sda1)
#vi/boot/menu.lstredhat貌似应该编辑这个,如果没有的话,看看grub.conf内容相同
default=1
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
titleRedHatLinux(2.6.18)
root(hd0,0)
kernel/vmlinuz-2.6.18roroot=LABEL=/
initrd/initrd-2.6.18.img
做两处修改:
(1)将default=1改为default=0(下方启动列表的序号,从0开始,不改的话,重启之后默认进入第二项2.4内核)
(2)将kernel行的“LABEL=/”换成根目录所在的分区,2.6内核在某些平台上不认LABLE标签(上一步查看的就是,我的如下)
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
titleRedHatLinux(2.6.18)
root(hd0,0)
kernel/vmlinuz-2.6.18roroot=/dev/sda1
initrd/initrd-2.6.18.img
titleRedHatLinux(2.4.20-8)
root(hd0,0)
kernel/vmlinuz-2.4.20-8roroot=LABEL=/
initrd/initrd-2.4.20-8.img
12,重启,此时可以通过grub启动列表进入2.4或2.6内核,但是此时的内核缺少很多关键功能。
13.rpm出错,需升级rpm
最简单的做法如下
修改/usr/lib/rpm/macros
在里面寻找
代码:
%__dbi_cdbcreatecdbmpoolmp_mmapsize=16Mbmp_size=1Mb
修改成
代码:
%__dbi_cdbcreatecdbmpoolmp_mmapsize=16Mbmp_size=1Mbprivate
14.支持Hotplug
下列配置使2.6.18内核可以mount光驱等其他设备:
首先要在内核配置时配置了HOTPLUG的支持.然后,由于/proc/ksyms改名为/proc/kallsyms,所以必需修改启动脚本/etc/rc.sysinit.为了兼容原有的linux-2.4.x系统,可以加上下面几行,此代码方案最为简洁:
#
#-----KERNEL2.6.xsupport------
#Thisisforcompatibilitybetweenkernel-2.4.xandkernel-2.6.x
#
UNAME=`uname-r`
KERNELVER=${UNAME:
0:
3}
if["$KERNELVER"="2.6"];then
#
#Thisiskernel-2.6.x
#
KSYMS=/proc/kallsyms
else
#
#Thisiskernel-2.4.x
#
KSYMS=/proc/ksyms
fi
然后,把rc.sysinit文件中所有出现/proc/ksyms的地方都换成"$KSYMS"变量引用.配置好后,还必需下载hotplug的用户态辅助工具
在VI下使用以下命令将原路径全换成全局变量,注意里面的斜杠不是字符V
:
1,$s/\/proc\/ksyms/\$KSYMS/g替换/etc/rc.sysinit中的字符串
包:
http:
//www.kernel.org/pub/linux/uti...4_03_11.tar.gz.解开这个包以后,直接"makeinstall"就可以了.它将产生/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$"Mountingprocfilesystem:
"mount-n-tproc/proc/proc,在其下面增加这样一行:
#
#Mount/sysforkernel-2.6.x
#
if["$KERNELVER"="2.6"];then
action$"Mountingsysfsfilesystem:
"mount-n-tsysfs/sys/sys
fi
接下来,在/etc/fstab文件中,加入这样一行:
none/syssysfsdefaults00
最后,修改/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,对应于通用USBhost控制器的内核模块名字已经从usb-uhci该为uhci-hcd.
然而不幸的是,在安装module-init-tools程序包时生成的/etc/modprobe.conf配置文件却仍然使用usb-ohci这个名字.例如:
aliasusb-controllerusb-ohci
aliasusb-controller1ehci-hcd
因此,要把它改为:
aliasusb-controllerohci-hcd
aliasusb-controller1ehci-hcd
如果不做这样的修改,那么使用USB-1.1host控制器的机器在启动内核的时候将着不到相应的驱动模块.
支持USB键盘的模块名字也从keybdev变为usbkbd,支持USB鼠标的模块名字也从mousedev改为usbmouse.因此,我们必需修改启动脚本/etc/rc.sysinit文件.同时为了兼容原有的2.4.x系统,我们在脚本的一开始定义两个变量:
#
#-----KERNEL2.6.xsupport------
#Thisisforcompatibilitybetweenkernel-2.4.xandkernel-2.6.x
#
UNAME=`uname-r`
KERNELVER=${UNAME:
0:
3}
if["$KERNELVER"="2.6"];then
#
#Thisiskernel-2.6.x
#
KSYMS=/proc/kallsyms
KEYBDEV_NAME=usbkbd
MOUSEDEV_NAME=usbmouse
else
#
#Thisiskernel-2.4.x
#
KSYMS=/proc/ksyms
KEYBDEV_NAME=keybdev
MOUSEDEV_NAME=mousedev
fi
然后,把/etc/rc.sysinit脚本文件中出现keybdev和mousedev的地方都改为$KEYBDEV_NAME和$MOUSEDEV_NAME.(参看前面的VI替换命令)把脚本文件/etc/rc.sysinit中的needusbstorage部分从:
needusbstorage=
if[$usb="1"];then
needusbstorage=`LC_ALL=Cgrep-e"^I.*Cls=08"/proc/bus/usb/devices2>/dev/null`
LC_ALL=Cgrep'hid'/proc/bus/usb/drivers||action$"InitializingUSBHIDinterface:
"modprobehid2>/dev/null
action$"InitializingUSBkeyboard:
"modprobe$KEYBDEV_NAME2>/dev/null
action$"InitializingUSBmouse:
"modprobe$MOUSEDEV_NAME2>/dev/null
fi
改为:
needusbstorage=
if[$usb="1"];then
if["$KERNELVER"="2.6"];then
needusbstorage=`LC_ALL=Cgrep-e"^I.*Cls=08"/sys/bus/usb/devices2>/dev/null`
LC_ALL=Cgrep'hid'/sys/bus/usb/drivers||action$"InitializingUSBHIDinterface:
"modprobeusbhid2>/dev/null
else
needusbstorage=`LC_ALL=Cgrep-e"^I.*Cls=08"/proc/bus/usb/devices2>/dev/null`
LC_ALL=Cgrep'hid'/proc/bus/usb/drivers||action$"InitializingUSBHIDinterface:
"modprobehid2>/dev/null
fi
action$"InitializingUSBkeyboard:
"modprobe$KEYBDEV_NAME2>/dev/null
action$"InitializingUSBmouse:
"modprobe$MOUSEDEV_NAME2>/dev/null
fi
退出,重启,基本上就可以正常使用2.6.18的内核了,目前未发现有其他问题,有问题的话多数还是发生在内核配置出错,有时间可以详细了解下内核配置的含义。
附录:
转载的内核配置说明列