linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > 内核研究 >
栏目导栏
资料搜索
热门文章
·linux-2.6内核升级文档
·Linux源代码的注释
·linux2.6内核编译方法详述
·Linux操作系统内核编译详解
·Linux内核结构详解
·Linux配置与编译内核
·定时器
·Linux内核升级全攻略
·FC5(Fedora Core5)下编译内核总
·Ubuntu 6.06 dapper 内核编译初
·Linux 内核编译详解
·Linux内核管理基础知识概述
·Linux2.4升级到2.6内核升级指南
·第八章 设备驱动
·如何编译linux内核
最新文章
·Linux内核bootsplash功能的实现
·Linux内核2.6.25全新发布加入众
·Debian Linux系统编译内核标准
·Linux2.4内核和2.6内核对Initr
·2.6.24内核编译 initrd-2.6.24
·Qtopia应用程序与Linux内核数据
·Linux 2.6内核中sysfs文件系统
·Linux2.6内核驱动移植参考
·Andrew Morton:Linux内核的执法
·Fedora 8 Linux系统的内核配置
·Kernel中的irq.c函数
·Linux核心出现权限扩张及记忆体
·Linux 2.6本地权限提升漏洞
·结合Linux系统内核源码理解SYN
·关于Linux 内核中五个主要子系
Google
 
升级RedHat9.0(Kernel2.4.20-8)至LinuxKernel2.6.15笔记
[ 作者:  加入时间:2007-07-25 11:55:36  来自:Linux联盟收集整理 ]
***********************************9RbLinux联盟
一、安装必要工具9RbLinux联盟
***********************************9RbLinux联盟
1. 安装module-init-tools-3.2.tar.gz9RbLinux联盟
下载地址:http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/9RbLinux联盟
9RbLinux联盟
安装方法:9RbLinux联盟
#tar zxvf module-init-tools-3.2.tar.gz9RbLinux联盟
#cd modules-init-tools-3.29RbLinux联盟
#./configure --prefix=/9RbLinux联盟
#make moveold9RbLinux联盟
#make all install9RbLinux联盟
#./generate-modprobe.conf /etc/modprobe.conf9RbLinux联盟
9RbLinux联盟
2. 升级mkinitrd9RbLinux联盟
下载地址:我没有升级mkinitrd,下载地址到goole里搜吧。9RbLinux联盟
9RbLinux联盟
说明:9RbLinux联盟
如果你启动,加载模块没有给出模块与内核版本不兼容的信息,就不用重新下载mkinitrd程序来编译模块生成initrd。因为2.6相对于2.4来说,模块不是每个都改动,9RbLinux联盟
如果你使用的模块没有改动,就什么都不用做.9RbLinux联盟
9RbLinux联盟
具体的:9RbLinux联盟
1)如果你不使用lvm2或使用lvm来做volume management,你就无需下载新版mkinitrd9RbLinux联盟
2)如果你没有使用2.6中新的模块,或者新的模块已经编译进内核,就意味着与2.4使用的initrd.img没有变化,就连initrd.img也无需生成9RbLinux联盟
9RbLinux联盟
initrd.img是由bootload加载入内存的,ext3编成模块加在initrd中照样可以启动,按我的理解,ext3并非要编译进内核中,但具体实践中,9RbLinux联盟
如果没编译进内核中,会出现类似如下错误:9RbLinux联盟
mount: error 19 mounting ext39RbLinux联盟
pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed: 29RbLinux联盟
umount /initrd/proc fail: 29RbLinux联盟
Freeing unused kernel memory: 244k freed9RbLinux联盟
Kernel panic – not syncing: No init found. Try passing init = option to kernel.9RbLinux联盟
而这可以通过重新生成initrd.img来解决。所谓在grub.conf中root=LABLE=必须修改成绝对分区编号,其实也就是因为没有生成重新生成initrd.img的问题造成。9RbLinux联盟
9RbLinux联盟
9RbLinux联盟
如果需要安装最新的mkinitrd,请注意:新的mkinitrd, 它需要lvm2 和device-mapper9RbLinux联盟
用 rpm -ivh --nodeps mkinitrd-4.1.18-2.i386.rpm 进行安装9RbLinux联盟
9RbLinux联盟
安装lvm2-2.00.25-1.01.i386.rpm时请用rpm -ivh --nodeps lvm2-2.00.25-1.01.i386.rpm9RbLinux联盟
9RbLinux联盟
3. 安装hotplug工具,如果没有此工具,则USB鼠标即使在启动显示ok 加载上了也不能用,2.6.15内核可使用hotplug-2004_09_23.tar.gz9RbLinux联盟
下载地址:http://www.kernel.org/pub/linux/utils/kernel/hotplug/9RbLinux联盟
9RbLinux联盟
安装方法:9RbLinux联盟
#tar zxvf hotplug-2004_09_23.tar.gz9RbLinux联盟
#cd hotplug-2004_09_239RbLinux联盟
#make install9RbLinux联盟
9RbLinux联盟
9RbLinux联盟
4. 下载最新的Kernel源代码9RbLinux联盟
下载地址:http://www.kernel.org/pub/linux/kernel/9RbLinux联盟
9RbLinux联盟
9RbLinux联盟
***********************************9RbLinux联盟
二、准备Kernel源代码树9RbLinux联盟
***********************************9RbLinux联盟
1、下载到tarball包之后,将内核tarball包复制到/usr/src目录下,假定包在当前目录中,运行以下命令: 9RbLinux联盟
#cp linux-2.6.0.tar.gz /usr/src 9RbLinux联盟
9RbLinux联盟
2、转到/usr/src目录并解开tarball包, 9RbLinux联盟
#cd /usr/src 9RbLinux联盟
#tar xvzf linux-2.6.0.tar.gz 9RbLinux联盟
9RbLinux联盟
默认情况下(使用Intel x86 CPU系列),下面这一步可以省略。9RbLinux联盟
3、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。9RbLinux联盟
# cd /usr/include9RbLinux联盟
# rm -Rf asm linux9RbLinux联盟
# ln -s /usr/src/linux/include/asm-i386 asm  (如果你使用其它CPU比如PPC,那就需要连接到相应的目录)9RbLinux联盟
# ln -s /usr/src/linux/include/linux linux 9RbLinux联盟
# ln -s /usr/src/linux/include/scsi scsi9RbLinux联盟
9RbLinux联盟
4、如果你还下载了补丁包,则打上补丁,你也可以运行scripts/patch-kernel脚本文件自动打上补丁(准备好补丁包)或 #zcat patch-2.6.0.gz|patch -p1(我偷懒不打补丁的)。 9RbLinux联盟
9RbLinux联盟
5、修改内核源代码 (升级2.6就是为了优化,干脆连源代码也改了吧)9RbLinux联盟
   9RbLinux联盟
    1)修改/usr/src/linux/include/linux/posix_types.h 9RbLinux联盟
      设置fd_set支持的最大数量  9RbLinux联盟
      #define __FD_SETSIZE 1024 --->; 65536     9RbLinux联盟
    9RbLinux联盟
    2)修改/usr/src/linux/include/linux/fs.h 9RbLinux联盟
      设置最大打开文件数量(TCP连接数量)9RbLinux联盟
      #define INR_OPEN 1024 --->; 65536 9RbLinux联盟
      #define NR_FILE 8192 --->; 65536 9RbLinux联盟
      #define NR_RESERVED_FILES 10 --->; 128 9RbLinux联盟
     9RbLinux联盟
    3)修改/usr/src/linux/include/net/tcp.h 9RbLinux联盟
      设置TIMEOUT的时间为1秒9RbLinux联盟
      #define TCP_TIMEWAIT_LEN (60*HZ) 60 --->; 1*HZ 9RbLinux联盟
      设置在backlog队列里的半连接的重试次数,每次都会花相应的时间,本质上 也是减少重试时间 9RbLinux联盟
      #define TCP_SYNACK_RETRIES  5 --->; 3 9RbLinux联盟
9RbLinux联盟
***********************************9RbLinux联盟
三、定制内核9RbLinux联盟
***********************************9RbLinux联盟
配制内核之前请清理源代码树,如果还没有进入/usr/src/linux-2.6.0目录,请进入此目录,命令如下: 9RbLinux联盟
#make clean9RbLinux联盟
#make mrproper (这步是为确保原代码目录下没有不正确的.o文件及文件的相互依赖,刚解开的tarball包不需此步骤)9RbLinux联盟
9RbLinux联盟
注: 可以使用make help来查看帮助。9RbLinux联盟
9RbLinux联盟
然后可以使用以下四个命令来配置内核:9RbLinux联盟
#make gconfig  (需要Gtk开发库的支持)9RbLinux联盟
#make xconfig  (需要Qt开发库的支持) 9RbLinux联盟
#make config 9RbLinux联盟
#make menuconfig (推荐)9RbLinux联盟
9RbLinux联盟
配置核心选项 9RbLinux联盟
#make menuconfig 9RbLinux联盟
基本上保持默认选项就可以了,但是要注意的是必须把ext2和ext3文件系统支持编进内核,否则升级内核重新启动是会有错误: 9RbLinux联盟
Kernel panic: No init found. Try passing init= option to kernel 9RbLinux联盟
9RbLinux联盟
ext2和ext3文件系统配置为: (全部选择)9RbLinux联盟
File systems ---> 9RbLinux联盟
  <*>Second extended fs support 9RbLinux联盟
      Ext2 extended attributes 9RbLinux联盟
      Ext2 POSIX Access Control Lists 9RbLinux联盟
      Ext2 Security Labels 9RbLinux联盟
  <*>Ext3 journalling file system support 9RbLinux联盟
      Ext3 extended attributes 9RbLinux联盟
      Ext3 POSIX Access Control Lists 9RbLinux联盟
      Ext3 Security Labels 9RbLinux联盟
  JBB (ext3) debugging support 9RbLinux联盟
9RbLinux联盟
注意:9RbLinux联盟
   如果你是ext3文件系统,则在定制内核配置文件时把对Ext3、Ext2文件的支持直接编译进内核,否则,等你启用新内核时机器就会当掉,出错信息如下:9RbLinux联盟
      kernel panic : no init found ,try passing init = option to kernel......9RbLinux联盟
  或者是:9RbLinux联盟
      kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)9RbLinux联盟
  把对Ext3、Ext2文件系统的支持直接编译进内核,可解决此问题,还有把对“Module unloading“选项也选上,否则的话,你在新内核环境下将无法卸载9RbLinux联盟
内核模块(rmmod命令不能用)。9RbLinux联盟
9RbLinux联盟
***********************************9RbLinux联盟
四、编译内核及模块 9RbLinux联盟
***********************************9RbLinux联盟
配置完内核后,开始编译:9RbLinux联盟
#make dep  (编译2.6内核无需此步骤)9RbLinux联盟
9RbLinux联盟
#make -jn (n代表同时编译的进程,可以加快编译速度,n由你的配置决定,我的配置用15-25)9RbLinux联盟
9RbLinux联盟
注意: 此命令已完成make bzImage及make modules的工作, 生成的bzImage内核文件在arch/i386/boot目录中,你的CPU不同内核文件存放位置也不同9RbLinux联盟
9RbLinux联盟
注: 这一步比较耗时,根据机器配置,可能会消耗30分钟或更长时间。9RbLinux联盟
    9RbLinux联盟
***********************************9RbLinux联盟
五、编译可加载模块和安装新内核9RbLinux联盟
***********************************9RbLinux联盟
如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。 9RbLinux联盟
# make modules -j259RbLinux联盟
# make modules_install (安装内核模块到/lib/modules/2.x.x下)9RbLinux联盟
# make install         (完成mkinitrd命令及内核(bzImage)和System.map的拷贝)9RbLinux联盟
9RbLinux联盟
完成后,请查看/boot目录,文件名是有区别的,如是GRUB引导,make install命令已帮你自动修改了引导选项,对于LILO则要手工修改,重写引导记录。 9RbLinux联盟
9RbLinux联盟
9RbLinux联盟
***********************************9RbLinux联盟
六、修改相应文件已适应2.6内核9RbLinux联盟
***********************************9RbLinux联盟
1.内核2.6 的usb 设备名与内核2.4 大不相同。所以我们要改一下哈哈。9RbLinux联盟
9RbLinux联盟
在安装module-init-tools程序包时生成的/etc/modprobe.conf配置文件却仍然使用usb-ohci这个名字9RbLinux联盟
9RbLinux联盟
alias usb-controller usb-ohci9RbLinux联盟
alias usb-controller1 ehci-hcd9RbLinux联盟
9RbLinux联盟
因此, 要把它改为:9RbLinux联盟
9RbLinux联盟
alias usb-controller ohci-hcd9RbLinux联盟
alias usb-controller1 ehci-hcd9RbLinux联盟
9RbLinux联盟
2.需要改一个最重要的文件/etc/rc.sysconfig 这是一个ln 连接。正真的文件在/etc/rc.d/里9RbLinux联盟
9RbLinux联盟
#vi /etc/rc.sysinit9RbLinux联盟
9RbLinux联盟
把/proc/ksyms 改为如下所示(注:用于配置了HOTPLUG的支持)9RbLinux联盟
9RbLinux联盟
KSYMS=/proc/ksyms9RbLinux联盟
9RbLinux联盟
改为:9RbLinux联盟
9RbLinux联盟
KSYMS=/proc/kallsyms9RbLinux联盟
9RbLinux联盟
3.把所有mount -f -t usbdevfs usbdevfs 改为mount -f -t usbfs usbfs 我查看了就二个。9RbLinux联盟
9RbLinux联盟
4.建立一个/sys系统这部我也不知道为啥,但你是用默认的/proc/bus/usb 下就提示找不到drivers 文件。晕死了。9RbLinux联盟
# mkdir /sys9RbLinux联盟
9RbLinux联盟
6.修改rc.sysconfig 文件9RbLinux联盟
9RbLinux联盟
在mount -f /proc 下加入9RbLinux联盟
mount -f /sys 这一行9RbLinux联盟
9RbLinux联盟
9RbLinux联盟
7.# Mount /proc (done here so volume labels can work with fsck)9RbLinux联盟
action $"Mounting proc filesystem: " mount -n -t proc /proc /proc9RbLinux联盟
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys9RbLinux联盟
加入上面这行9RbLinux联盟
9RbLinux联盟
8.修改fstab9RbLinux联盟
#vi /etc/fstab 加入如下9RbLinux联盟
none    /sys  sysfs   defaults  0 09RbLinux联盟
.9RbLinux联盟
9RbLinux联盟
9.修改/etc/init.d/halt 为如下9RbLinux联盟
awk $2 ~ /^/$|^/proc|^/dev/{next}9RbLinux联盟
改为 9RbLinux联盟
awk $2 ~ /^/$|^/proc|^/sys|^/dev/{next}9RbLinux联盟
9RbLinux联盟
9RbLinux联盟
10.把needusbstorage=这段改成如下9RbLinux联盟
9RbLinux联盟
needusbstorage=9RbLinux联盟
if [ $usb = "1" ]; then9RbLinux联盟
    needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`9RbLinux联盟
    LC_ALL=C grep hid /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null9RbLinux联盟
    action $"Initializing USB keyboard: " modprobe keybdev 2> /dev/null9RbLinux联盟
    action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null9RbLinux联盟
fi9RbLinux联盟
9RbLinux联盟
改成如下:9RbLinux联盟
needusbstorage=9RbLinux联盟
if [ $usb = "1" ]; then9RbLinux联盟
    needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`9RbLinux联盟
    action $"Initializing USB HID interface: " modprobe usbhid 2> /dev/null9RbLinux联盟
    action $"Initializing USB keyboard: " modprobe usbkbd 2> /dev/null9RbLinux联盟
    action $"Initializing USB mouse: " modprobe usbmouse 2> /dev/null9RbLinux联盟
fi9RbLinux联盟
9RbLinux联盟
这些完成就reboot吧! 希望在启动时全是ok.9RbLinux联盟
9RbLinux联盟
补充:9RbLinux联盟
***********************************9RbLinux联盟
七、手动安装新内核和System.map9RbLinux联盟
***********************************9RbLinux联盟
1、将新内核和System.map文件拷贝到/boot目录下 9RbLinux联盟
# cp /usr/src/linux-2.6/arch/i386/boot/bzImage  /boot/vmlinuz-2.6.15-10custom9RbLinux联盟
# cp /usr/src/linux-2.6/System.map  /boot/System.map-2.6.15-10custom9RbLinux联盟
# cd /boot 9RbLinux联盟
# rm -f System.map   (删除原来的连接)9RbLinux联盟
# ln -s System.map-2.6.15-10custom  System.map  (重新建立连接) 9RbLinux联盟
9RbLinux联盟
***********************************9RbLinux联盟
八、配置LILO9RbLinux联盟
***********************************9RbLinux联盟
1.配置/etc/lilo.conf文件,在该文件中加入下面几行:9RbLinux联盟
image=/boot/vmlinuz-2.6.15-10custom 9RbLinux联盟
label=linux-custom9RbLinux联盟
initrd=/boot/initrd-2.6.15-10.img9RbLinux联盟
read-only9RbLinux联盟
root=/dev/hda3     (这与你的具体配置有关)9RbLinux联盟
并把default=linux改为default=linux-custom9RbLinux联盟
9RbLinux联盟
2.使新配置生效9RbLinux联盟
# /sbin/lilo9RbLinux联盟
9RbLinux联盟
***********************************9RbLinux联盟
九、配置grub使用2.6的I/O调度器9RbLinux联盟
***********************************9RbLinux联盟
    设置之前先介绍一下2.6的I/O调度器9RbLinux联盟
        2.6包含的四个I/O调度器分别是No-op I/O scheduler、Anticipatory I/O scheduler、Deadline I/O scheduler与CFQ I/O scheduler。9RbLinux联盟
    在后文中分别简称为ns、as、ds与cfq。9RbLinux联盟
9RbLinux联盟
        ns是一个简化的调度程序它只作最基本的合并与排序。与桌面系统的关系不是很大,主要用在一些特殊的软件9RbLinux联盟
    与硬件环境下,这些软件与硬件一般都拥有自己的调度机制对内核支持的要求很小,这很适合一些嵌入式系统环境。作为桌面用户我们一般不会选择它。9RbLinux联盟
9RbLinux联盟
        as是当前内核中默认的I/O调度器。它拥有非常好的性能,在2.5中它就相当引人注意。在与2.4内核进行的对比测试中,在2.4中多项以分钟为单位9RbLinux联盟
    完成的任务,它则是以秒为单位来完成的。正因为如此它成为目前2.6测试版中默认的I/O调度器。但它也存在着弱点,它本身是比较庞大与复杂的,9RbLinux联盟
    在一些特殊的情况下,特别是在数据吞吐量非常大的数据库系统中它会变的比较缓慢。9RbLinux联盟
9RbLinux联盟
        ds就是针对as的缺点进行改善而来的,还处于测试阶段,但已经很稳定了。目前表现出的性能几乎与as一样好。加之比as更加小巧,9RbLinux联盟
    是相当有前途的调度器,值得一试:)9RbLinux联盟
9RbLinux联盟
        cfq为系统内的所有任务分配相同的带宽,提供一个公平的工作环境,它比较适合桌面环境。事实上在测试中它也有不错的表现,9RbLinux联盟
    mplayer xmms等多媒体播放器与它配合的相当好,回放平滑几乎没有因访问磁盘而出现的跳帧现象。对于喜欢在Linux下听音乐看电影的朋友不妨尝试一下。9RbLinux联盟
    9RbLinux联盟
    好了,下面说说怎么设置:参数的格式为elevator=调度器名9RbLinux联盟
9RbLinux联盟
    修改/boot/grub/grub.conf,在kernel那行后门加入elevator=deadline9RbLinux联盟
    9RbLinux联盟
    例如:kernel /boot/vmlinuz-2.6.10-bk4 ro root=/dev/你的根分区 elevator=deadline9RbLinux联盟
9RbLinux联盟
***********************************9RbLinux联盟
使用新内核可能出现的问题及对策9RbLinux联盟
***********************************9RbLinux联盟
1. RedHat用户rpm命令不能使用,解决办法:请把变量在全局配置文件中声明。9RbLinux联盟
这是RPM的一个Bug,特别是对于RH9的用户,请打开/etc/profile文件,命令如下: 9RbLinux联盟
#vi /etc/profile (在文件的末尾加上几句如下) 9RbLinux联盟
if [`uname -r`="2.6.0" ];then 9RbLinux联盟
export LD_ASSUME_KERNEL=2.2.5 9RbLinux联盟
fi 9RbLinux联盟
也就是给系统加上一个全局的环境变量,也可直接键入#export LD_ASSUME_KERNEL=2.2.5。 9RbLinux联盟
9RbLinux联盟
9RbLinux联盟
2. 新内核根本起不来,解决方法:重新配置内核(学问挺大),也许还根引导记录有关(很少了); 9RbLinux联盟
9RbLinux联盟
9RbLinux联盟
3. 新内核模块无法加载,会导致很多问题,比如了防火墙没法工作了,mount不上光盘和vfat及ntfs文件系统,其解决方法:升级module-init-tools软件包,9RbLinux联盟
   RedHat的用户可能还要修改/etc/rc.d/rc.sysinit文件; 9RbLinux联盟
9RbLinux联盟
                 **************************** 全文完 **************************
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·跟我学习安装配置RedHat9.0  (2007-02-27 11:43:59)
 ·vmware下将RH9内核升级至2.6  (2007-02-09 11:26:06)
 ·RedHat9.0下的DNS和虚拟主机的配置  (2007-01-16 10:41:38)
 ·使用yum把内核升级到Kernel 2.6.0test9  (2006-09-23 20:56:53)
 ·Windows引导Linux+Redhat9.0引导修复  (2006-09-07 19:51:36)
 ·RedHat9.0操作的oracle9i安装  (2006-09-05 21:52:36)
 ·超完整RedHat9.0-vsftp配置大全  (2006-08-21 23:55:31)
 ·使用RPM包对RedHat进行内核升级  (2006-08-17 12:20:15)
 ·RedHat9.0 vs-ftp 基本设置  (2006-07-19 17:57:50)
 ·RedHat9.0下带认证的Sendmail邮件服务器安装手册  (2006-06-26 21:32:00)