EBB-16、内核编译

内核编译

(一)什么是内核

内核也是程序。它是操作系统最基本的组成部分。其他程序

通过调用内核提供的接口调用物理设备完成具体的工作。

(二)linux内核

1、/boot/vmlinuz.x.x.x是当前系统使用的内核文件。该

文件会在开机过程中被读入引导启用我们所使用的操作

vmlinuz.x.x.x文件本质是经过bzip2压缩的内核

clip_image002

clip_image004

2、主版本号后的次版本分为单数系和双数系

1)单数系:用来测试的版本,如2.5

2)双数系:稳定的版本,如2.6

3、获取linux内核的渠道

1)“公版内核”的源码可访问www.kernel.org下载。

2)"发行版内核"可以去发行版的开源社区下载

Redhat修改的内核源码可访问ftp.redhat.com下

载。但是,下载的是srcrpm包,还需要进行编译或

提取才可使用。

4、升级内核的原因

1)需要新的功能

例如RHEL5默认内核中没有加入对ntfs文件系统的支持

2)需要定制内核(增加功能和裁剪)

3)改进稳定性

4)修补漏洞

注意:如果没有以上特别的需要,通常无需频繁更新内核。特别是在生产环境中,我们追求的是稳定性,而不是赶时髦!

5、如何定制或升级内核

方法一: rpm或yum命令升级内核

必须是RHEL付费用户或CentOS这类发行版的用户才可以方便的使用此种方式

方法二:使用“公版”内核源码编译升级

redhat发行版为了追求稳定性,往往内核版本较低。使用公版可以更新最新版本的内核,但是相对的redhat为内核所做的那些稳定性和优化补丁就会丢失。

1)访问www.kernel.com,

注意不建议升级到3.8跨大版本的升级,建议在版本

范围内进行相应的升级。

clip_image006

点击tar.xz下载。

clip_image008

下载完毕。

tar.xz文件的解压:

首先需要下载xz工具,

http://tukaani.org/xz/xz-4.999.9beta.tar.bz2

安装:

1>tar -jxvf xz-4.999.9beta.tar.bz2

2>cd xz-4.999.9beta

3>./configure --prefix=/

4>make

5>sudo make install

解压方法:

1>xz -d **.tar.xz

2>tar -xvf **.tar

2)将内核文件拷贝到/tmp目录下并解压

clip_image010

执行tar -xvf linux-2.6.32.60.tar,切换到

linux-2.6.32.60目录下,即可显示linux内核的源代码

clip_image012

3)编译内核的方式

(1)make config 在字符界面下以一问一答的形

式让用户选择linux kernel中的各项

编译参数的选择。

缺点是需要选择的参数多;并且一旦

选择错误无法更正。

(2)make xconfig 图像界面的内核编译选择程序。

由于生产环境中的服务器不安装

xwindow图像界面,所以一般无法使用

(3)make menuconfig 最为常用的内核编译选择程序。

在字符界面下开启一个为图像界    
面帮助用户进行选择。

如果显示过小会提示错误,

Your display is too small to run Menuconfig!

It must be at least 19 lines by 80 columns.

解决方法是将Terminal字体改小.

clip_image014

linux内核是对各项硬件设备支持和相应功能模块的组成。

注意:linux的内核升级变化迅速,并且不同版本的linux相应

的选单内容也会发生变化。所以不能以某个版本的文档为

标准。对内核的详细变迁了解以官网的发布为准。

file systems 文件系统相应的支持

该程序的使用方式:

<1> ← → 控制select(选择)和exit(退出或返回上一级)

help(相应选项的帮助)

clip_image016

<2> ()或者<>表示该选项可以被选择成为模块,也可以编译进内核。

<3> 编译内核选择功能时有两种方式:

一种是直接编译进内核内部:

另一种是编译成模块,模块在内核应用到时加载

注意:不是所有选项都可以编译进内核和模块两种的。

<>表示的既能编译进内核的基本组成部分,又能编译成

模块的;<>首次选中显示M,表示二者都可。

再次选中显示*,表示把该选项编译进内核

内部,不把它编译成模块。

[]选择后[]内变成*显示的,表示只能编译进内核内部,

不能编译成模块

clip_image018

经验:由于内核需要选择的选项非常多,容易造成漏选或误选,

导致内核编译失败,无法正常使用。

避免方法:当执行make menuconfig修改相应选项后,

在内核的源代码中会显示.config文件

clip_image020

.config文件是配置文件,记录着对当前内核

编译的选项。

clip_image022

当前正在使用的内核,配置文件默认放在/usr/src/kernels/目录下,

clip_image024

该目录下基本为空。因为redhat出于商业目的只提供linux内核的源代码架构,不提供内容。但受制于GPL协议,所以以相应的src rpm包(源代码rpm包)的方式发布到其官方网站上,使用时需到redhat官网上下载再编译成源代码包或rpm包才能再编译使用。

将.config文件拷贝到/tmp/linux-2.6.32.60目录下

clip_image026

按照习惯,我们一般将linux内核文件放在

/usr/src/kernels/2.6.18.194.el5-i686目录下,现在将

内核文件移动到该目录下

clip_image028

然后cd linux-2.6.32.60/,重新执行make menuconfig,然后把.config这个配置文件读取进来,

clip_image030

默认就是.config,点击OK

clip_image032

可以继续其他相应功能,比如我们选择NTFS文件格式写的支持;

clip_image034

选择完毕,就可以开始编译了

现在对于linux内核的配置选项已经完成。

现在我们执行make命令开始编译,需要等待一段时间

编译完毕之后,执行make modules命令单独将内核中选择成为模块的部分再编译一次。

clip_image036

现在编译的部分已经结束,编译的结果存放在当前目录中,

clip_image038

执行make install命令安装内核,提示错误

clip_image040

因为/lib/modules/不存在对应目录,需要创建

clip_image042

再次执行make install安装。make install执行的过程:往/boot/拷贝了新的内核文件vmlinuz-2.6.32.60和

initrd-2.6.32.60.img文件

clip_image044

修改了/grub/grub.conf文件

vi /grub/grub.conf

clip_image046

然后执行make module_install安装模块(当前目录必须在/usr/src/kernels/linux-2.6.32.60/)

clip_image048

重新启动计算机,内核选项会出现2.6.32.60选项,进入系统,内核升级完成。

clip_image050

注意:虚拟机升级会出现失败。

方法三:使用RedHat发布的SRCRPM包编译升级

访问ftp://ftp.redhat.com/

clip_image052

点击redhat clip_image054,点击linux clip_image056,点击

enterprise clip_image058,点击5server clip_image060,点击en clip_image062

点击os clip_image064,点击SRPMS clip_image066

现在如果我们不仅需要使用reahat发布的内核,又要编译出

新的功能模块。我们必须到redhat官方网站的这个目录下下

载对应内核版本的src rpm包进行编译。从里面获取相应的

源代码程序;然后再进行编译。

执行uname -a获取我们现在使用的内核版本

clip_image068

回到网站的目录下搜索相应本版的内核

点击clip_image070下载,下载完毕进入下载目录

clip_image072

现在我们从redhat发布的

kernel-2.6.18.-194.26.1.el5.src.rpm包中提取redhat内核源代码,并且进行编译

执行rpm -ivh kernel-2.6.18-194.26.1.el5.src.rpm安装,安装的目录是/usr/src/redhat/

clip_image074

该目录下有5个目录,这5个目录又被称为构建rpm的工厂。

SOURCES 目录放置的是构建rpm包的源代码包程序;

clip_image076

其中linux-2.6.18.tar.bz2文件是linux公版的内核

clip_image078

.patch文件是redhat为公版内核打的补丁。

所以如果需要redhat已经打过补丁的linux源代码,需要先把linux-2.6.18.tar.bz2解压得到公版的内核源代码,然后执行patch命令将补丁逐个打到源代码包内。

但是patch文件数量非常多。

SPECS目录下的kernel-2.6.spec文件描述了构建rpm包所经历的各种步骤,其中包括将这些源代码进行解包和打补丁的整个过程。

clip_image080

利用kernel-2.6.spec文件帮助我们做完解压缩源代码包再打补丁的过程,而不需要生成rpm包。

如果利用该文件制作rpm包,内核需要反复编译4次,非常耗费时间,没有必要编译完整个内核生成rpm包;只需要提取源代码程序即可。

rpmbuild -bp kernel-2.6.spec --target=i686

构建rpm包 制作成i686的版本

-b 创建

p (prepare)前期准备

clip_image082

编译完毕,进入BUILD/kernel-2.6.18/linux-2.6.18.i686/目录,该目录存放的就是redhat发布的打过补丁的内核。

clip_image084

接下来编译的步骤和linux公版的内核编译相同

执行make menuconfig,选中相应的选项,然后执行make命令开始编译。

生产中,如果需要对内核模块做一些新的变化,如增加一个功能,一般无需将内核完全编译,只需要下载相对应内核版本的src rpm包,解压出rpm包,编译指定的模块即可。

你可能感兴趣的:(linux,操作系统,程序,内核,vmlinuz)