设为首页收藏本站

河南工业大学论坛|工大小窝|河南工业大学BBS|惜缘论坛|2006-2021工大小窝一直在你身边!

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2091|回复: 4
打印 上一主题 下一主题

linux内核升级

[复制链接]
跳转到指定楼层
1
发表于 2009-1-19 15:29:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有时候觉的自己是个无耻的追求者,喜新厌旧,好多新功能自己都想体验;如果有可能,好多linux版本都想装上,去用用。
好了,闲话不多说了,发春节前最后一贴了。
我的虚拟机用的是RH9,即redhat linux 9,版本有点老了,所以想升级一下,不过在这里告诉大家,玩玩可以,想多学点知识可以,自己动手体验一下可以,但是要做开发,还是用linux最新发行版本吧。因为那个相对稳定,你自己升级后好多软件将不兼容,痛苦是无穷尽的。
至于虚拟机是什么,我就不说了,不知道的,自己玩去吧。


一、
准备工作

由于Linux 2.4内核下的module-init-toolsmodutils工具包已经不再适合Linux 2.6内核,所以需要下载新版本工具包。

下载地址:
ftp://ftp.kernel.org/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.5.tar.bz2
ftp://ftp.kernel.org/pub/linux/utils/kernel/modutils/modutils-2.4.27-1.src.rpm
(1)安装modutils
# rpm -e -nodep moduitls(强制卸载原有的moduitls RPM)
# rpm -ivh modutils-2.4.27-1.src.rpm(把源代码包安装到/usr/src/redhat/目录下)
# cd /usr/src/redhat/SPECS/(进入规范文件目录)
# rpmbulid -bb modutils.spec(生成二进制的RPM)
# cd ../RPMS/i386(转入刚生成的二进制的RPM包所在位置)
# rpm -ivh modutils*.rpm(安装生成的二进制RPM)
(2)安装module-init-tools
# tar
-jxvf
module-init-tools-3.5.tar.bz2

# cd module-init-tools-3.5
# ./configure
--prefix=/sbin

# make(make moveold,有网友这样用,我没有用,因为我的执行不成功)
# make install
# ./generate-modprobe.conf
/etc/modprobe.conf

:
1、安装module-init-tools工具时,命令"make moveold"将把系统原来的modutils工具程序改名为"*.old"(比如,lsmod.old等等). NOTE! 这是非常重要的一步, 千万不要省略. 这将使得你可以继续使用原有的linux-2.4.x系统, 因为在2.4.x系统下, 新的module-init- tools工具包实际上是倚赖原来"*.old"程序来加载内核模块. 如果忘记了这一步也不要紧张, 可以先下载并安装原来的modutils程序包, 然后按照上面的步骤重来一遍就可以了.
2、在安装升级工具时,如果加了--nodeps参数仍未能安装成功,请尝试再加入参数—force.
二、
内核配置和编译
(1)
下载内核
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.8.tar.bz2
(2)
解压
# cd /usr/src/
# tar –jxvf linux-2.6.18.8.tar.bz2
# ln –s linux-2.6.18.8 linux
# cd linux
(3)
配置
# make mrproper (该命令可确保源代码目录下没有不正确的.o文件,如果是新解压的内核,此步可免)
# make menuconfig (配置内核各选项)
下面的配置建议选上:
由于在vmware中使用模拟的SCSI硬盘和AMD PCnet32网卡,因此需要“SCSI disk support”、“BusLogin SCSI support”、“AMD PCnet32 PCI support”的支持,最好编译进内核,而不是编译为内核模块。
Device Drivers   --->SCSI device support   ---><*>    SCSI disk support
Device Drivers   --->SCSI device support   --->SCSI low-level drivers   ---> <*> BusLogic SCSI support

Device Drivers   ---> Networking support   --->Ethernet (10 or 100Mbit)   ---> <*>    AMD PCnet32 PCI support
如果编译为模块,initrd则是必须的,否则启动过程中会出现“VFS:unable to mounting root fs.程序包mkinitrd依赖于程序包device-mapper,而程序包device-mapper又依赖于lvm2,因此需要同时下载mkinitrddevice-mapperlvm2程序包。

EXT3也是必须编译进内核,而不能编译为模块

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
2
 楼主| 发表于 2009-1-19 15:31:13 | 只看该作者
File system--->(以下9个选项是关于ext2ext3文件系统配置,全部选上)
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
注:ext2ext3文件系统配置很重要,也是必需的,如果没有编译进内核,在你reboot,出现如下错误信息:
kernel panic : no init found ,try passing init = option to kernel.....
或者是:
VFS:Cannot open root device "hdxy" or unknow-block(0,0)
Please append a correct "root=" boot option
kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)
或者是:
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
USB支持
Device Drivers   ---> USB support   ---><*>    USB Mass Storage support
DOS/FAT/NT支持
File system--->DOS/FAT/NT Filesystems --->选上“NTFS file system support”
下面的不太清楚的,建议选上

(1)Loadable Module support选项中,选上“Module unloading”“Automatic kernel module loading”这两项;
(2)Device Drivers--->Block Devices中选上“Loopback device support”
(3)Device Drivers--->Multi-device support(RAID and LVM)处要选上“device mapper support”
(4)Device Drivers--->Graphics support,一定要选上“ Support for buffer devices”
(5)Device Drivers   ---> Fusion MPT device support   ---><M> Fusion MPT (base + ScsiHost) drivers
<M>    Fusion MPT misc device (ioctl) driver(这个要不要,不确定)
注意:只能选模块方式,直接编译进内核,就出错,不知道为什么,这个浪费了我好多时间才找到,编译了几十次的成果。
出错信息如下:No module mptbase found for kernel vmware。。。。。。。
(1)
编译

# make bzImage(编译内核,生成使用gzip压缩的内核,生成的文件位于/usr/src/linux/arch/i386/boot/目录下)
# make modules(编译可加载模块)
# make modules_install(安装可加载模块,安装成功后,系统会在/lib/modules目录下生成一个2.6.18.8子目录,里面存放着新内核的所有可加载模块。)
# make install(安装新内核)
注:make install的时候可能会出现如下错误信息:
No module BusLogic found for kernel 2.4.20 mkinitrd failed
此问题一般只出现在SCSI硬盘+VMWARE+REDHAT架构中,因为BusLogic被编译进了内核而不是一个module的形式(2.4内核的Buslogic模块即使静态编译进内核也不行)。
解决方式是直接将BusLogic.o文件复制过去:
# cp /usr/src/linux-2.6.10/drivers/scsi/BusLogic.o /lib/modules/2.6.10/kernel/drivers/scsi
复制过后再执行一下make install。
(2)
编译错误解决汇总

错误1
OBJCOPY arch/i386/boot/compressed/vmlinux.bin
BFD: Warning: Writing section `.bss' to huge (ie negative) file offset 0xc0277000.
objcopy: arch/i386/boot/compressed/vmlinux.bin: File truncated
make[2]: *** [arch/i386/boot/compressed/vmlinux.bin] Error 1
make[1]: *** [arch/i386/boot/compressed/vmlinux] Error 2
make: *** [bzImage] Error 2

解决方法:
arch/i386/Makefile里面做一些修改:
OBJCOPYFLAGS改成如下的:
OBJCOPYFLAGS :=-O binary --change-section-lma
.bss-0xc0000000 –R
.note -R .comment
–S
然后重新make bzImage.

3
 楼主| 发表于 2009-1-19 15:32:09 | 只看该作者
编译成功提示如下:

OBJCOPY arch/i386/boot/compressed/vmlinux.bin

GZIP
arch/i386/boot/compressed/vmlinux.bin.gz

LD
arch/i386/boot/compressed/piggy.o

LD
arch/i386/boot/compressed/vmlinux

OBJCOPY arch/i386/boot/vmlinux.bin

HOSTCC
arch/i386/boot/tools/build

BUILD
arch/i386/boot/bzImage
Root device is (8, 1)
Boot sector 512 bytes.
Setup is 7498 bytes.
System is 1191 kB
Kernel: arch/i386/boot/bzImage is ready
(#3)
错误2
ERROR: "crypto_free_tfm" [net/rxrpc/af-rxrpc.ko] undefined!
ERROR: "crypto_alloc_base" [net/rxrpc/af-rxrpc.ko] undefined!
make[1]: *** [__modpost] Error 1
make: *** [modules] Error 2


解决方法:
选中Cryptographic options
--->
  • Cryptographic API
    三、  拷贝 新内核
    #cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.18.8
    (拷贝内核压缩镜像)
    #cp /usr/src/linux/System.map /boot/System.map-2.6.18.8(拷贝内核符号表)
    #cd /boot
    # mv System.map System.map-old
    # ln -s System.map-2.618.8 System.map
    :
    2.6.24开始将i386和x86_64合并成x86了,所以bzImage将在/usr/src/linux/arch/x86/boot/下生成。
    四、
    修改启动文件和系统文件
    (1)由于linux2.6 内核增加了sysfs文件系统,所以要创建/sys目录
    #mkdir /sys
    (2)修改启动脚本/etc/rc.sysinit
    linux2.6内核新支持的sysfs系统
    1)找到“mount –f /proc,在下面添加如下内容:
    #Mount /sys for kernel-2.6.x
    if [ "$KERNELVER" ="2.6" ]; then
    mount -f /sys
    fi
    2)找到“action$”Mounting proc filesystem:”mount –n –t proc /proc /proc,在下面添加如此内容:
    #Mount /sys for kernel-2.6.x
    if [ "$KERNELVDER" = "2.6" ]; then
    action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
    fi


    linux2.6内核符号文件添加支持(添加的KERNELVAER变量,来判断内核版本)
    #
    #---------------------KERNEL 2.6.x support---------------------------
    #This is for compatibility between kernel-2.4.x and kernel-2.6.x
    #
    UNAME='uname -r'
    KERNELVER=${UNAME:0:3}
    if [ "$KERNELVER" = "2.6" ]; then
    #
    #This is for kernel-2.6.x
    #
    KSYMS=/proc/kallsyms
    KEYBDEV_NAME=usbkbd
    MOUSEDEV=usbmouse
    else
    #
    #This is for kernel-2.4.x
    #
    KSYMS=/proc/ksyms
    KEYBDEV_NAME=keybdev
    MOUSEDEV=mousedev
    Fi
  • 4
     楼主| 发表于 2009-1-19 15:33:06 | 只看该作者
    添加USB键盘与鼠标的新支持
    1)由于USB键盘模块名称从keybdev变为usbkbdUSB鼠标模块摸名称从mousedev变为usbmouse,所以必须修改启动脚本文件。通过定义KEYBDEV_NAMEMOUSEDEV_NAME两个变量来标识
    相应的模块名,具体代码见
    2)rc.sysinit脚本中所有出现keybdevmousedev的地方都变成$KEYBDEV_NAME$MOUSEDEV_NAME

    3)rc.sysinit以下内容进行修改
    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_NAME 2> /dev/null

    action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
    fi
    修改为
    needusbstorage=
    if [ $usb = "1" ]; then
    if [ "$KERNELVER" = "2.6" ]; then

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

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

    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
    fi

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

    action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
    fi
    (3)修改/etc/fstab文件系统列表
    /etc/fstab中增加,如下内容:
    none /sys sysfs fefaults 0 0
    (4)修改/etc/init.d/halt 脚本中的halt_get_remaining函数
    找到halt_get_remaining函数,修改
    awk '$2 ~ /^\/$|^\/proc|^\/dev/{next}
    修改为
    awk '$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}
    (5)修改/etc/modprobe.conf配置文件
    由于在linux2.6内核中USB驱动模块被改名了,在主机控制方面,usb-ohci被改成ochi-hcdusb-uhci被改变成uhci-hcd,因此modprobe.conf配置文件中应该进行相应的改变。
    alias usb-controller uhci-hcd
    五、
    修改Grub启动管理器
    #cd /boot
    #
    new-kernel-pkg --mkinitrd --depmod --install 2.6.18.8 (这时候你的/boot下会生成一个initrd-2.6.18.8.img,并且你的grub.conf文件也作了相应更改,如果SCSI模块没有编译进内核,需要进行这一步)
    # df (查看根目录在那个分区,下一步要用到。注意,这里根分区不时boot的那个50M的分区,而一般是你最大的那个分区,也就是“/”,千万不要搞错哦。我的为/dev/sda2)
    #vi ./grub/grub.conf
    5
     楼主| 发表于 2009-1-19 15:36:11 | 只看该作者
    1)添加
    title Red Hat Linux (2.6.18.8)

    root (hd0,0)

    kernel /vmlinuz-2.6.18.8
    ro root=/dev/sda2(df
    而来的“/”根目录所在分区,我的为/dev/sda2)

    #initrd /initrd-2.6.28.img(SCSI
    没有编译进内核的需要去掉此注释符号)
    2)修改启动默认内核,默认启动linux2.6内核
    default=0
    修改为
    default=1
    六、
    启动新内核
    # reboot(重启机器,以启动新内核)
    七、
    新内核启动期间问题
    (1)找不到内核压缩镜像
    检查grub.conf,一般都是kernel /vmlinuz-2.6.18.8
    ro root=/dev/sda2这一步有错,根目录“/”不正确导致的,用df看看根目录“/”在那里呢。
    (2)
    kernel panic



    这部分问题主要可能是在ext2和ext3文件系统配置导致的。如果对Ext3、Ext2文件的支持没有直接编译进内核,在你reboot时机器就会死掉,出现如下错误信息:
    kernel panic : no init found ,try passing init = option to kernel.....
    或者是:
          VFS:Cannot open root device "hdxy" or unknow-block(0,0)
          Please append a correct "root=" boot option
          kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)
    或者是:
          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

    Block devices的子选项中有如下选项:即[ ]Initial RAMdisk (initrd) support和[ ]Per partition statistics in /proc/partitions这两个选项,也会导致出现上述问题。作为补充这里提一下,如果自己在配置2.4.20到主版本相同的升级时,出现这个问题,要检查一下这个地方。
    (3) init[1]: segfault at 00000021 eip 00000021 esp bfbb7bb8 error 4
    或者
    init[1]: segfault at 21 ip 00000021 sp bf9e5878 error 4 in init[804800+6000]
    Kernel panic - not syncing: Attempted to kill init!
    1)有网友说:出现这个错误,而且系统应该算是崩溃了,一直不停刷屏。这个是在编译2.6.23和.2.6.24时出现的错误。尚未解决。网上好多朋友也都说碰到这个问题,好多也没有解决。有人解答说虚拟机下不能升级到2.6.20以上的版本。可能这样说还是有些问题,我曾经试过一下内核都是可以的,2.6.19,2.6.20,2.6.21,到2.6.22时没有出现上面的刷屏现象,但2.6.24刷屏前的代码和它相似,估计是从.26.22版本改了一些东西导致的。具体原因不解。

    2)也有网友说:在vmware里只能升内核到2.6.18,2.6.23以上内核可以编译通过reboot后不能进入系统。如果要用2.6.24,在vmware中就用Fedora系统吧。

    3)反正这个问题就是关于内核版本差异的问题,要想解决此问题,需要内核的可移植性支持,拭目以待高手出现吧。

    八、关于作者

    以上是我参考网络信息,亲自做过实验,不停的重装系统,不过还好,我在虚拟机上,系统有备份.
    实验结果:在linux2.6.18.8内核上试验成功,linux2.6.22.6上失败(或许也能成功,没有继续),linux2.6.28上失败,总结而来的。

    作者才疏学浅,如果有疏漏或者不正确的地方,敬请各位网友指出斧正。


    如有转载,请指明出处,谢谢合作。

    E-mailguo789com@163.com
    空间:http://hi.baidu.com/grdd上面有彩色标注,比较醒目,这是复制过来的,没有颜色显色了,又懒得改。O(∩_∩)O哈哈~
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    QQ|小黑屋|Archiver|手机版|联系我们|工大小窝 ( 豫ICP备06010094号  

    GMT+8, 2024-4-30 12:16 , Processed in 0.136398 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表