linux之内核编译

原博客: http://blog.csdn.net/star_xiong/article/details/17357821   作者:不会游泳的鱼star 

一、简介
内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。

本文将以kernel 3.12.5版本为实验,操作平台为RedHat 6.2,但本文所介绍的内核编译与安装方法适合大多数Linux系统(包括RedHat、Ubuntu、Debian等)。

二、下载新内核源码 
内核下载官网:https://www.kernel.org/ 
解压内核:#tar xvf linux-3.12.5.tar.xz  /opt

进入内核源码目录:#cd /opt/linux-3.12.5

 

这里解压到任何目录都行,本人解压到了/opt目录下。在网上看到很多朋友解压到/usr/src目录下,其实这都无所谓,因为本文所讲的方法并不局限于给本机新增一个内核,还有可能是给其他机器的新增内核,就算是新增本机内核那也没关系,因为后面执行#make install 自动就会将对应文件拷贝到本机相应的目录下去了。

注:下文所有关于颜色标注的“3.12.5”都替换成自己实际的内核版本号。

三、替换内核
本文介绍两种替换内核方法:编译替换内核、打包替换内核(.deb安装包)。

(一)编译替换内核
编译替换内核适合所有Linux系统,也是大多数人常用的方法。

1、定制内核
#make mrproper

作用是在每次配置并重新编译内核前需要先执行“make mrproper”命令清理源代码树,包括过去曾经配置的内核配置文件“.config”都将被清除。即进行新的编译工作时将原来老的配置文件给删除到,以免影响新的内核编译。

即检查有无不正确的.o文件和依赖关系,如果使用刚下载的完整的源程序包即第一次进行编译,那么本步可以省略。而如果你多次使用了这些源程序编译内核,则最好要先运行一下这个命令。 

 

#make menuconfig

注:使用make menuconfig 生成的内核配置文件,决定将内核的各个功能系统编译进内核还是编译为模块还是不编译。

在这里就不介绍具体的内核配置操作,但是建议就算不打算配置什么也执行一下make menuconfig这个命令,因为如果不执行此操作的话在后面make编译内核的时候会提示你回答很多问题。

内核配置可参考:

Make menuconfig配置详解:http://blog.csdn.net/xuyuefei1988/article/details/8635539

http://www.linuxidc.com/Linux/2012-06/63092.htm

 

配置内核还有很多其他方法,主要区别如下:

#make menuconfig        //基于ncurse库编制的图形工具界面

#make config         //基于文本命令行工具,不推荐使用

#make xconfig         //基于X11图形工具界面

#make gconfig        //基于gtk+的图形工具界面

这里选择简单的配置内核方法,即make menuconfig。在终端输入make menuconfig,等待几秒后,终端变成图形化的内核配置界面。进行配置时,大部分选项使用其缺省值,只有一小部分需要根据不同的需要选择。

对每一个配置选项,用户有三种选择,它们分别代表的含义如下:

<*>或[*]——将该功能编译进内核

[ ]——不将该功能编译进内核

[M]——将该功能编译成可以在需要时动态插入到内核中的代码

2、编译安装内核和模块
(1)  拷贝.confg文件:

执行#cp /boot/config-,然后按下Tab键,系统会自动填上该目录下符合条件的文件名,然后继续输入 .config,目的是使用在boot目录下的原配置文件。

不执行这一步的话,后面make的时候会提示找不到.confg文件。

如果在上一步配置了内核的话应该是会自动生成.config文件,但这里本人只是执行了一次#make menuconfig命令并没有配置内核。

(2)   建立编译时所需的从属文件:

#make dep

根据上一步所选择的选项,建立文件的依赖关系。

(3)  清除内核编译的目标文件 :

#make clean

清理一些不必要的文件,如果你在上次编译的基础上,删去了一些选项,建议你执行这一步操作,否则,就没有必要了。

(4)  编译安装内核和模块:

【本机替换内核】

1)编译内核和模块:

       #make –j4

生成内核模块和vmlinuz,initrd.img,Symtem.map文件。

注:#make相当于分别执行#make bzImage 和#make modules,由于是本机替换内核,所以无需分开执行。

这一步所需的时间较长,为了加快编译速度,我们可以加上“-j”选项,后面跟的数字是jobsnum ,建议设置为 CPU 核心数 + 1,jobsnum值可以由命令” cat /proc/cpuinfo |sed -n '/^processor/p' |wc -l”获得。

2)安装模块:

#makemodules_install

编译成功后,系统会在/lib/modules目录下生成一个3.12.5子目录,里面存放着新内核的所有可加载模块(即将编译好的modules拷贝到/lib/modules下)。

3)安装内核:

#makeinstall

即复制.config,vmlinuz,initrd.img,System.map文件到/boot目录、更新grub。对于RedHat系统以下三个grub文件自动会更新,默认启动新内核。

/etc/grub.conf

/boot/grub/menu.lst

/boot/grub/grub.conf

注:前两个配置文件是第三个的软连接。

Ubutun和Debian系统是/boot/grub/grub.conf文件。

       4)重启系统:

              #reboot

 

       【非本机替换内核】

在这里也可以像本机替换内核一样直接执行#make,但本文将编译内核和编译模块分开来执行,但原理和结果是一样的。

1)编译内核:

       #make bzImage

内核编译成功后,会在源码树根目录即linux-3.12.5/arch/x86_64/boot/目录中生成一个新内核的映像文件bzImage。

注:对于大内核(比如需要SCSI支持),make bzImage (推荐)

对于小内核,make zImage。

       2)编译模块:

       #make modules

                   编译可加载模块(即内核选项中选择为M的选项),以便将来使用insmod命令进行加载。编译时间跟M选项的数量有关。 

3)安装模块:

#make modules_install

       即将编译好的modules拷贝到/lib/modules下。

4)安装内核:

       由于不是本机替换内核,所以我们需要将新生成的内核文件拷贝到要替换内核的机器上。需要拷贝的内核文件为主要有4个,分别是:.config,bzImage,System.map 和系统/lib/modules/linux-3.12.5目录。

具体操作如下:

(1)将生成的linux-3.12.5/.config 拷贝到要替换内核系统的/boot下,并重命名为config-3.12.5

(2)将生成的linux-3.12.5/arch/x86-64/boot/bzImage 拷贝到要替换内核系统的/boot下,并重命名为vmlinuz-3.12.5(注:这里需特别注意拷贝后的文件名变为vmlinuz-x.x.x)。

(3)将生成的linux-3.12.5/System.map 拷贝到要替换内核系统的/boot下,并重命名为System.map-3.12.5

(4)将make modules_install生成的系统目录/lib/modules/linux-3.12.5 拷贝到要替换内核系统的/lib/modules下。

(5)在要替换新内核的系统的/lib/modules目录下执行以下命令:

        #update-initramfs-c -k3.12.5,生成/boot/initrd.img-3.12.5

#update-grub(或#update-grub2), 更新启动加载文件。

      注:RedHat系统貌似是没有以上两个更新命令,所以以上更新内核方法适合Ubuntu或Debian系统。

       那RedHat系统怎么更新内核呢?建议使用上一种【本机替换内核】方法直接make install安装,使用【非本机替换内核】方法不太方便,但这里也做一个介绍,我们可以手动更新内核启动文件。(当然你也可以手动下载一个grub安装包并安装,再使用update-grub)。

具体如下(将第(5)步替换成下面操作):

RedHat系统中有三个配置文件/etc/grub.conf;/boot/grub/menu.lst;/boot/grub/grub.conf

前两个都是第三个的连接,所以我们只需要修改/boot/grub/grub.conf启动配置文件即可。

内容如下:

title 显示在启动菜单上的名称

root 根文件系统挂载分区,根据自身系统而定,可以仿照旧版本内核填写。

kernel 压缩过的内核文件名

initrd 根文件系统文件名

     如:

       titleMy new kernel

         root (hd0,0)

            kernel/boot/vmlinuz-x.y.z

            initrd/boot/initrd-x.y.z.img

      

       在红帽系统上直接修改grub启动文件的方法本人没有亲试,这部分内容是参照文章http://wenku.baidu.com/view/cb16a8fdc8d376eeaeaa3126.html所写的,具体的可以看原文。

       本人系统的/boot/grub/grub.conf中新增内核内容如下:

              title Red Hat Enterprise LinuxServer (3.12.5)

              root (hd0,0)

              kernel /vmlinuz-3.12.5 orroot=/dev/……

              initrd /initramfs-3.12.5.img

 

然后重新生成ram磁盘:

如果您的系统中的/etc/lilo.conf没有使用了ram磁盘选项initrd,略过

如果您的系统中的/etc/lilo.conf使用了ram磁盘选项initrd,

使用mkinitrd initrd-内核版本号 内核版本号命令重新生成ram磁盘文件,例如我的Redhat 6.2:

mkinitrd initrd-3.12.5 3.12.5

之后把/etc/lilo.conf中的initrd指向新生成的initrd-3.12.5文件:

initrd=/boot/initrd-3.12.5

 

ram磁盘能使系统性能尽可能的优化,具体参考/usr/src/linux/Documents/initrd.txt文件

5)重启系统:

       #reboot

(二)打包替换内核
打包替换新内核使用的是make-kpkg命令,所以此方法只适合支持make-kpkg命令的系统版本,一般适合Ubuntu、Debian等系统,不适合RedHat系统。

1、定制内核
#make mrprobe ,清理源代码树。

#make menuconfig ,配置内核。

2、打包内核
(1)拷贝.confg文件:

执行#cp /boot/config-,然后按下Tab键,系统会自动填上该目录下符合条件的文件名,然后继续输入 .config,目的是使用在boot目录下的原配置文件。

不执行这一步的话,后面make的时候会提示找不到.confg文件。

如果在上一步配置了内核的话应该是会自动生成.config文件,但这里本人只是执行了一次#make menuconfig命令并没有配置内核。

(2)编译打包内核

#make-kpkg --initrd  - -append-to-version=-pyh  - -revision=zxxiong.0716 -j 4kernel_image kernel_headers

         执行完以上命令后将在上一级目录生成两个.deb包:

头文件包:linux-headers-3.12.5-pyh_zxxiong.0716_amd64.deb

       内核包:linux-image-3.12.5-pyh_zxxiong.0716_amd64.deb

      

【--initrd】选项会让make-kpkg自动帮我们生成initramfs;

【--revision】会给生成的deb文件加上一个版本信息。这个参数只是影响到文件名,如果不指定,默认会是“10.00.Custom”;

【--append-to-version】也是一种版本信息,它不仅出现在deb安装包的文件名里,也会影响到kernel的名称,比如本例中,内核更新完成之后,用“uname -r”察看会得到“3.12.5-pyh”;

【kernel_image】表示生成内核和默认模块的安装包。

【kernel_headers】这样make-kpkg会生成一个内核头文件的安装包。

如果我们用普通用户来执行make-kpkg,需要加上fakeroot运行

#fakeroot make-kpkg --initrd  - -append-to-version=-pyh  - -revision=zxxiong.0716 -j 4 kernel_image kernel_headers

 

(注:需要设置平台 如-amd64在这里配置文件已经默认配置了,所以这里不用加,选项kernel_image是生成内核.deb包,选项kernel_headers是生成头文件.deb包,这两个选项可以只使用一个)

(3)安装内核
       将上面生成的.deb包拷贝到需要替换内核的机器上,执行以下命令:

#dpkg –i linux-headers-3.12.5-pyh_zxxiong.0716_amd64.deblinux-image-3.12.5-pyh_zxxiong.0716_amd64.deb   (接上一行)

或者直接在deb包所在目录执行:#dpkg –i ./*.deb

 

       执行命令之后则会自动更新/boot目录下的文件(即自动执行命令:# update-initramfs -c -k3.12.5 和#update-grub2),然后重启系统并选定加载的内核就可以了,还可以修改/boot/grub/grub.cfg配置文件中的 set default=”0”, 默认为0,安装完后查看该文件新加载的内核是第几项就设置为几(从0开始),这样则不需要在开机时选择启动第几项了。

(5)  重启系统
#reboot

 

 

本文参考资料:

1、http://blog.csdn.net/cdsnmdl/article/details/3922513

2、http://blog.chinaunix.net/uid-26497520-id-3593098.html

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值