内核只有通过以rpm包的形式才能更广泛的发布给所有用户进行自由安装,否则只是在自己本机进行了编译安装,其它的用户是不能使用你的内核的,rpm包就像windows的应用程序安装文件一样,你通过制作rpm包,把自己定制好的内核以一种通用的便捷的方式共享开来。上面章节我们已经熟悉并举例实战了如何进行内核定制与编译,如何给内核打补丁,并且专门在centos6.2内核编译一节中完整的讲述了一下整体过程,并已经提到如何给内核制作rpm包,下面我们详细介绍一下内核rpm包的制作与安装。
我们首先看一下什么是rpm,然后介绍rpmbuild命令,该命令就是redhat开发的一款用于制作rpm包的强大的命令工具。
首先看一下什么是rpm,rpm是redhat开发的一款软件包管理器,全称是RedhatPackage Manager,即RPM软件包管理器,centos就是使用rpm来管理安装应用或者内核软件包的,其它的发行版本如suse使用的是dpkg管理器,其功能其实都是一样的。rpm这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准了。作为一个软件包管理工具,RPM管理着系统已安装的所有RPM程序组件的资料。我们也可以使用RPM来卸载相关的应用程序。下面列举了几个常用的参数选项,大家有选择的进行学习和使用即可:
-vh:显示安装进度;
-U:升级软件包;
-qpl:列出RPM软件包内的文件信息;
-qpi:列出RPM软件包的描述信息;
-qf:查找指定文件属于哪个RPM软件包;
-Va:校验所有的RPM软件包,查找丢失的文件;
-qa: 查找相应文件,如 rpm -qa mysql
介绍完rpm的小知识,我们进一步介绍rpmbuild命令,从命名上大家应该
就能知道这个命令就是辅助我们进行rpm包管理的工具,在前面我们已经知道了使用rpmbuild –bp选项进行源码解压缩和打补丁安装内核源码,以及见识过rpmbuild –ba命令帮助我们进行rpm包的制作,下面我们详细介绍一下这个命令和相关的知识。
首先看看rpmbuild命令其它常用的选项解释,大家可以选择性学习和查阅:
-bp 只作准备 (解压与打补丁)
-bc 准备并编译
-bi 编译并安装
-bl 检验文件是否齐全
-ba 编译后做成*.rpm和src.rpm
-bb 编译后做成*.rpm
-bs 只做成*.src.rpm
如上rpmbuild命令中的-ba选项用于构建rpm包,这个命令的运行需要配置自己的工作目录,就像我们在windows上添加环境变量一样,可以通过修改$(HOME)/.rpmmacros,指定其默认工作目录,在centos6.2编译一节中已经做过介绍,一般可以指定目录到/usr/src/redhat,此目录下一般有下面几个子目录:
BUILD:编译rpm时的编译路径
BUILDROOT:编译rpm包完成后的临时安装路径
SOURCES:存放源码包、patch文件、配置文件等,都属于资源
SPECS:spec文件存放路径
RPMS:二进制包文件存放路径,rpm包打存后,存放在此
SRPMS:源码包文件存放路径,srpm包生成后,存放在此
在SPECS下面我们安装完.src.rpm源码包后会看到.spec文件,这个文件非常重要,它里面写了大量的配置信息步骤,用于指导rpmbuild命令的操作过程,如下当我们敲rpmbuild命令配合以下选项时,会按照spec中各个部分进行build:
-bp
-bc
-bi
-bl
-ba
-bb
-bs
其他使用项:
--buildroot DIRECTORY 指定目录建立包,默认为/usr/src/redhat/BUILDROOT
--clean 构建完成后清除BUILD目录下的文件
--nodeps 构建时不检查建立包时的关联文件
--rmsource 构建完成后清除sources文件
--rmspec 构建完成后清除spec文件
--target=x86_64 指定rpm的使用平台
--with=
--without=
Spec文件是整个RPM包构建的核心,包含建立一个RPM包必需的信息,包括哪些文件是包的一部分以及她们安装在哪个目录下。我们这一节会概要性介绍内核规范文件的内容,大家也是选择性阅读,因为spec文件在内核编译中不会进行大范围修改,往往只需要掌握如何修改内核名字或者加入新的patch即可。
其文件内容格式如下,以编译kernel rpm包为例我们认识以下内核的spec文件:
² 文件头
文件头中定义kernel包的名称、版本号等;包含RPM包的功能描述、软件版本、版权信息、所属的包组等。
² 信息描述节
Summary:软件包描述信息
Name: 软件包名称(基名)
Version:RPM包中软件版本号
Release:RPM包本身版本号
License:可以给出许可术语(如:GPL、Commercial、Shareware)
Group: 标识软件类型
SOURCE0/SOURCE1等:源文件,可列出多个,常为tar包
PATCH0/PATCH1等:patch文件,可列出多个
RPM的宏:%{name}、%{version}等,可扩展成rpm名称和版本等
注:不要在SOURCE中包含任何路径,默认在/usr/sre/redhat/SOURCES中寻找文件(可在~/.rpmmacros中指定工作路径:%_topdir /usr/src/redhat)
信息描述 - 在这里可以提供RPM包中的软件更为详细的描述信息,可以解释这个软件包做什么的,也可以描述任何警告或者附加的配置指令,可以通过rpm –qi 查询此软件包的这个信息。
² prep节- Prep节解压源码包,如果对内核有做修改,还会进入解压的路径中,给内核代码打patch;
² Build节- 前缀%build,一般由make命令组成,用于程序的编译。在内核编译规范中Build节会执行make、make modules命令,编译内核;
² Install节- 前缀%install,一般由make install命令组成,用于程序的安装,通常需要指定一个安装的路径,在内核编译规范中Install节会执行make modules_install、make install,将编译好的最终文件放到指定路径以便打包;
² Clean节- 前缀%clean,一般使用命令rm -fr $RPM_BUILD_ROOT执行清除工作
² 文件列表
以%files为前缀,指定构成包的文件的列表,可以使用rpm -ql来查看rpm包中的文件信息。使用%defattr来定义缺省的所有权,如:%defattr(0644,root,root,0755),也可以使用%attr(permissions,user,group)覆盖个别文件所有者和所有权。可以通过%doc和%config来标记文件;
%doc: 告诉rpm这是一个文档文件,安装包时如指定--excludedocs,可不安装,如果安装默认安装到/usr/share/doc/%{name}-%{release}下;
%config:告诉rpm这是一个配置文件,在软件升级时,rpm包会试图避免用rpm打包的缺省配置文件覆盖用户仔细修改过的配置文件。
注:如果在%files下列出一个目录名,RPM包会包括该目录下所有的文件。如果该目录属于一个系统目录,如/bin/ 目录,那么在卸载rpm包时就会将此目录删除,发生错误
² 改动日志- 主要描述软件的开发记录,前缀%changlog。这个段内容是为了开发人员能详细的了解该软件的开发过程的,对于包的维护极有好处。如:
%changelog* Thu Dec 8 2011 name [email protected]
- [file]change wodr to word
² 其他- 另外还有四部分,分别用于安装rpm和卸载rpm时可以指定执行命令,一般用于配置系统,备份文件,生成连接等,具体如下:
安装时
Pre:前缀%pre,可以添加一些命令,用于安装rpm包前执行
Post:前缀%post,可以添加一些命令,用于安装rpm包后执行
卸载时
Preun:前缀%preun,可以添加一些命令,用于卸载rpm包前执行
Postun:前缀%postun,可以添加一些命令,用于卸载rpm包后执行
以上主要讲解了kernel的编译以及如何生成kernel的rpm包,因为平台的限制,不同kernel的spec文件会有所区别,但是编译kerne的基本过程不变,深刻理解此过程后,制作不同的kernel rpm的过程将不会有难度。