内核编译介绍

来源:互联网 发布:歼-20知乎 编辑:程序博客网 时间:2024/06/16 04:50

内核简介

内核,是个操作系统的核心。他负责管理系统的进程、内存、设备驱动程式、文档和网络系统,决定着系统的性能和稳定性。

Linux的一个重要的特点就是其源代码的公开性,任何的内核源程式都能够在/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计的,您都能够获取相应的源程式代码。全世界任何一个软件工程师都能够将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速连同对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。

想象一下,拥有了内核的源程式对您来说意味着什么?首先,我们能够了解系统是如何工作的。通过通读源代码,我们就能够了解系统的工作原理,这在Windows下简直是天方夜谭。其次,我们能够针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重新编译内核。在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。再次,我们能够对内核进行修改,以符合自己的需要。这意味着什么?没错,相当于自己研发了一个操作系统,但是大部分的工作已做好了,您所要做的就是要增加并实现自己需要的功能。在Windows下,除非您是微软的核心技术人员,否则就不用痴心妄想了。

内核版本号

由于Linux的源程式是完全公开的,任何人只要遵循GPL,就能够对内核加以修改并发布给他人使用。Linux的研发采用的是集市模型(bazaar,和cathedral--教堂模型--对应),为了确保这些无序的研发过程能够有序地进行,Linux采用了双树系统。一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或研发树(development tree)。一些新特性、实验性改进等都将首先在研发树中进行。假如在研发树中所做的改进也能够应用于稳定树,那么在研发树中经过测试以后,在稳定树中将进行相同的改进。一旦研发树经过了足够的发展,研发树就会成为新的稳定树。研发数就体现在源程式的版本号中;源程式版本号的形式为x.y.z:对于稳定树来说,y是偶数;对于研发树来说,y比相应的稳定树大一(因此,是奇数)。到现在为止,稳定树的最高版本是2.2.16,最新发布的Redhat7.0所采用的就是2.2.16的内核;研发树的最新版本是2.3.99。也许您已发现和多网站上都有2.4.0-test9-pre7之类的内核,但是这并不是正式版本。内核版本的更新能够访问http://www.kernel.org

为什么重新编译内核

Linux作为一个免费软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。假如用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。

 通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。

为了正确的合理地配置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:

l自己定制编译的内核运行更快(具备更少的代码)。

2系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)。

3无需的功能编译进入内核可能会增加被系统攻击者利用的漏洞。

4将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些。

内核编译模式

要增加对某部分功能的支持,比如网络之类,能够把相应部分编译到内核中(build-in),也能够把该部分编译成模块(module),动态调用。假如编译到内核中,在内核启动时就能够自动支持相应部分的功能,这样的长处是方便、速度快,机器一启动,您就能够使用这部分功能了;缺点是会使内核变得庞大起来,不管您是否需要这部分功能,他都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。假如编译成模块,就会生成对应的.o文档,在使用的时候能够动态加载,长处是不会使内核过分庞大,缺点是您得自己来调用这些模块。

新版本内核的获取和更新

Linux内核版本发布的官方网站是http://www.kernel.org,国内各大ftp上一般都能够找到某些版本的内核。新版本的内核的发布有两种形式,一种是完整的内核版本,另外一种是patch文档,即补丁。完整的内核版本比较大,比如linux-2.4.0-test8.tar.bz2就有18M之多,网速快的用户能够下载使用。完整内核版本一般是.tar.gz.tgz)文档或是.bz2文档,二者分别是使用gzipbzip2进行压缩的文档,使用时需要解压缩。patch文档则比较小,一般只有几十K到几百K,极少的会超过1M,网速慢的用户能够使用patch文档来升级内核。但是patch文档是针对于特定的版本的,您需要找到自己对应的版本才能使用。

具体操作

下载内核源代码

编译内核需要root权限,以下操作都假定您是root用户。请把您需要升级的内核拷贝到/usr/src/下(下文中以2.4.0test8的内核的linux-2.4.0test8.tar.gz为例),命令为:

#cp linux-2.4.0test8.tar.gz /usr/src

让我们先来查看一下当前/usr/src的内容,注意到有一个linux的符号链接,他指向一个类似于linux-2.2.14(对应于您现在使用的内核版本号)的目录。首先删除这个链接:

#cd /usr/src

#rm -f linux

现在解压我们下载的源程式文档。假如所下载的是.tar.gz.tgz)文档,请使用下面的命令:

#tar -xzvf linux-2.4.0test8.tar.gz

假如您所下载的是.bz2文档,例如linux-2.4.0test8.tar.bz2,请使用下面的命令:

#bzip2 -d linux-2.4.0test8.tar.bz2

#tar -xvf linux.2.4.0.test8.tar

现在让我们再来看一下/usr/src下的内容,您会发现现在有了一个名为linux的目录,里面就是我们需要升级到的版本的内核的源程式。还记得那个名为linux的链接么?之所以使用那个链接就是防止在升级内核的时候会不慎把原来版本内核的源程式给覆盖掉了。我们也需要同样处理:

#mv linux linux-2.4.0test8

#ln -s linux-2.4.0test8 linux

这样我们也有了一个名为linux的符号链接,就不用担心以后会把他覆盖掉了(也许您会觉得重新建立linux的符号链接没有必要,但实际上这是必不可少的,下文中会有介绍)。假如您还下载了patch文档,比如patch-2.4.0test8,您就能够进行patch操作(下面假设patch-2.4.0test8已位于/usr/src目录下了,否则您需要先把该文档拷贝到/usr/src下):

#patch -p0 < patch-2.4.0test8

现在,我们已把内核源程式升级到最新版本了。

编译前准备

通常要运行的第一个命令是:

cd /usr/src/linux;

# make mrproper

该命令确保源代码目录下没有不正确的.o文档连同文档的互相依赖。由于我们使用刚下载的完整的源程式包进行编译,所以本步能够省略。而假如您多次使用了这些源程式编译内核,那么最好要先运行一下这个命令。

确保/usr/include/目录下的asmlinuxscsi等链接是指向要升级的内核源代码的。他们分别链向源代码目录下的真正的、该电脑体系结构(对于PC机来说,使用的体系结构是i386)所需要的真正的include子目录。如:asm指向/usr/src/linux/include/asm-i386等。若没有这些链接,就需要手工创建,按照下面的步骤进行:

# cd /usr/include/  

# rm -r asm linux scsi  

# ln -s /usr/src/linux/include/asm-i386 asm  

# ln -s /usr/src/linux/include/linux linux  

# ln -s /usr/src/linux/include/scsi scsi

这是配置很重要的一部分。删除掉/usr/include下的asmlinuxscsi链接后,再创建新的链接指向新内核源代码目录下的同名的目录。这些头文档目录包含着确保内核在系统上正确编译所需要的重要的头文档。现在您应该明白为什么我们上面又在/usr/src"多余"地创建了个名为linux的链接了吧?下面就能够开始内核编译的旅程了。

内核的配置

  Linux当前支持的CPU类型包括x86ARMDEC AlphaSUN SparcM68000MIPSPowerPC等,应该说上述类型已经包括绝大多数用户使用的CPU型号。在安装与配置过程中,Linux会自动识别这些型号。

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

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

  配置内核可以根据需要与爱好使用下面命令中的一个:

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

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

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

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

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

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

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

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

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

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

 

需配置的内核参数:

(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 --->;

Fusion MPT device support --->;

<M>; Fusion MPT (base + ScsiHost) drivers

<M>; Fusion MPT misc device (ioctl) driver(这个要不要,不确定)

Device Drivers --->;Network device support --->Ethernet (10 or 100Mbit) ---><*> AMD PCnet32 PCI support

(3)File system--->(以下9个选项是关于ext2ext3文件系统配置,全部选上)

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

JBB (ext3) debugging support

File system--->DOS/FAT/NT Filesystems --->选上“NTFS file system support”;

(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

(5)网卡驱动

请务必把自己网卡对应的驱动编译进内核,比较普遍的网卡是realtek 8139,以下就是这种网卡的配置,以供参考

Device Drivers—>

Networking support—>

Ethernet (10 or 100Mbit) —>

<*> RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support (EXPERIMENTAL)

<*> RealTek RTL-8139 PCI Fast Ethernet Adapter support

(6)声卡驱动

也要选择自己声卡对应的驱动编译进内核,比较普遍的声卡是i810_audio,以下就是这种声卡的配置,以供参考

Device Drivers —>

Sound —>

<*> Sound card support

Advanced Linux Sound Architecture —>

<*> Advanced Linux Sound Architecture

<*> Sequencer support

< > Sequencer dummy client

<*> OSS Mixer API

<*> OSS PCM (digital audio) API[*] OSS Sequencer API

<*> RTC Timer support

PCI devices —>

<*> Intel i8x0/MX440, SiS 7012; Ali 5455; NForce Audio; AMD768/8111

Open Sound System —>

< > Open Sound System (DEPRECATED)

编译工作

  配置完内核,接下来需要对内核源代码文件的依赖性和完整性进行检验,并且进行编译,此时要保证系统所使用的gcc版本在gcc2.7.2以上:

  #make dep (确保关键文件在正确的位置)

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

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

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

  #make bzImage

  编译的时间与机器的硬件条件及内核的配置等因素有关,以笔者的64MB内存的赛扬300为例,编译内核一次大致需要20多分钟。所获得的内核的位置在/usr/src/linux/arch/i386/boot目录下,当然这里假设用户的CPUx86型的。

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

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

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

   # make install

  模块在系统中的标准目录位于/lib/modules/x.y.z,后面的x.y.z是版本号,为安全起见,在运行#make modulesinstall之前最好对/lib/modules进行备份。模块通常是带有扩展名.o的文件,使用命令#lsmod可以对当前内核的模块进行列表。

启动新内核

将新内核和System.map文件拷贝到/boot目录下,依次执行以下命令:

# cp /usr/src/linux-2.6.18/arch/i386/boot/bzImage /boot/vmlinuz-2.6.18

# cp /usr/src/linux-2.6.18/System.map /boot/System.map-2.6.18

# cd /boot (进入boot目录)

# rmrf System.map (删除原来的连接)

# lns System.map-2.6.18 System.map (重新建立连接)

修改Grub启动管理器

如果没有错误的话,下面开始修改grub配置文件

/boot目录下,执行以下命令:

# new-kernel-pkg --mkinitrd --depmod --install 2.6.18 (这时候你的/boot下会生成一个initrd-2.4.18.img,并且你的grub.conf文件也作了相应更改)

# df (查看根目录在那个分区,下一步要用到。注意,这里根分区不时boot的那个50M的分区,而一般是你最大的那个分区,也就是“/”,千万不要搞错哦。我的为 /dev/hda2)

# vi grub/grub.conf

进入grub.conf文件,找到如下信息:

default=1

timeout=10

splashimage=(hd0,0)/grub/splash.xpm.gz

title Red Hat Linux (2.6.18)

root (hd0,0)

kernel /vmlinuz-2.6.18 ro root= LABEL=/

initrd /initrd-2.6.18.img

做两处修改:

(1)default=1改为default=0(不改的话也可以,只不过重启之后会默认进入2.4内核)

(2)kernel行的“LABEL=/”换成根目录所在的分区(上一步查看的就是)

此步很重要,修改错误将可能导致进不去系统,我把我修改后的grub.conf文件列出来,不明之处,可以对照修改:

default=0

timeout=10

splashimage=(hd0,0)/grub/splash.xpm.gz

title Red Hat Linux (2.6.18)

root (hd0,0)

kernel /vmlinuz-2.6.18 ro root=/dev/hda2

initrd /initrd-2.6.18.img

title Red Hat Linux (2.4.20-8)

root (hd0,0)

kernel /vmlinuz-2.4.20-8 ro root=LABEL=/

initrd /initrd-2.4.20-8.img

 

总结

编译内核的具体步骤总结如下:

1、下载内核源代码

2、 清除从前编译内核时残留的.o文件和不必要的关联

cd /usr/src/linux

make mrproper

3、配置内核,修改相关参数

make menuconfig

4、正确设置关联文件

make dep

5、编译内核

make bzImage

6、编译模块

make modules

7、安装模块

make modules_install

8、编译

make install

9、修改Grub启动管理器

10 使用新内核