LINUX内核升级指导.docx

上传人:b****6 文档编号:5024282 上传时间:2022-12-12 格式:DOCX 页数:19 大小:29.60KB
下载 相关 举报
LINUX内核升级指导.docx_第1页
第1页 / 共19页
LINUX内核升级指导.docx_第2页
第2页 / 共19页
LINUX内核升级指导.docx_第3页
第3页 / 共19页
LINUX内核升级指导.docx_第4页
第4页 / 共19页
LINUX内核升级指导.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

LINUX内核升级指导.docx

《LINUX内核升级指导.docx》由会员分享,可在线阅读,更多相关《LINUX内核升级指导.docx(19页珍藏版)》请在冰豆网上搜索。

LINUX内核升级指导.docx

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的内核了,目前未发现有其他问题,有问题的话多数还是发生在内核配置出错,有时间可以详细了解下内核配置的含义。

附录:

转载的内核配置说明列

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1