Ubuntu/Fedora 编译内核教程

来源:互联网 发布:hadoop大数据平台构建 编辑:程序博客网 时间:2024/05/17 00:45
         大部分发行版安装就自带1个linux内核, 是不需要用户自己编译的.

         那么编译1个内核到底有什么好处呢, 其实好处无非有两点:
         1. 精简内核
         通用发行版的内核特点就是兼容性好, 这里的兼容性是只硬件兼容性啦, 也就是说通用的内核集成了很多种硬件的驱动和功能,而其实绝大部分的硬件驱动和部分功能(如raid支持,偏门的文件系统格式支持)是一般家用机用不上的。
         而自己编译内核能在选项里去除这些多余的选项, 只挑选当前机器适用的硬件驱动, 往往能得到1个更精简的内核,理论上是比1个臃肿的内核更加稳定和快速的。
         再讲,对于任何软件来讲。理论上用当前机器自己编译出来的会比用其他环境机器编译出来的性能要高一点点。

         2.添加新硬件支持
         往往一些旧版本通用的内核对一些新硬件支持不足, 例如ubuntu 10.10就没有很多无限网卡的驱动, 这时可以下载1个新内核的源代码, 把该无线网卡的驱动选项选上,编译出来的新内核就支持这个新的无线网卡了。

         下面就详细介绍下两大发行版的编译内核步骤。


一, 准备内核编译工具。

         包括gcc make 和 执行make menuconfig 所需的工具。         
         Ubuntu:
                  sudo  apt-get install build-essential kernel-package   libncurses5-dev

         Fedora:
                 
sudo yum install ncurses-devel -y gcc* gcc-c++ *aclocal




二, 下载内核源代码
        
所有版本的内核源代码都能在官方网站https://www.kernel.org/pub/linux/kernel/v3.x/ 里下载得到。
         个人不建议下载最新版本的内核, 而是下载你当前发行版源里的最新内核, 例如我当前用的是mint 13 Maya(基于ubuntu 12.04) , 源里的内核是3.2.38 , 而我一开始就下载 3.8.2 版本内核源码来编译。 结果编译不出version.h 文件导致后来的闭源显卡驱动安装失败.

         后来选择3.2.38的源代码,编译安装就很顺利了。

         下载源代码包后,在任意1个目录上解压, 注意虽然源代码很小, 但是解压后足足500多MB, 编译时生成的链接文件后高达800多MB, 注意硬盘空间就ok。

          我一般放在~/Compile/kernel/ 下解压。
 
          例如我下载的源代码包是: linux-3.8.1.tar.bz2
          
          解压出来的是1个文件夹 ~/Compile/kernel/linux-3.8.1/
    
          至于具体的解压命令我就不写出来了, 如果你不会解压tar包的话我想你也没必要去编译内核的。


三, 卸载显卡驱动。
         
一般来讲, 每次更新内核后显卡驱动都要重装,否则不能进入新内核的图形界面, 通常新手编译内核很少会一次就编译出满意的新内核,所以我建议编译内核之前先把显卡驱动卸载了,方便重启测试新内核。

          如果你当前使用intel 集成显卡, 则不需要执行之个动作,因为intel显卡的开源驱动已经很好地集成在通用发行版上面了。无须卸载而且你也无法卸载。

          如果你使用ATI/AMD 显卡, 则进入/usr/share/ati 目录执行卸载脚本。
          sudo sh /usr/share/ati/amd-uninstall.sh

         
我自mx200后未用过N卡, N卡的卸载方法请自行google~


四,清理编译环境的垃圾。
          
所谓垃圾就是上一次编译产生的中间文件, 我说过几次了,一般新手总要编译几次内核的。如果你是第一次解压源代码包编译,就不需要执行这一步, 首先进入解压出来的源代码目录,然后执行下面命令
          

         Ubuntu:
                  make-kpkg clean

         Fedora:
                  make mrproper

五,编辑编译选项
          注意如果你真的是有心去优化自己的内核的话,这个是1个很费时间的过程。
          在内核源代码目录上执行:
          make menuconfig

          里面有很多选项, 具体信息可以参考我的另一些blog文章:
          http://nvd11.blog.163.com/blog/static/20001831220127259426804/

          有几个容易出错的地方,请参考这里:
          http://nvd11.blog.163.com/blog/static/20001831220132109939100/

          无非注意几个原则:

          1. 首先你要明白你的显卡,声卡,cpu, 网卡(有线or无线) 的型号信息, 起码要知道芯片的型号。 因为这些驱动都必须在内核配置里手动制定的。 具体信息可以用 lspci 或者 lsusb 或者 dmesg 命令来查看。

          2. 选上必要的选项和驱动, 什么是必要的选项, 例如你当前用的文件系统格式支持, 如果你用无线网卡就要启动wireless支持等。  驱动就更不用说了, 如果你用的是创新的核心显卡, 就必须选上创新的声卡驱动, 但是独显驱动不用执着, 那是在编译内核后另外安装的。

          3. 移除一切多余的选项和驱动, 例如raid支持, 这年代家用电脑投资raid的效果远不如投资在ssd固态硬盘上。 又比如 非x86平台支持这个选项, 只会令你的内核无谓的增大。  驱动就更加了, 内核选项里可能有100个品牌的网卡驱动, 而实际上你只需要选中你当前使用的那1个, 其余99个就移除掉吧。

六,保存配置文件。
             
       当你编辑完所有选项时记得,在主界面选最后1个选项保存你的配置, 输入1个文件名就ok了,  例如我一般保存为 kc.config.
       这样当你第二次编译时, 先make menuconfig 进入配置, 然后选倒数第二项导入之前保存的配置文件, 就可以方便地修改了,建议每一次修改都保存1个不同的文件名。
       保存完就可以退出了。 配置文件会保存到当前源代码目录下。
Ubuntu/Fedora 编译内核教程 - 饥民 - 饥民2011
 
七,激活配置文件
      
实际上,编译的时候,系统是会检索".config" 最这个文件作为配置文件的, 每次执行清理的时候会把这个文件清楚, 所以再编译前要把你保存的配置文件命名为.config

       假如我最新保存的配置文件是kc.config 则执行:
       cp kc.config .config


八,指定编译进程数量
      
这一步的作用是充分利用你的多核心cpu, 一般来讲你的cpu有多少个核心(双核4线程可以当作4核心)就设几个编译线程数量。
       Fedora不需执行这个动作, 在编译命令时加1个参数就ok了, 后面会提到。

       Ubuntu:
      
                  export CONCURRENCY_LEVEL=5

       个人建议做成1个profile, 每次重启编译内核前执行1次。

九,执行编译。

   
Ubuntu:
                time fakeroot make-kpkg --initrd --append-to-version=amd336 kernel-image kernel-headers
   
              
#注意红色部分是你自定义的版本号.. 随便起一个,不能有大些

  
Fedora:
               time make make all -j4
        
              
#红色部分是制定4个线程编译的意思。如国双核cpu就设为2吧

   
   其中time 是顺便计时的命令。
   很多人都说编译内核是1个漫长的过程, 不过根据我的实际数据, 普通的4核cpu(真的很普通的Q6600) 编译一次其实也只需要5分钟多点。

     


十,安装内核
      
Ubuntu:
             
   内核编译完成后,会自动在源代码目录的上一级目录生成两个deb包, 其中1个是内核和模块的包, 另个是头文件的包(安装闭源显卡驱动的前提), 所以需要退到上一级目录。执行:
                sudo dpkg -i linux-imagexxxxx.deb

                这个动作会自动帮你更新grub配置, 内核就安装了, 头文件的包无必要现在安装,先测试内核包无问题再安装都未迟。

    

      Fedora:    
             
fedora 编译完后并不生成安装包, 但是实际上内核文件和模块和头文件都编译出来了。只需要在当前源代码目录下执行:
              sudo make modules_install   #这一步是安装模块
             
              sudo make install          #安装内核和头文件

             
fedor执行安装命令完后系统也会自动帮你更新grub配置。


              那么内核和模块被安装在哪里呢? 实际上内核是被安装在/boot 里, 而模块是被放到/lib/modules/<对应版本folder>/ 下
              所以执行ls -lh /boot 能查看你编译出来的新内核, 如下图 我自己编译的新内核足比fedora 18自带的小25%哦:
              
            

Ubuntu/Fedora 编译内核教程 - 饥民 - 饥民2011


十一, 重启测试新内核
        
内核安装就可以重启了, 重启后会见到grub菜单多了1个你编译的内核选项,  选上他启动就可以测试了

         那么测试什么呢, 最主要测试两大部分:

         1. 测试你机器的所有硬件设备是否运作正常, 着重测试声卡,网卡,摄像头.. 当然了,前提是启动成功啊, 很多人由于关键内核选项没选上导致启动失败的。

         2.查看开机日志, 看看启动失败的服务。



十二, 怎样卸载你自己编译的内核
        当你发现自己编译的内核有问题时, 则只能重启用旧内核启动,卸载你自己编译的内核并重新编译, 那么如何卸载内核呢。

        首先你要确保你当前是在旧内核启动的环境下, 可以用uname -r 来检查,否则请重启。
       
Ubuntu:
               
ubuntu是用包来安装内核的, 所以只需要用apt-get 命令来卸载自编译内核就ok了。
                忘了新内核的包名字?
                可以用如下命令来查找:
                dpkg --get-selections | grep linux 
                下面命令下载内核
               sudo  apt-get remove linux-imagexxxx  #这个动作会同时帮你把grub里的信息移除
               
              
如果你也安装了头文件的包, 请务必把header的包也卸载。

       
Fedora:
               
fedora 自编译并不是用包管理器安装的, 所以要手动删除内核和模块,并更新gurb设置,当然个人建议写成1个脚本,用root来执行就ok啦, 脚本参照下面:
                 rm -rf /lib/modules/3.8.1v2/    #删除模块
                 ls /boot/*v2* | xargs rm           #删除内核  注意有3个文件,注意关键字 这一步要小心
                 rm -rf /boot/grub2/grub.cfg    #删除grub配置
                 grub2-mkconfig -o /boot/grub2/grub.cfg   #重新生成grub配置

       

                好了卸载完新内核, 就可以从本文的第步重新开始啦,直到编译出满意的内核为止。
原创粉丝点击