fedora 7 编译内核升级到2.6.35.7(内核最新版本)

      最近在学习Linux内核,首当其冲就是编译内核升级,升级的过程是个学习的过程,之后才能仔细研读内核的意义所在,首先我在ubuntu上面成功从内核版本2.6.31.2编译升级到2.6.35.7,但是在fedora上面编译升级的时候却错误不断,甚至多次出现同样的问题,却解决不了,在这里将我编译的详细过程整理出来,并将我遇到的问题做个总结,与大家分享,也为自己做个备份。

      这是我第一次升级内核,出现问题应该是很正常的,因此我就在网上谷歌,百度了一通,最后感觉这边文章还不错,我的大致思路也是按照这篇文章完成,只不过中间出现一些问题,在我的努力下解决掉了,希望能给那些遇到同样问题的同仁一点帮助。这篇文章就是:linux fedora core 8编译内核升级到2.6.25.14-69。下面是我编译升级的整个过程。

       第一步:

       首先我们要准备好需要用的工具,下面四个工具是编译升级必须的,可以用rpm -qa *来查询,我在虚拟机安装的系统已经安装好了:

         module-init-tools
         mkinitrd
         lvm2
         device-mapper
         第二步:

         既然是编译升级内核,那就需要新版的内核。最新的内核去官网下载:http://www.kernel.org/,我下载的就是最新版2.6.35.7,下载完成版。 要查看你自己的版本可以uname -r
         第三步:处理内核源码

         1》内核核心代码存放于目录/usr/src/,我也不例外,将下载的最新内核放在/usr/src/目录下面。下面是处理过程。

         # cd /usr/src  (进入到/usr/src目录下,如果已经在/usr/src目录下,可不执行该命令)
         # rm –rf linux  (删除linux文件夹。值得一提的是,如果内核先前从未编译过,则没有这个文件夹,此命令行可略过)
         # tar jvxf linux-2.6.35.7.tar.bz2  (解压新内核)
          # ln -s linux-2.6.35.7 linux  (重新生成linux文件夹)
         Linux系统的核心代码存放于目录/usr/src/linux,实际上,该目录是一个链接,指向当前所用的核心版本的目录,例如如果当前使用的版本是 2.4,则该核心的实际目录应该是: /usr/src/linux-2.4,而新下载的内核中的目录是linux,这样,直接在/usr/src下解包会导致原来的内核目录被覆盖。所以稳妥的做法是,首先删除链接linux,然后解包、更名、重新链接。在解包前要确认在/usr/src目录下没有叫linux的目录,或者不再想保留该目录。
         2》配置内核选项。有点繁琐,~~希望一次成功哦~~。(这一步比较繁琐,需要认真对待)
          # cd  linux-2.6.35.7(进入到/usr/src/linux-2.6.35.7目录下)
         # 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文件系统配置,全部选上)
             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
             JBD (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
         (我的机器就是在重启之后出现第三种错误,进不去系统,郁闷死,只好重装了~~~如果依照本文做完所有步骤,当你重启Linux系统后,若不幸进不去2.6.35.7内核,你会发现你的出错信息就是上面三种了~~~哈!)
       (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

       注:1.内核的配置

  Linux当前支持的CPU类型包括x86、ARM、DEC Alpha、SUN Sparc、M68000、MIPS、PowerPC等,应该说上述类型已经包括绝大多数用户使用的CPU型号。在安装与配置过程中,Linux会自动识别这些型号。

  通常要运行的第一个命令是:#cd /usr/src/linux;make mrproper。确保源代码目录下没有不正确的.o文件以及文件的互相依赖。

  接下来的内核配置过程比较烦琐,但是配置的适当与否与日后Linux的运行直接相关,有必要了解一下一些主要的且经常用到的选项的设置。

  2.6内核配置包括:

  #make config (基于文本的最为传统的配置界面)

  #make menuconfig (基于文本选单的配置界面)

  #make xconfig (基于图形窗口模式的配置界面)

  #make oldconfig (如果只想在原来内核配置的基础上修改一些小地方,会省去)

  #ALSA:{从2.4版本到2.6版本的升级,这就要使用到ALSA(Advanced Linux Sound Architecture即:新的 Linux 音频体系结构)。它取代了OSS(Open Sound System)。配置内核时,选定ALSA的OSS API效法选项(SND_OSSEMUL、SND_MIXER_OSS和SND_PCM_OSS)和适当的声音驱动(PCI 驱动)。最后,下载和安装最新的alsa-lib和alsa-utils。}

  进行配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。例如,如果需要内核支持DOS分区的文件系统,则要在文件系统部分选择FAT或DOS系统支持;系统如果配有网卡、PCMCIA卡等,需要在网络配置中选择相应卡的类型。

  选择相应的配置时,有三种选择,它们分别代表的含义如下:

  “Y”-将该功能编译进内核

  “N”-不将该功能编译进内核

  “M”-将该功能编译成可以在需要时动态插入到内核中的模块。

  将与核心其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改额变时对内核的影响。许多功能都可以这样处理,例如像上面提到的网卡的支持、对FAT等文件系统的支持。

         3》开始编译

        在/usr/src/linux-2.6.35.7目录下,执行以下命令即可编译。编译需要一段时间,给自己倒杯茶耐心等候吧!
       # make dep  (建立编译时所需的从属文件。注意:如果内核从未编译过,此步可跳过)
       # make clean  (清除内核编译的目标文件。注意:如果内核从未编译过,此步可跳过)
       # make bzImage  (注意大小写。这一步才是真正编译内核)
       内核编译成功后,会在/usr/src/linux/arch/x86/boot目录中生成一个新内核的映像文件bzImage。如果用 make  zImage编译,内核很大的话,系统会提示你使用make   bzImage命令来编译,所以我直接用make bzImage来编译。
        # make modules  (编译可加载模块)
        # make modules_install  (安装可加载模块)
       安装成功后,系统会在/lib/modules目录下生成一个2.6.35.7子目录,里面存放着新内核的所有可加载模块。
        # make install  (安装新内核)

       上面的命令"make install"将: (1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接; (2)修改bootloader的配置文件; (3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置文件增加如下类似的配置行:

        title fedora (2.6.35.7)
        root(hd0, 1)
        kernel /boot/vmlinuz-2.6.35.7 ro root=/dev/VolGroup00/LogVo00 rhgb quiet      

        initrd /boot/initrd-2.6.35.7.img

        注意:
        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.35.7/drivers/scsi/BusLogic.o  /lib/modules/2.6.35.7/kernel/drivers/scsi
不过别忘记,复制过后再执行一下make install。
       注:配置完内核,接下来需要对内核源代码文件的依赖性和完整性进行检验,并且进行编译,此时要保证系统所使用的gcc版本在gcc-2.95.3以上:

  #make clean (确保所有有关文件都处于最新版本状态)

  #make zImage (编译压缩形式的内核)

  在需要内核支持较多的外设和功能时,内核可能变得很大,此时可以编译大内核:

  #make bzImage

  如果选择了可加载模块,编译完内核后,要对选择的模块进行编译:

  #make module (编译选择的模块)

  #make module-install (将编译后的模块转移到系统标准位置)

  模块在系统中的标准目录位于/lib/modules/x.y.z,后面的x.y.z是版本号,为安全起见,在运行#make modules-install之前最好对/lib/modules进行备份。模块通常是带有扩展名.o的文件,使用命令#lsmod可以对当前内核的模块进行列表。
      4》
启动新内核
      将新内核和System.map文件拷贝到/boot目录下,依次执行以下命令:     
     # cp  /usr/src/linux-2.6.35.7/arch/x86/boot/bzImage   /boot/vmlinuz-2.6.35.7     
     # cp  /usr/src/linux-2.6.35.7/System.map   /boot/System.map-2.6.35.7     
     # cd  /boot  (进入boot目录)
     # rm –rf  System.map  (删除原来的连接)     
     # ln –s System.map-2.6.35.7 System.map   (重新建立连接)     

     修改Grub启动管理器
    如果没有错误的话, 下面开始修改grub配置文件(不要告诉我你用的lilo)
    在/boot目录下,执行以下命令:
    # new-kernel-pkg --mkinitrd --depmod --install 2.6.35.7 (这时候你的/boot下会生成一个initrd-2.4.18.img,并且你的grub.conf文件也作了相应更改)

    赶快重启,看看升级后的2.6内核吧!

    没有想到还是出现问题了,非常的遗憾:在重启的时候出现了一个让人头疼的问题,停留在如下位置。

temp

     又是一顿谷歌、百度,功夫不负有心人,费尽千辛万苦终于在http://patchwork.kernel.org/patch/37444/网页中找到了解决方案。

    问题出在了CONFIG_SYSFS_DEPRECATED_V2这个选项上了。

    解决办法如下:
    编辑内核源码包里面的.config文件.
    CONFIG_SYSFS_DEPRECATED_V2=y #默认该选项为not set,被注释掉的. 
    最后不要忘记重新编译一遍内核哦。

     OK,大功告成!赶快重启,看看升级后的2.6内核吧!

   希望大家都能一次成功哦!

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值