一 认识核心,核心源码
核心是整个OS的最底层,他负责了整个硬件的驱动以及提供了各种系统所需要的核心功能,包括防火墙机制,是否支持LVM或者Quota等文件系统等,而在开机流程中,MBR内的loader加载核心档案来驱动整个系统的硬件,所以说,如果你的核心不认识某个最新的硬件,那么该硬件也无法被驱动,当然也无法使用这个硬件。
计算机真正在工作的东西是硬件,例如数值计算要使用CPU、数据存储要使用硬盘,图形显示要使用显示适配器,链接internet要使用网卡等,那么如何控制这些硬件呢,那就是核心的工作,也就是说,你想要计算机达成各项工作,需要透过核心来控制计算机使它工作。例如,你想要有某个网络功能,例如防火墙机制,但是你的核心忘了加入这项功能,无论你怎么设定该网络套件都不会工作。如果你开发出一个全新的硬件,但是核心无论是windows还是linux都不支持,那么无论你用什么系统这些硬件都无用武之地。
核心实际上就是系统上的一个档案而已,这个档案保罗了驱动主机的侦测程序与驱动模块,这个档案通常被放置成/boot/vmlinuz。如果一个主机上有多个核心档案,甚至一个distribution上放置多个核心,然后这些核心做成多重引导。
二、核心模块的用途
因为现在硬件更新速度快,如果我的核心比较旧但我换了新的硬件,那么这个核心肯定无法支持,这时候可以下载一个新的核心重新编译,但是编译核心的过程是很麻烦跟很久的,所以linux采用了模块化设定,就是将一些不常用的类似驱动程序的东西独立出核心,编译成模块,然后又核心可以在系统正常运作的过程中再加载这个模块到核心,这样,不需要再更更变核心的前提下只需要编译出适当的核心模块并加载他,就可以使用这个硬件了,模块都放在/lib/modules/$(uname -r)/kernel中
三、驱动程序
现在我们知道硬件的驱动程序可以编译成为核心模块, 可以在不改变核心的前提下驱动你的新硬件,但是很多时候最新硬件的驱动程序总是慢了几步,所以觉得好像linux的支持度不足,实际上,硬件厂商要提供驱动程序
四、编译核心
首先从http://www.kernel.org下载你想要你核心,例如我下载的是linux-2.6.32.tar.bz2
1 解压,一般解压到到/usr/src/kernel下面就可以 tar -jxvf linux-2.6.32.tar.bz2 -C /usr/src/kernels
进入到解压后的目录看下,下面有这么一些东西:
2 保持干净原始码: make mrproper
因为我们不清楚下载下来的原始码是否保留.o的目标档案及相关的配置文件存在,所以需要处理掉这些目标档案以及配置文件
3 开始挑选核心功能: make XXconfig
在/boot/下面有咦config-xxx的文档,其实就是核心功能列表文件,接下来的步骤就是要做出这个文件,而后我们要进行的编译动作,也是通过这个档案来处理的,核心功能的挑选,最户会在/usr/src/kernels/linux-2.6.32下面产生一个.config隐藏档案。这个档案就是/boot/config-xxx啦,我们可以通过make menuconfig、make oldconfig 等来产生这个档案,一般我们就是使用make menuconfig ,执行完 make menuconfig后,会出现下面的界面
我直接按照默认的设置了,点save as a config file (想仔细配置各个功能可以参考鸟哥的私房菜)
4 核心的编译(make)与安装(makemodules_install)
4.1 编译:可以先使用make help 查看下有哪些可以比哪一参数,因为我们/boot/底下的核心档案,都是经过压缩后的核心档案,所以比较常用的是使用bzImage及modules
执行的命令 make clean <==先清除暂存档
make bzImage <==先编译核心
make modules 《== 再编译模块
上面的编译动作会花很长时间,最后制作出来的数据放在/usr/src/kernels/linux-2.6.32目录下,当核心编译好后是放在/usr/src/kernels/linux-2.6.32/arch/x86/boot/bzImage里边,这就是我们的核心档案,等待make modules完成后,就可以执行下面了
4.2 模块安装
强调一点,我们知道模块是放在/lib/modules/$(uname -r)下面,如果同一个版本的模块被反复编译后来安装时候,两个版本一模一样,模块放置目录会一样此时就会产生冲突,有2个解决方法:(1) 先将旧的模块目录更名,然后安装核心模块到目标目录去 (2)在 make menuconfig时候,那个General setup 内的local verision修改为新的名字,我们推荐使用第二种。
好了 安装只需要执行一个 make modules_install 这时候你就可以查看下 /lib/modules下的东西
4.3 核心安装与多重选单(grub)
我们知道核心档案放置在/usr/src/kernels/linux-2.6.32/arch/x86/boot/bzImage但是实际上系统核心理论上应该放在/boot下,且为vmlinux开头。
所以我们要做的是先移动核心到/boot下且保留旧核心档案,同时将配置文件也拷过去
5 建立相应的initrd
因为sata磁盘支持的功能并没有直接编译到核心去,所以要使用initrd来加载才行,下面方法来建立initrd
mkinitrd -v /boot/initrd-2.6.32.img 2.6.32
6 编译开机选单
vim /boot/grub/menu.lst有的是/etc/grub.conf反正都是链接向/boot/grub/grub.conf
对照上面已经有的核心(因为我之前就有两个核心了)编译打黑的那几行,只要将你的核心名称改了就好,这样后就可以在启动系统时候选择想要进入的核心了。
*****************************************************************************************************************************************************************
华丽丽分割线
在使用过程中弄过好多次内核编译,经过实践发现可以直接用更简单的步骤,
1 当然还是解压
2 make mrproper
3 make menuconfig
4 make clean
5 make(这一步将创建镜像及make modules一步做了)
6 make modules_install
7 make install(这一步将后面的动作都给自动的做了,包括创建initrd,改写grub等)
一般从第四步make clean 开始的后面步骤,写到一个脚本里,然后执行脚本,就去吃饭了