RPM 简介
RPM包管理器(RPM Package Manager,RPM)是一个功能强大的包管理系统,它能够:
- 将计算机软件从源代码构建为易于分发的软件包
- 安装、更新和卸载套装软件
- 查询有关打包软件的详细信息,无论是否已安装
- 验证打包软件的完整性以及由此产生的软件安装
理论先行
准备构建 RPM
规划需要构建的内容
在这一步,需要知道要将哪些内容打包成 RPM,是应用程序或补丁、编程库、系统配置文件或者是文档包?大多数情况下,我们需要创建一个源码包( source package)和一个二进制包(binary package)。二进制包包含可以在其它系统安装的 RPM,源码包可以随时重新创建二进制包,前提是已经定义了源 RPM(source RPM)。
收集要打包的软件
收集要捆绑到 RPM 中的软件,这包括应用程序或要打包的库以及程序源代码。一般来说包含以下情况:
- 打包自己的软件
- 打包别人的软件
- 在第一次定制或修补软件后打包其他人的东西
创建软件的可复制版本
RPM 系统将自动执行创建应用程序的步骤,只要您配置 RPM 使用适当的步骤,例如使目标运行。不幸的是,配置适当的步骤并不总是容易的。因此,在尝试创建RPM之前,您需要弄清楚如何构建您计划打包到RPM中的应用程序或库。一旦您弄清楚如何构建应用程序或库,您可以设置可重复生成。然后,RPM系统可以自动执行此操作建立。
要构建软件,您需要使用各种Linux工具。您需要的特定工具很大程度上取决于原始软件的来源。了解这些软件的常用技术如下:
-
拆包软件,包括 tar、tar.gz、zip 等
-
阅读 README 文件,包括 README 文件可能的变体,INSTALL 及其变体文件
-
适用 Linux 构建工具构建程序,通常在 Linux,我们可能使用 make 工具,但前提是需要创建正确的 Makefile 文件,通常有以下几种方法:
-
手段创建,下载一个程序并找到这样的文件如 Makefile.amiga、Makefile.Solaris 和 Makafile.Linux,然后根据系统架构复制为 Makefile
-
imake,使用 ImakeFile 的配置文件,应用于基于 X Window 应用程序或操作系统,并大多数情况下自带通用构建脚本:
# 找到 ImakeFile 文件后,运行下面的命令来构建程序 xmkmf make make install # xmkmf 是用于创建 Makefile 文件的脚本 # 如果 xmkmf 不可用或者不起作用,可能需要执行下面的命令 make Makefile # 存在多个源代码目录时,可以执行 make Makefiles # 了解更多:http://www.dubois.ws/software/imake-stuff/
-
配置脚本,configure 脚本输出一个特定于平台的 Makefile
# 如果在源文件中看到一个名为 configure 的文件,运行下面的命令来构建程序 ./configure make make install # configure 脚本由一组工具(包括 automake 和 autoconf)创建 # 这些工具使用通常名为 configure.in 和 makefile.am 的通用文件以及其他文件来创建通用配置脚本 # 通常情况下 configure 需要接收参数,比如 --prefix,用来指定构建应用程序的根目录 # 更多: https://www.airs.com/ian/configure/
-
构建 Perl 模块
# 如果在源码中看到一个 Makefile.PL 的文件,需要运行这些命令来构建应用程序或模块 perl Makefile.PL make make test make install
-
规划升级
以 RPM 格式打包的任何应用程序或库都可能在某个时候得到升级。当这种情况发生时,您需要创建一个新的 RPM。这个新的 RPM 不仅必须处理软件包的安装,还必须处理任何升级问题。您需要考虑以下问题:
- 如何安装新版本软件的RPM。是否有任何必要的安装脚本?
- 如何删除以前的 RPM 软件包。如果您的软件包具有安装脚本,则可能需要卸载脚本,用于彻底删除安装脚本对系统所做的任何更改。RPM系统处理包中文件的删除。您需要处理在安装过程中撤消对系统所做的任何更改的任务。
勾勒出任何依赖关系
执行 make 的时候,必须保证包含了所有的依赖项。在大多数情况下,我们不希望在 RPM 中包含依赖项。相反,每个依赖项每个必要的库都应该有自己的 RPM。在许多情况下,您应该能够找到 RPM 对于这些依赖关系,并跟踪提供依赖项的包。
构建 RPM
构建 RPM 需要由 rpmbuild 命令来完成。构建 RPM,请执行以下步骤:
- 设置目录结构
- 将源代码放在正确的目录中
- 创建一个 spec 文件,告诉 rpmbuild 命令执行什么操作
- 构建源 RPM 和二进制 RPM
设置目录结构
目录 | 使用 |
---|---|
BUILD | rpmbuild 命令在此目录中构建软件 |
RPMS | rpmbuild 命令将其创建的二进制 RPM 存储在此目录中,通常包含许多特定于体系结构的子目录,包括 athlon、i386、i486、i586、i686、noarch |
SOURCES | 将应用程序的源代码放在此目录中 |
SPECS | 将计划创建的每个 RPM 的 spec 文件放在此目录中 |
SRPMS | rpmbuild 命令将源 RPM 放置在此目录中 |
默认情况下,Red Hat Linux 系统期望在 /usr/src/redhat 目录中构建 RPM,这个目录显然是特定于 Red Hat Linux 的。在其他 Linux 发行版上,您可能会看到其他目录。
首先,使用系统目录来构建 RPM 似乎很奇怪。但请记住,RPM系统最初是为创建 Linux 发行版而构建的(可以通过修改 rpmrc 设置更改默认目录)。
目前,最简单的方法是切换到 /usr/src/redhat 目录并从该位置开始工作。首先,您需要更改这些文件的所有权或权限,以便您可以在以普通用户身份登录时构建RPM。不要在以 root 身份登录时构建 RPM。如果您以 root 身份登录,则构建包时的错误可能会导致严重的后果。
要构建RPM,实际上只需要两件事:
- 源码放入 SOURCES 目录中
- spec 文件放入 SPECS 目录中
将源码放在目录中
最好的策略是从自己创建的目录开始,从源代码创建 tarball(package-version.tar.gz)文件,然后将 tarball 文件复制到 /usr/src/redhat/sources 目录。
创建 spec 文件
spec(Specification File)文件定义了 rpmbuild 命令构建应用程序时应执行的所有操作,以及 rpm 命令安装和删除应用程序所需的所有操作。每个源 RPM 都应具有构建二进制 RPM 所需的规范文件。
在 spec 文件中,使用特殊语法设置软件包上信息的格式。此语法定义如何构建包、版本号、依赖关系信息以及您可以查询的有关包的其他所有内容。根据 spec 文件中的部分,此语法略有不同。以下部分介绍了这些规范文件部分以及每个部分中的必要语法。
-
The introduction section
简介部分包含有关软件包的信息,即rpm-qi命令所显示的信息类型。例如:
Summary: java source to bytecode compiler %define version 1.17 Copyright: IBM Public License, http://ibm.com/developerworks/oss/license10.html Group: Development/Languages Name: jikes Prefix: /usr Provides: jikes Release: 1 Source: jikes-%{version}.tar.gz URL: http://ibm.com/developerworks/opensource/jikes Version: %{version} Buildroot: /tmp/jikesrpm %description The IBM Jikes compiler translates Java source files to bytecode. It also supports incremental compilation and automatic makefile generation, and is maintained by the Jikes Project: http://ibm.com/developerworks/opensource/jikes/
此示例来自真实的 RPM 规范文件。它并不遵循创建 RPM 的所有规则。此示例
- 不应显式提供包的名称
- 不应包含版权标记,因为此标记已被弃用
- 配置 %define,执行 rpmbuild 命令可以为创建版本宏
-
The prep section
prep(prepare)部分定义了准备构建所需的命令。如果你从源代码的压缩 tar 存档(tarball)开始,prep部分需要提取文件。
%prep %setup -q
此示例使用 %setup RPM宏来提取文件。
-
The build section
spec 文件包含构建软件的命令,通常,这将只包括几个命令,因为大多数实际指令都出现在 makefile 中。例如:
%build ./configure CXXFLAGS=-O3 --prefix=$RPM_BUILD_ROOT/usr make
Build 部分以 %build 语句开头。
-
The install section
spec 文件install 部分包含安装新构建的应用程序或库所需的命令。在大多数情况下,您的安装部分应该清除 BuildRoot 目录并运行 make install命令。例如:
%install rm -fr $RPM_BUILD_ROOT make install
install 部分以 %install 语句开头。
-
The clean section
clean 部分清理其他部分中的命令创建的文件:
%clean rm -rf $RPM_BUILD_ROOT
clean 部分以 %clean 语句开头。
-
The files section
files 部分列出了要进入二进制 RPM 的文件,以及已定义的文件属性。例如:
%files %defattr(-,root,root) /usr/bin/jikes %doc /usr/doc/jikes-%{version}/license.htm %doc /usr/man/man1/jikes.1*
files 部分以 %files 语句开头。
%doc 宏将某些文件标记为文档。这允许 RPM 将保存文档的文件与 RPM 中的其他文件区分开来。
编写了spec 文件并将其放在 /usr/src/redhat 下的 sources 和 specs 目录中后,将看到如下文件:
$ ls –CF /usr/src/redhat/* /usr/src/redhat/BUILD: /usr/src/redhat/RPMS: athlon/ i386/ i486/ i586/ i686/ noarch/ /usr/src/redhat/SOURCES: jikes-1.17.tar.gz /usr/src/redhat/SPECS: jikes.spec /usr/src/redhat/SRPMS:
也就是说,在一个干净的系统中,没有构建其他RPM,将在 /usr/src/redhat/specs 中看到一个 spec 文件,在 /usr/src/redhat/sources 中看到源代码。在此示例中,源文件位于压缩的 tar 存档中(为此,RPM 规范文件 jikes.spec 需要在 prep 部分中有一个命令来提取文件)。
现在,准备好可以构建 RPM。
构建 RPMs
要使用 rpmbuild 命令构建 RPM,请使用以下基本语法:
rpmbuild -bBuildStage spec_file
-b 选项告诉 rpmbuild 构建 RPM。额外的 BuildStage 选项是一个特殊的代码,它告诉rpmbuild命令在构建时要走多远。选项包括:
选项 | 使用 |
---|---|
-ba | 构建所有,包括二进制和源 RPM |
-bb | 构建二进制 RPM |
-bc | 构建(编译)程序,但不进行完整的RPM,在%Build部分后立即停止 |
-bp | 准备构建二进制 RPM,并在完成 %prep 部分后立即停止 |
-bi | 创建二进制 RPM 并在 %install 部分后立即停止 |
-bl | 检查 RPM 的文件列表,如果 BuildRoot 缺少任何要安装的文件,则生成错误 |
-bs | 仅构建源RPM |
rpmbuild 命令参数说明:
[root@bogon /]# rpmbuild --help
Usage: rpmbuild [OPTION...]
Build options with [ <specfile> | <tarball> | <source package> ]:
-bp build through %prep (unpack sources and apply patches) from <specfile>
-bc build through %build (%prep, then compile) from <specfile>
-bi build through %install (%prep, %build, then install) from <specfile>
-bl