挂载光盘linux内核升级,升级Red Hat 9.0(Kernel 2.4.20- 至 Linux Kernel 2.6.15

Author: Kendiv

整理于: 2006/02/01

***********************************

一、安装必要工具

***********************************

1. 安装module-init-tools-3.2.tar.gz

下载地址:

安装方法:

#tar zxvf module-init-tools-3.2.tar.gz

#cd modules-init-tools-3.2

#./configure --prefix=/

#make moveold

#make all install

#./generate-modprobe.conf /etc/modprobe.conf

2. 升级mkinitrd

下载地址:我没有升级mkinitrd,下载地址到goole里搜吧。

说明:

如果你启动,加载模块没有给出模块与内核版本不兼容的信息,就不用重新下载mkinitrd程序来编译模块生成initrd。因为2.6相对于2.4来说,模块不是每个都改动,

如果你使用的模块没有改动,就什么都不用做.

具体的:

1)如果你不使用lvm2或使用lvm来做volume management,你就无需下载新版mkinitrd

2)如果你没有使用2.6中新的模块,或者新的模块已经编译进内核,就意味着与2.4使用的initrd.img没有变化,就连initrd.img也无需生成

initrd.img是由bootload加载入内存的,ext3编成模块加在initrd中照样可以启动,按我的理解,ext3并非要编译进内核中,但具体实践中,

如果没编译进内核中,会出现类似如下错误:

mount: error 19 mounting ext3

pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed: 2

umount /initrd/proc fail: 2

Freeing unused kernel memory: 244k freed

Kernel panic – not syncing: No init found. Try passing init = option to kernel.

而这可以通过重新生成initrd.img来解决。所谓在grub.conf中root=LABLE=\必须修改成绝对分区编号,其实也就是因为没有生成重新生成initrd.img的问题造成。

如果需要安装最新的mkinitrd,请注意:新的mkinitrd, 它需要lvm2 和device-mapper

用 rpm -ivh --nodeps mkinitrd-4.1.18-2.i386.rpm 进行安装

安装lvm2-2.00.25-1.01.i386.rpm时请用rpm -ivh --nodeps lvm2-2.00.25-1.01.i386.rpm

3. 安装hotplug工具,如果没有此工具,则USB鼠标即使在启动显示ok 加载上了也不能用,2.6.15内核可使用hotplug-2004_09_23.tar.gz

下载地址:

安装方法:

#tar zxvf hotplug-2004_09_23.tar.gz

#cd hotplug-2004_09_23

#make install

4. 下载最新的Kernel源代码

下载地址:

***********************************

二、准备Kernel源代码树

***********************************

1、下载到tarball包之后,将内核tarball包复制到/usr/src目录下,假定包在当前目录中,运行以下命令:

#cp linux-2.6.0.tar.gz /usr/src

2、转到/usr/src目录并解开tarball包,

#cd /usr/src

#tar xvzf linux-2.6.0.tar.gz

默认情况下(使用Intel x86 CPU系列),下面这一步可以省略。

3、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。

# cd /usr/include

# rm -Rf asm linux

# ln -s /usr/src/linux/include/asm-i386 asm  (如果你使用其它CPU比如PPC,那就需要连接到相应的目录)

# ln -s /usr/src/linux/include/linux linux

# ln -s /usr/src/linux/include/scsi scsi

4、如果你还下载了补丁包,则打上补丁,你也可以运行scripts/patch-kernel脚本文件自动打上补丁(准备好补丁包)或 #zcat patch-2.6.0.gz|patch -p1(我偷懒不打补丁的)。

5、修改内核源代码 (升级2.6就是为了优化,干脆连源代码也改了吧)

1)修改/usr/src/linux/include/linux/posix_types.h

设置fd_set支持的最大数量

#define __FD_SETSIZE 1024 --->; 65536

2)修改/usr/src/linux/include/linux/fs.h

设置最大打开文件数量(TCP连接数量)

#define INR_OPEN 1024 --->; 65536

#define NR_FILE 8192 --->; 65536

#define NR_RESERVED_FILES 10 --->; 128

3)修改/usr/src/linux/include/net/tcp.h

设置TIMEOUT的时间为1秒

#define TCP_TIMEWAIT_LEN (60*HZ) 60 --->; 1*HZ

设置在backlog队列里的半连接的重试次数,每次都会花相应的时间,本质上 也是减少重试时间

#define TCP_SYNACK_RETRIES  5 --->; 3

***********************************

三、定制内核

***********************************

配制内核之前请清理源代码树,如果还没有进入/usr/src/linux-2.6.0目录,请进入此目录,命令如下:

#make mrproper (这步是为确保原代码目录下没有不正确的.o文件及文件的相互依赖,刚解开的tarball包不需此步骤)

注: 可以使用make help来查看帮助。

然后可以使用以下四个命令来配置内核:

#make gconfig  (需要Gtk开发库的支持)

#make xconfig  (需要Qt开发库的支持)

#make config

#make menuconfig (推荐)

配置核心选项

#make menuconfig

基本上保持默认选项就可以了,但是要注意的是必须把ext2和ext3文件系统支持编进内核,否则升级内核重新启动是会有错误:

Kernel panic: No init found. Try passing init= option to kernel

ext2和ext3文件系统配置为: (全部选择)

File systems --->

Second extended fs support

Ext2 extended attributes

Ext2 POSIX Access Control Lists

Ext2 Security Labels

Ext3 journalling file system support

Ext3 extended attributes

Ext3 POSIX Access Control Lists

Ext3 Security Labels

JBB (ext3) debugging support

注意:

如果你是ext3文件系统,则在定制内核配置文件时把对Ext3、Ext2文件的支持直接编译进内核,否则,等你启用新内核时机器就会当掉,出错信息如下:

kernel panic : no init found ,try passing init = option to kernel......

或者是:

kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)

把对Ext3、Ext2文件系统的支持直接编译进内核,可解决此问题,还有把对“Module unloading“选项也选上,否则的话,你在新内核环境下将无法卸载

内核模块(rmmod命令不能用)。

***********************************

四、编译内核及模块

***********************************

配置完内核后,开始编译:

#make dep  (编译2.6内核无需此步骤)

#make -jn (n代表同时编译的进程,可以加快编译速度,n由你的配置决定,我的配置用15-25)

注意: 此命令已完成make bzImage及make modules的工作, 生成的bzImage内核文件在arch/i386/boot目录中,你的CPU不同内核文件存放位置也不同

注: 这一步比较耗时,根据机器配置,可能会消耗30分钟或更长时间。

***********************************

五、编译可加载模块和安装新内核

***********************************

如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。

# make modules_install  (安装内核模块到/lib/modules/2.x.x下)

# make install                 (完成mkinitrd命令及内核(bzImage)和System.map的拷贝)

完成后,请查看/boot目录,文件名是有区别的,如是GRUB引导,make install命令已帮你自动修改了引导选项,对于LILO则要手工修改,重写引导记录。

***********************************

六、修改相应文件已适应2.6内核

***********************************

1.内核2.6 的usb 设备名与内核2.4 大不相同。所以我们要改一下哈哈。

在安装module-init-tools程序包时生成的/etc/modprobe.conf配置文件却仍然使用usb-ohci这个名字

alias usb-controller usb-ohci

alias usb-controller1 ehci-hcd

因此, 要把它改为:

alias usb-controller ohci-hcd

alias usb-controller1 ehci-hcd

2.需要改一个最重要的文件/etc/rc.sysconfig 这是一个ln 连接。正真的文件在/etc/rc.d/里

#vi /etc/rc.sysinit

把/proc/ksyms 改为如下所示(注:用于配置了HOTPLUG的支持)

KSYMS=/proc/ksyms

改为:

KSYMS=/proc/kallsyms

3.把所有mount -f -t usbdevfs usbdevfs 改为mount -f -t usbfs usbfs 我查看了就二个。

4.建立一个/sys系统这部我也不知道为啥,但你是用默认的/proc/bus/usb 下就提示找不到drivers 文件。晕死了。

# mkdir /sys

6.修改rc.sysconfig 文件

在mount -f /proc 下加入

mount -f /sys 这一行

7.# Mount /proc (done here so volume labels can work with fsck)

action $"Mounting proc filesystem: " mount -n -t proc /proc /proc

action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys

加入上面这行

8.修改fstab

#vi /etc/fstab 加入如下

none    /sys  sysfs   defaults  0 0

.

9.修改/etc/init.d/halt 为如下

awk '$2 ~ /^\/$|^\/proc|^\/dev/{next}

改为

awk '$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}

10.把needusbstorage=这段改成如下

needusbstorage=

if [ $usb = "1" ]; then

needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`

LC_ALL=C grep 'hid' /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null

action $"Initializing USB keyboard: " modprobe keybdev 2> /dev/null

action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null

fi

改成如下:

needusbstorage=

if [ $usb = "1" ]; then

needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`

action $"Initializing USB HID interface: " modprobe usbhid 2> /dev/null

action $"Initializing USB keyboard: " modprobe usbkbd 2> /dev/null

action $"Initializing USB mouse: " modprobe usbmouse 2> /dev/null

fi

这些完成就reboot吧! 希望在启动时全是ok.

补充:

***********************************

七、手动安装新内核和System.map

***********************************

1、将新内核和System.map文件拷贝到/boot目录下

# cp /usr/src/linux-2.6/arch/i386/boot/bzImage  /boot/vmlinuz-2.6.15-10custom

# cp /usr/src/linux-2.6/System.map  /boot/System.map-2.6.15-10custom

# cd /boot

# rm -f System.map   (删除原来的连接)

# ln -s System.map-2.6.15-10custom  System.map  (重新建立连接)

***********************************

八、配置LILO

***********************************

1.配置/etc/lilo.conf文件,在该文件中加入下面几行:

image=/boot/vmlinuz-2.6.15-10custom

label=linux-custom

initrd=/boot/initrd-2.6.15-10.img

read-only

root=/dev/hda3     (这与你的具体配置有关)

并把default=linux改为default=linux-custom

2.使新配置生效

# /sbin/lilo

***********************************

九、配置grub使用2.6的I/O调度器

***********************************

设置之前先介绍一下2.6的I/O调度器

2.6包含的四个I/O调度器分别是No-op I/O scheduler、Anticipatory I/O scheduler、Deadline I/O scheduler与CFQ I/O scheduler。

在后文中分别简称为ns、as、ds与cfq。

ns是一个简化的调度程序它只作最基本的合并与排序。与桌面系统的关系不是很大,主要用在一些特殊的软件

与硬件环境下,这些软件与硬件一般都拥有自己的调度机制对内核支持的要求很小,这很适合一些嵌入式系统环境。作为桌面用户我们一般不会选择它。

as是当前内核中默认的I/O调度器。它拥有非常好的性能,在2.5中它就相当引人注意。在与2.4内核进行的对比测试中,在2.4中多项以分钟为单位

完成的任务,它则是以秒为单位来完成的。正因为如此它成为目前2.6测试版中默认的I/O调度器。但它也存在着弱点,它本身是比较庞大与复杂的,

在一些特殊的情况下,特别是在数据吞吐量非常大的数据库系统中它会变的比较缓慢。

ds就是针对as的缺点进行改善而来的,还处于测试阶段,但已经很稳定了。目前表现出的性能几乎与as一样好。加之比as更加小巧,

是相当有前途的调度器,值得一试:)

cfq为系统内的所有任务分配相同的带宽,提供一个公平的工作环境,它比较适合桌面环境。事实上在测试中它也有不错的表现,

mplayer xmms等多媒体播放器与它配合的相当好,回放平滑几乎没有因访问磁盘而出现的跳帧现象。对于喜欢在Linux下听音乐看电影的朋友不妨尝试一下。

好了,下面说说怎么设置:参数的格式为elevator=调度器名

修改/boot/grub/grub.conf,在kernel那行后门加入elevator=deadline

例如:kernel /boot/vmlinuz-2.6.10-bk4 ro root=/dev/你的根分区 elevator=deadline

***********************************

使用新内核可能出现的问题及对策

***********************************

1. RedHat用户rpm命令不能使用,解决办法:请把变量在全局配置文件中声明。

这是RPM的一个Bug,特别是对于RH9的用户,请打开/etc/profile文件,命令如下:

#vi /etc/profile (在文件的末尾加上几句如下)

if [`uname -r`="2.6.0" ];then

export LD_ASSUME_KERNEL=2.2.5

fi

也就是给系统加上一个全局的环境变量,也可直接键入#export LD_ASSUME_KERNEL=2.2.5。

2. 新内核根本起不来,解决方法:重新配置内核(学问挺大),也许还根引导记录有关(很少了);

3. 新内核模块无法加载,会导致很多问题,比如了防火墙没法工作了,mount不上光盘和vfat及ntfs文件系统,其解决方法:升级module-init-tools软件包,

RedHat的用户可能还要修改/etc/rc.d/rc.sysinit文件;

**************************** 全文完 **************************

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值