redhat内核2426重编译升级.docx
《redhat内核2426重编译升级.docx》由会员分享,可在线阅读,更多相关《redhat内核2426重编译升级.docx(12页珍藏版)》请在冰豆网上搜索。
![redhat内核2426重编译升级.docx](https://file1.bdocx.com/fileroot1/2023-1/31/d7e77aad-a0e6-4703-952d-da7e6d074e5b/d7e77aad-a0e6-4703-952d-da7e6d074e5b1.gif)
redhat内核2426重编译升级
虚拟机中Redhat9下的内核升级详解
从linux-2.4.20-8到linux-2.6.8
编译之前,必须知道为什么要编译内核以及内核是一个什么样的东西。
Linux操作系统包括四个部分:
实用工具集;shell;系统程序和运行期库;内核内核所起的作用——可以为其他所有的程序以及服务提供运行环境,分配各种软硬件资源。
在操作系统中,内核的作用类似于人的大脑。
由于LInux操作系统,是一个开源软件,开放所有的源代码,这为我们定制内核提供了便利条件;在Windows操作系统中,我们常常被很多问题困扰,比如说我们的操作系统在使用一段时间之后,会发现运行速度越来越慢,操作系统所在的磁盘分区容量越来越多,但是由于windows系统不开源,我们不知道为什么会出现这种情况。
不过在linux中,由于所有的内核代码都是开放的,所以只要我们有足够的能力,就可以对这个内核进行定制,以满足我们自己的需求。
这种定制包括:
我们的硬件功能很强,包括很多附加设备。
但是使用的linux操作系统目前没有打开对这些功能和设备的支持,因此可以通过内核编译去获取这些功能。
反过来,如果我们的硬件功能很弱,而linux系统中自带的很多功能和硬件的支持我们都不需要,也可以通过内核定制和编译去掉这些功能以加强我们的系统性能。
或者杜绝一些错误和漏洞的存在。
总之,因为linux系统中给我们提供了定制内核的条件(开源),我们就应该和有能力使用这个条件去打造适合我们自己需要的操作系统。
前期准备工作:
虚拟机中安装好系统(redhat9),下载好要你所想升级到的目标版本,(
废话不多说,进入正题
一,将下载的新内核解包
刚开始的压缩包存放目录为/mnt/hgfs/share/linux-2.6.8.tar.bz2(提醒读者share文件是自己设置的主机和虚拟机中的共享文件夹),现在cd/usr/src切换到目录下cp新内核文件到当前目录/usr/src下
二,解压新内核
在/usr/src下直接解压源码包,因为压缩包的不同有两种解压方法:
(1)解压bzip2格式使用命令tar–xjvflinux-2.6.8.tar.bz2
(2)解压gzip2格式使用命令tar–xzvflinux-2.6.8.tar.bz2
解压完如图,在/usr/src下多出来以linux-2.6.8为文件名的文件夹,这就是新内核文件
里面包含了建立内核时包含的大部分包含文件,初始化代码文件,设备驱动程序,文件系统,内核管理代码,进程通讯代码和主内核代码…它们就主要包含在driversinitlibarchincludenetkenel这些文件中,具体每个代表什么,读者下去自己查找….至此内核解压完成
三,编译内核
1.在编译之前,我们要了解当前计算机的软硬件信息。
由于/proc目录下存储的是当前内存的运行值,其实这个文件夹不是硬盘中的数据,而是内存中的数据,因此我们可以通过这个目录下的文件来获得当前系统的硬件环境信息。
比如说cpu、内存、文件系统、pci设备、版本等相关信息。
一下简单例举了几个查询的命令,具体详细更多的查询命令可以参考操作手册
Cpu信息
中断查询
usb查询
pci信息
内存查询
2,gccncursesmakedev86glibc-kernheadercppbinutils内核的安装需要一些底层环境的支持,必须保证这些软件工具都安装上,否则新的内核安装不会成功。
可以使用rpm-qa|greppackagename命令查询是否安装
3,正式开始编译:
cd/usr./src/linux-2.6.8
第一步:
配置策略
Linux中提供了多种内核配置命令
(1)makeconfig
makeconfig是最基础的配置命令,以文本提示方式配置编译选项,工作时打开字符模式对话框,在终端上提出问题,并要求用户回答所有问题。
对于每个问题有三种可能的选择:
yesno和module。
Module告知内核配置在内核配置时候使用动态可装载模块,而不是静态地将功能连接到内核中。
这里配置时候有几个重要的配置选型:
Loadablemodulesupport(对模块的支持)
Processortypeandfeatures:
选择支持的cpu类型
Generalsetup:
设置通用属性(一般选择默认)
如用户不熟悉配置选项,可以按照默认配置内核
#makedefconfig//按默认选项配置内核
#makeallnoconfig//除了必须的选项外,其他的一概不选
(2)makemenuconfig
makemenuconfig是主流的配置命令,它需要ncurses命令,在ubuntu系统中默认是不支持的。
工作时打开文本图像对话框,其功能和makeconfig基本相同,但可以配置所需部分,使用必makeconfig方便得多。
(3)makexconfig
makexconfig也是主流的命令,它是基于X11的,使用qt库,另外还得安装GCC否则会出错
第二步:
#makemrproper--清理内核源代码树(清理垃圾信息)如下图
第三步:
#makemenuconfig进入配置界面
这里我们只简单演示修改loadablemodulesupport选中后enter进入下面界面
第一个一般选上,第二个可以不选,第三个自己可以看懂什么意思,看不懂的话自己查字典去,第四个是让内核在启动时候有自己加载必须模块的能力选上
选好后exit
对于其他的选项自己可以安排,根据自己需要选择,这里不做过多解释
第四步:
设置完成后exit
提示是否保存
Yes配置完成
刚才的配置被保存为一个名称为.config的配置文件,不管我们使用makemenuconfig还是makeconfigmakexconfig最终都是为了生成这个.config文件,以后的操作都是根据这个文件中的内容进行操作的,它存的就是我们对内核文件做的配置改动,可以用less.config命令查看
第五步:
make编译内核
(由于2.4的内核和2.6的内核的编译方法不是完全一样的,所以我们分开两种情况讨论)
1本文编译的是2,6版本的内核,配置完成后,通过make命令编译
#make
执行完make后的提示
#makemodules:
它对内核模块进行编译
makemodules结果,warning提示自己分析只要没没error就Ok
在编译过程中,会出现许多编译信息,如果不想看到这些信息可以重定向忽略编译信息
#make>/dev/null
另外在编译时候还可以加速内核的编译速度,方法2种如下
(1)命令make–jn一般等于cpu数量的2倍该命令可以提高cpu的编译效率例如对于单cpumake–j2>/dev/null
(2)使用ccache来提高编译速度debian/ubuntu系统中默认没有安装,可采用
$sudoapt-getinstallccache然后更改内核目录的makefile,将CC和HOSTCC变量定义前添加ccache:
将CC=$(CROSS_COMPILE)gcc
HOSTCC=gcc
更改为:
CC=ccache$(CROSS_COMPILE)gcc
HOSTCC=ccachegcc
2对于2.4版本内核可采取步骤
1>makedep–生成依赖性关系
2>makebzImage–生成新内核
3>makemodules–编译内核模块加速编译过程操作方法和2.6的一致
第六步
在经过漫长的等待后,编译成功完成(如果中间显示任何包含的error字样就得重新从第一步开始),开始安装内核了(善意提醒:
所有的编译编译步骤最好在字符界面下进行,否则在图形界面下速度会超级慢)
makemodules_install–安装内核模块
makeinstall–安装内核
大家可以看到出现了错误提示信息nomoduleBusLogicfoundforkernel2.6.8
具体原因就是安装vmware时候默认选择的是scsi做硬盘驱动,而内核配置时候没做修改,所以找不到BusLogic.解决方法:
将下载的2.6.8内核中即/usr/src/linux-2.6.8/drivers/scsi/BusLogi拷贝到/lib/modules/2.6.8/kernel/drivers/scsi下(只是本例,其它的可以参考对应的目录,活学活用)
makemodules_install会将相应的内核模块安装到/lib/录下,makeinstall将内核的映像复制到/boot目录下
此时用户还需要为内核创建一个initrd.img文件,该文件用来存储挂载根文件系统所需的模块
#cd/boot
#mkinitrd–ointrid.img-2.6.8or
图示:
在/root/下多出了initrd-2.6.8.img文件
解决错误信息后,重新makeinstall
只是2个警告,可以不理会进行下来的工作…
第七步
也是最后一步,是对用户的grub配置文件进行修改,以便系统在进入时候能够选择新的内核
#vim/boot/grub/menu.lst进入编辑界面
Vim编辑器
在不做修改的情况下,开机启动时候有两种内核方式选择,在此例中效果如下:
如果只想用新的内核,只需把关于老版本的信息那三行删除即可,即最后三行,在此不做演示。
(推荐保留原内核,原因见附录)
附录:
置之前先介绍一下2.6的I/O调度器
2.6包含的四个I/O调度器分别是No-opI/Oscheduler、AnticipatoryI/Oscheduler、DeadlineI/Oscheduler与CFQI/Oscheduler。
在后文中分别简称为ns、as、ds与cfq。
ns是一个简化的调度程序它只作最基本的合并与排序。
与桌面系统的关系不是很大,主要用在一些特殊的软件
与硬件环境下,这些软件与硬件一般都拥有自己的调度机制对内核支持的要求很小,这很适合一些嵌入式系统环境。
作为桌面用户我们一般不会选择它。
as是当前内核中默认的I/O调度器。
它拥有非常好的性能,在2.5中它就相当引人注意。
在与2.4内核进行的对比测试中,在2.4中多项以分钟为单位
完成的任务,它则是以秒为单位来完成的。
正因为如此它成为目前2.6测试版中默认的I/O调度器。
但它也存在着弱点,它本身是比较庞大与复杂的,
在一些特殊的情况下,特别是在数据吞吐量非常大的数据库系统中它会变的比较缓慢。
ds就是针对as的缺点进行改善而来的,还处于测试阶段,但已经很稳定了。
目前表现出的性能几乎与as一样好。
加之比as更加小巧,
是相当有前途的调度器,值得一试:
)
cfq为系统内的所有任务分配相同的带宽,提供一个公平的工作环境,它比较适合桌面环境。
事实上在测试中它也有不错的表现,
mplayerxmms等多媒体播放器与它配合的相当好,回放平滑几乎没有因访问磁盘而出现的跳帧现象。
对于喜欢在Linux下听音乐看电影的朋友不妨尝试一下。
好了,下面说说怎么设置:
参数的格式为elevator=调度器名
修改/boot/grub/grub.conf,在kernel那行后门加入elevator=deadline
例如:
kernel/boot/vmlinuz-2.6.10-bk4roroot=/dev/你的根分区elevator=deadline
***********************************
使用新内核可能出现的问题及对策
***********************************
1.RedHat用户rpm命令不能使用,解决办法:
请把变量在全局配置文件中声明。
这是RPM的一个Bug,特别是对于RH9的用户,请打开/etc/profile文件,命令如下:
#vi/etc/profile(在文件的末尾加上几句如下)
if[`uname-r`="2.6.18"];then
exportLD_ASSUME_KERNEL=2.2.5
fi
也就是给系统加上一个全局的环境变量,也可直接键入#exportLD_ASSUME_KERNEL=2.2.5。
2.新内核根本起不来,解决方法:
重新配置内核(学问挺大),也许还根引导记录有关(很少了);
我遇到的情况是双Grub的问题
3.新内核模块无法加载,会导致很多问题,比如了防火墙没法工作了,mount不上光盘和vfat及ntfs文件系统,其解决方法:
升级module-init-tools软件包,
RedHat的用户可能还要修改/etc/rc.d/rc.sysinit文件;
1.编译完后不启动,报以下错误:
VFS:
Cannotopenrootdevice"LABEL=/"or0.0
>;Pleaseappendacorrect"root="bootoption
>;kernelpanic:
VFS:
Unabletomountrootfs
如果是上面的错误,请确认你把如下选项配置进kernel
(1)如果/使用了EXT3文件系统,在内核中要加入EXT3的支持
(2)如果是IDE的硬盘必须要IDE的驱动加载
(3)在blockdevices--RAMdisksupport中选取Initialdisk(initrd)support,有时在mount/之前
需要加载一些模块,这些modules被做到一个镜像文件中--kernel-ver.img中,这个文件位于/boot.举个例子,如果EXT3的是以模块加载的话,在mount/时就需要用到它,所以系统就在initrd.kernel-ver.img中寻找它.
使用命令mkinitrdinitrd.kernel-ver.imgkernel-ver可以生成initrd.kernel-ver.img
2.系统启动过程中加载iptables时报错的处理方法
修改/etc/rc.sysinit文件:
将其中所有的/proc/ksyms替换为/proc/kallsyms。
将其中所有的/proc/sys/kernel/modprobe替换为/sbin/modprobe
在文件中mount-f/proc这一句下添加mount-f/sys
在文件中的action$"Mountingprocfilesystem:
"mount-n-tproc/proc/proc这一句的下面添加action$"Mountingsysfsfilesystem:
"mount-n-tsysfs/sys/sys
修改/etc/fstab文件:
加入none/syssysfsdefaults00
修改/etc/init.d/halt文件:
将halt_get_remaining函数内的awk‘$2~/^\/$|^\/proc|^\/dev/{next}改为
awk‘$2~/^\/$|^\/proc|^\/sys|^\/dev/{next}
创建目录:
mkdir/sys
然后重启机器,模块的问题应该解决的差不多了。
到这里编译工作顺利结束了.以上是本人在编译内核过程中遇到的问题以及解决方法,有些问题没有遇到,就没有写进去,希望大家给予补充指正,充分弘扬Linux精神!
!
!
3.RPM问题
进入编译好的内核后,与RPM相关的命令有些不能使用,并出现下列错误:
rpmdb:
unabletojointheenvironment
error:
db4error(11)fromdbenv->open:
Resourcetemporarilyunavailable
error:
cannotopenPackagesindexusingdb3-Resourcetemporarilyunavailable(11)
error:
cannotopenPackagesdatabasein/var/lib/rpm
nopackages
解决方法是执行“exportLD_ASSUME_KERNEL=2.2.25”命令,也可以将其写入/etc/bashrc。
****************************全文完**************************