Bootstrap

Linux下编译内核

现在我们来学习在Linux下编译内核。
编译之前,必须知道为什么要编译内核以及内核是一个什么样的东西。
Linux操作系统包括四个部分:
实用工具集;shell;系统程序和运行期库;内核
内核所起的作用——可以为其他所有的程序以及服务提供运行环境,分配各种软硬件资源
在操作系统中,内核的作用类似于人的大脑。
由于LInux操作系统,是一个开源软件,开放所有的源代码,这为我们定制内核提供了便利条件;
在Windows操作系统中,我们常常被很多问题困扰,比如说我们的操作系统在使用一段时间之后,会发现运行速度越来越慢,操作系统所在的磁盘分区容量越来越多,但是由于windows系统不开源,我们不知道为什么会出现这种情况。不过在linux中,由于所有的内核代码都是开放的,所以只要我们有足够的能力,就可以对这个内核进行定制,以满足我们自己的需求。
这种定制包括:
我们的硬件功能很强,包括很多附加设备。但是使用的linux操作系统目前没有打开对这些功能和设备的支持,因此可以通过内核编译去获取这些功能。
反过来,如果我们的硬件功能很弱,而linux系统中自带的很多功能和硬件的支持我们都不需要,也可以通过内核定制和编译去掉这些功能以加强我们的系统性能。或者杜绝一些错误和漏洞的存在。
总之,因为linux系统中给我们提供了定制内核的条件(开源),我们就应该和有能力使用这个条件去打造适合我们自己需要的操作系统。
好了,我们知道了为什么要进行内核编译,下面来演示一下内核编译的步骤:
1.在编译之前,我们要了解当前计算机的软硬件信息。
        由于/proc目录下存储的是当前内存的运行值,其实这个文件夹不是硬盘中的数据,而是内存中的数据,因此我们可以通过
        这个目录下的文件来获得当前系统的硬件环境信息。
        比如说cpu、内存、文件系统、pci设备、版本等相关信息。
        大家看到了,我们刚才通过less命令看到了cpuinfo meminfo pci filesystem  partition version等信息
       
2.然后第二步,开始获取内核源代码包:
        内核源代码包获取分两种情况,第一种是通过在系统安装光盘中获得当前系统的内核源码,这种内核包的格式多数是rpm的
                                    第二种是通过在www.kernel.org获得更高版本的内核源码,这种内核包的格式多数是tar.gz的
        我们现在来讨论第一种方法,从光盘获取——需要挂载第二张光盘。大家刚才看到的这个37M的软件包就是内核源码包
        如果没有安装的话,我们使用rpm -ihv kernel-source-2.4.20-8.i386.rpm命令来安装,
        如果成功,该包会安装在/usr/src目录下,产生一个linux-2.4.20的文件夹,里面就是内核源码的内容
3.但是上面这一步的执行,需要系统的一些底层环境的支持,也就是说需要事前在系统中具备和安装相应的软件包。
  否则无法安装内核包,或者安装内核包之后,会在下一步操作中提示出错。
        这些软件包括:gcc ncurses make dev86 glibc-kernheader cpp binutils
        那么我们现在先来检查一下——使用rpm -qa | grep packagename就行
  好了,看来该装的软件都已经有了,所以执行rpm -ihv  kernel-source-2.4.20-8.i386.rpm就行了。

4.安装完成之后,我们的/usr/src目录里面就有了内核的源码文件:
  就是刚才显示出来的两个目录,其实都是一个目录,另一个链接文件指向的是linux-2.4.20目录,
  所以cd /usr/src   cd linux-2.4.20
5.现在开始编译:(由于2.4和2.6内核的编译方法不是完全一样,所以我们分开两种情况讨论)
  编译2.4内核:                                编译2.6内核
  第一步:make mrproper --清理内核源代码树(清理垃圾信息)        make mrproper
  第二步:make menuconfig   --配置内核以及内核模块            make menuconfig
  (相关的命令还有make config、make oldconfig、make xconfig)
                  (交互问答式)(通过旧内核生成)(图形界面下编译)
  我们在这里推荐使用make menuconfig 这

种方法操作最方便最直接 在进入内核配置菜单之后,原则上,自己有把握的可以更改,没有把握的切记不要乱改,否则会导致编译失败。 另外更改的时候,如果出现*,表示编译进入内核————随系统启动而启动 M,表示编译进入模块————不随系统启动而启动,在需要的时候调用 (一些不重要的外部驱动程序就可以作为内核模块编译,这样内核不会过大,也不会影响启动速度) 空,表示不编译进入内核也不编译进入模块————放弃这个功能,如果系统不支持这类功能,可以放弃 好了下面开始更改。 大家看到了,我改了不少。现在我都不知道能否编译成功。 但其中有一点需要注意:NTFS一定要编译进入内核而不是模块;另外,没有把握的不要乱改; 还有,内核编译我认为具有很大随机性,编译不成功很正常,比如说我现在的更改就不能保证可以成功。 完成之后,将配置起一个名字,另外最后将其保存。 最后退出的时候,提示保存,这里会将刚才的配置保存为一个名称为.config的配置文件,不管我们使用make menuconfig还是 make oldconfig、make xconfig、make config,最终都为了生成这个.config文件,以后所有的操作,就会根据这个文件中的内容进行 这个文件,存储的就是我们刚才所做的改动,可以less .config查看一下 第三步:make dep --生成依赖性关系 第四步:make bzImage --生成新内核 make (2.6内核中将左边三个步骤简化为make) 第五步:make modules --编译内核模块 这三个步骤执行的时间比较长,所以,慢慢等吧!刚才这一步是执行时间最长的一步。 第六步:make modules_install --安装内核模块 第七步:make install --安装内核
(所有的编译步骤最好在字符界面下进行,否则在图形界面下速度会比较慢) 另外上面所提到的所有步骤,任何一步完成之后都要检查有没有出错,就是有没有显示error的字样,如果显示任何一步出错都要退回到 make mrproper重来

  大家看到了,我们所有的步骤我刚才都执行完了,没有报错,似乎情况还不错。
  但是不要高兴太早,还要进行进一步测试:
  1. vi /etc/grub.conf  ---->查看是否有新的内核启动项生成(刚才带custom这一项就是新的内核启动项,这步没问题)
  2. ls /boot   ---->查看是否有新的内核文件vmlinuz生成(刚才带custom这一项就是新的内核文件,这步也没有问题)

  现在差不多行了,但是还要重启,看是否可以新的内核启动系统
  以新的启动项进入:
  看来已经可以进入系统了,但是在sendmail服务这里会比较慢应该事先将该服务关闭,不过这不会影响新的内核启动。继续等待。。。
  我现在已经成功进入系统了,那么执行uname -a 检查一下我们现在是否使用新内核:
  显示使用的内核是2.4.20-8custom,证明内核编译成功!
  大功告成!

转载于:https://my.oschina.net/pkjason/blog/126916

;