Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3521880
  • 博文数量: 534
  • 博客积分: 11595
  • 博客等级: 上将
  • 技术积分: 5785
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-22 17:00
文章分类

全部博文(534)

文章存档

2015年(4)

2014年(27)

2013年(15)

2012年(38)

2011年(36)

2010年(85)

2009年(63)

2008年(142)

2007年(124)

分类: LINUX

2007-08-01 09:50:46

在前阵子因为要学习linux驱动开发, 而借的书linux device driver讲的是2.6.10的内核,而本人用的是2.4.18的内核,所以就升级了内核,这在前面的日志有记载,当时借鉴了挺多的网站上的文章,所以这篇文章算是转载加原创.
 
一 准备工作
 
1 查看linux内核版本
 

 #uname -a

2 下载linux内核源码

  网址是: 自选一个适合自己的内核吧

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

 这些工具可能有其他的版本,自己选吧.

二 配置工作

4、将下载好的内核源码包和4个升级工具都拷贝到/usr/src文件夹下。

5、拷贝完毕,开始解压新内核,具体操作请依次执行以下命令:
# cd /usr/src  (进入到/usr/src目录下,如果已经在/usr/src目录下,可不执行该命令)
# rm –rf linux  (删除linux文件夹。值得一提的是,如果内核先前从未编译过,则没有这个文件夹,此命令行可略过)
# tar jvxf linux-2.6.18.tar.bz2  (解压新内核)
# ln -s linux-2.6.18 linux  (重新生成linux文件夹)

6、安装module-init-tools工具
在/usr/src目录下,依次执行下列命令:
# tar jvxf module-init-tools-3.2.tar.bz2  (解压module-init-tools) 
# cd module-init-tools-3.2  (由/usr/src目录进入module-init-tools目录下)
#./configure --prefix=/ 
# make moveold
# make all install
#./generate-modprobe.conf /etc/modprobe.conf

7、安装另外三个升级工具
回到/usr/src目录下,依次执行下列3个命令来安装另外三个升级工具:
# rpm -ivh --nodeps mkinitrd-4.1.18-2.i386.rpm  (注意,这里一定要加入--nodeps参数,下同)
# rpm -ivh --nodeps lvm2-2.00.25-1.01.i386.rpm
# rpm -ivh --nodeps device-mapper-1.00.19-2.i386.rpm
如果不更新以上几个升级包,在后面编译内核时会提示以下错误:
      mkinitrd failed
      make[1]: *** [install] Error 1
      make: *** [install] Error 2

8、配置内核选项
# cd linux-2.6.18  (进入到/usr/src/linux-2.6.18目录下)
# make mrproper  (该命令可确保源代码目录下没有不正确的.o文件)
# make menuconfig (配置内核各选项)
此时会出现一个图形界面,列出了所有的内核配置选项,有的选项下还有子选项,你可以用方向键来选择,用Y键来确定。经过我多次试验,大多数选项默认就行,以下几个选项必须选择(请认真核对下面每一个选项,否则编译很有可能前功尽弃):
(1)Loadable Module support选项中,选上“Module unloading”和“Automatic kernel module loading”这两项;
(2)Device Drivers--->Block Devices中选上“Loopback device support”;
     Device Drivers--->Multi-device support(RAID and LVM)处要选上“device mapper  support”;
     Device Drivers--->Graphics support,一定要选上“ Support for frame buffer devices”;
     Device Drivers  --->USB support  --->选上“USB Mass Storage support”(如果是在实环境中,想要更多USB支持,就全选吧。我的是在虚拟机中,用不着了)
     Device Drivers  --->;Network device support  --->Ethernet (10 or 100Mbit)  ---><*>  AMD PCnet32 PCI support 
(3)File system--->(以下9个选项是关于ext2和ext3文件系统配置,选上ext2或ext3的即可,不可同时选上)
           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
     File system--->DOS/FAT/NT Filesystems  --->选上“NTFS file system support”;
注意:
       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
(我的机器当时出现的是第二种情况,然我我使用的是grub直接命令启动,仔细看看grub命令就可以在这个时候不用重装系统了.

出现grub>命令行

grub> root (hd0,0)

grub> kernel /vmlinuz-2.6.10

grub> boot

启动成功,如果失败则可能要更改那些参数,我自己的机器上的是这个,但是其他的不知道,那天我的也试了很久.)


(4)如果你在vmware下编译内核,硬盘用的是scsi的,以下三个选项必选:
     Device Drivers ---><*>SCSI device support  (此项不选的话,下面两项就选择不上)
     Device Drivers ---><*>SCSI device support ---><*>SCSI disk support
     Device Drivers---><8>SCSI device support--->SCSI low-level drivers---><*>; BusLogic SCSI support

三 编译工作

 9 开始编译
在/usr/src/linux-2.6.18目录下,执行以下命令即可编译。编译需要一段时间,给自己倒杯茶耐心等候吧!
# make dep  (建立编译时所需的从属文件。注意:如果内核从未编译过,此步可跳过)
# make clean  (清除内核编译的目标文件。注意:如果内核从未编译过,此步可跳过)
# make bzImage  (注意大小写。这一步才是真正编译内核)
    内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make  zImage编译,内核很大的话,系统会提示你使用make   bzImage命令来编译,所以我直接用make bzImage来编译。
# make modules  (编译可加载模块)
# make modules_install  (安装可加载模块)
  安装成功后,系统会在/lib/modules目录下生成一个2.6.18子目录,里面存放着新内核的所有可加载模块。
# make install  (安装新内核)
注意:
        make install的时候可能会出现如下错误信息:
        No module BusLogic found for kernel 2.4.12
        mkinitrd failed
此问题一般只出现在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
不过别忘记,复制过后再执行一下make install。这一步若卡住了,下面的都无法进行,

四 启动新内核

10 将新内核和System.map文件拷贝到/boot目录下,依次执行以下命令:     
# cp  /usr/src/linux-2.6.18/arch/i386/boot/bzImage   /boot/vmlinuz-2.6.18     
# cp  /usr/src/linux-2.6.18/System.map   /boot/System.map-2.6.18     
# cd  /boot  (进入boot目录)
# rm –rf  System.map  (删除原来的连接)     
# ln –s System.map-2.6.18  System.map   (重新建立连接)     

11 关于grub,这个好像根本就不用修改就可以成功,网上的资料有说要改的,我也不知道怎么样,试试吧.

后记:

升级内核是很简单的事情,我个人觉得主要是配置内核的时候,当没有目的的升级时内核可以随便一点,只要可以启动可以用就可以了,但是当你因为要某种特定的支持的时候应该要好好的配置内核,当然那个时候应该有相关的文档要你选什么了.

这篇文章很大部分转载了http://blog.csdn.net/flyfox315/archive/2007/01/31/1499054.aspx,但是也有自己的东西.

阅读(2718) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~