快速程序交付小块, RPM

作者:Marcel Gagné

弗朗索瓦!为什么您没有立即告诉我这些尊贵的客人已经到了?快去吧。Vite!从酒窖里拿来 82 年的玛歌。

请原谅,我的朋友们,没有更早地欢迎你们。弗朗索瓦不喜欢在我品尝,或者更确切地说,盘点酒窖时打扰我。请坐下,再次欢迎来到马塞尔餐厅。如您所知,本月刊物的主题是对软件开发领域的精彩探索。

安装和分发软件可能是一项困难的任务。对于,我们可以说,不太懂技术的用户来说,解压和解压缩源代码、编译、安装以及跟踪所有已完成的工作可能令人生畏。一旦完成,升级该软件可能是另一场考验。这就是软件包管理器试图简化的内容。其中最流行和通用的软件包管理器是 RPM,即 Red Hat 软件包管理器。借助 RPM,您可以通过将解压、编译、安装和清理的整个过程转换为单个单行命令,使最终用户轻松管理您的发行版。RPM 甚至维护已安装产品的数据库,以便您可以验证已安装软件的完整性或查询文件位置。

许多 Linux 发行版都将 RPM 作为其首选的软件包管理器。您会发现 Red Hat、Caldera、Mandrake 和 TurboLinux 等都在使用 RPM,仅举几例。即使您的 Linux 发行版没有附带 RPM,您仍然可以安装和使用它。更令人兴奋的是,RPM 还可以在许多其他 UNIX 版本上运行。其中包括 AIX、HP-UX、IRIX 等。我现在可以听到广告了:“Red Hat 软件包管理器... 它不仅仅适用于 Red Hat 了。”

您的味蕾正在证明巴甫洛夫先生是正确的,不是吗?您想尝试使用 RPM 分发您的软件,但您不知道从哪里开始?跟我到厨房,我将向您展示一个创建您自己的 RPM 的简单食谱。

让我们假设我想分发一个名为 gatekeeper 1.0 版本的巧妙的小软件包。这个精巧的 假设 软件带有一个用于身份验证的 Web 界面、一个调用小型 setuid 程序的 CGI 脚本,然后该程序调用另一个 Perl 脚本来更新 /etc/hosts.allow 以授予访问权限。已安装的文件如下

/home/httpd/html/gatekeeper/keypad.html
/home/httpd/cgi-bin/gatekeeper/locksmith.pl
/usr/local/.Admin/sethosts.pl
/usr/local/bin/suguard

我的 setuid 程序是 suguard,因此将以 setuid 权限安装,而 .pl 文件将需要 CGI 脚本的标准可执行权限。我们或许应该添加一个 README 来配合此集合。我们还希望根据 GNU 通用公共许可证发布此软件。那么,我们接下来该怎么做呢?

创建新 RPM 的第一步是构建 .spec 文件,即 RPM 的基本配置文件。它本质上是 RPM 用于构建最终软件包的配方。与任何配方一样,您可以灵活地添加或删除某些内容,但应遵循一些基本原则。毕竟,如果您用苹果而不是肉制作 肉馅饼,您将得到带有蔬菜和香料的苹果派,但这根本行不通。即使是弗朗索瓦也可能无法为您提供足够的葡萄酒来冲淡它。

我们现在将介绍此配方(即 spec .file)的详细信息。在我的例子中,它被称为 gatekeeper-1.0-x.spec,并分为多个部分,分别处理要构建的发行包的特定特征。重要的部分是“preamble”、“%prep”、“%build”、“%install”和“%files”。 preamble 是对软件包的描述:发布信息、构建者以及获取源的位置。顾名思义,它位于我的 .spec 文件的顶部。与其他部分不同,它没有标题——您只需以它开头文件即可。对于我的 gatekeeper 程序,我有以下 preamble

Summary: Allows authorized clients firewall access
Name: gatekeeper
Version: 1.0
Release: 1
Copyright: GPL
Group: Applications/Networking
Source: ftp://ftp.mycompany.com/pub/packages/gatekeeper-1.0.tar.gz
URL: http://www.mycompany.com/
Packager: Chef Marcel
ExclusiveArch: i386

我们首先对软件包进行简单的摘要描述。接下来是名称、版本号和发布号。如果您曾经下载或安装过 RPM,您就会熟悉这里发生的事情。我的软件包完成后,将被命名为 gatekeeper-1.0-1.i386.rpm。我包括版权声明、源位置(可以使用 FTP 下载软件包的位置)、软件包文档的 URL,以及将整个软件包放在一起的厨师被提及为“Packager”。

为了举例说明这在何处变得有用,请尝试将以下命令提供给系统上的任何软件包。例如,让我们查询“net-tools”软件包

rpm -qi net-tools

这是该命令的输出。

Name: net-tools
Relocations: (not relocateable)
Version: 1.53
Vendor: Red Hat Software
Release: 1
Build Date: Sun 29 Aug 1999
08:16:43 PM EDT
Install date: Mon 17 Jan 2000 05:07:51 PM EST
Build Host: porky.devel.redhat.com
Group: System Environment/Base
Source RPM: net-tools-1.53-1.src.rpm
Size: 569756
License: GPL
Packager: Red Hat Software http://developer.redhat.com/bugzilla
Summary: Basic tools for setting up networking:
Description: The net-tools package contains the
basic tools needed for setting up networking:
arp, rarp, ifconfig, netstat, ethers and route.
接下来,在我的“.spec”文件中,我包含一个 %description 标题。在本节中,我包含了对软件包的更详细的解释,而不是上一节顶部的简单一句话。在某种程度上,这是第一部分的一部分,因为它构成了完整的软件包描述。
%description
Allows authorized clients firewall access
What makes this so cool is that clients with
dynamic IP addresses can still be allowed access
to network resources with proper authentication.
After a set inactivity time (fifteen minutes),
access is deleted from the system.
到目前为止,我们有很多信息,但现在真正的工作开始了。如果您仔细查看下一节 (%prep),您会发现它只是一个放置命令的地方,这些命令用于准备您的源(或在我的示例中,一些脚本)以进行构建。您可以想象只调用一个 shell 脚本来完成所有操作,或者专门列出命令。您会发现它非常简单。
%prep
rm -rf $RPM_BUILD_DIR/gatekeeper-1.0
zcat $RPM_SOURCE_DIR/gatekeeper-1.0.tar.gz |
tar -xvf -
其中一些节标题实际上是强大的宏。例如,下一节的 %setup 标题可以在不给出任何参数的情况下完成相当多的工作。(就像我没有做的那样!非常聪明,不是吗?)这个宏在没有任何帮助的情况下所做的就是解压缩源(tar.gz 文件)并移动(使用 cd)到该目录中——非常好。您还可以向此宏添加一些标志来自定义您的构建。今天,我们将保持简单
%setup
当我们查看这个孤独但强大的 %setup 宏时,我应该指出还有另一个宏。%patch 宏可用于帮助您轻松地将补丁应用于您的构建。接下来是 %build 部分
%build
啊,是的,另一个孤独的部分。弗朗索瓦,你能为我们的构建部分倒一杯酒来帮助它度过孤独吗?坐下,弗朗索瓦;我只是在开玩笑。我们这里有一个部分,它对您可能需要使用的任何 shell 命令开放,以便构建您的软件包。例如,如果我正在处理一个源软件包,我可以有这样的东西
%build
ftl_drive_preparations
make depend
make
显然,这会比我在这里构建的软件包技术含量更高,不是吗?

当我们向下移动 .spec 文件时,对细节的需求会增加。例如,%install 部分包含安装软件包所需的命令列表:任何目录创建命令、安装命令以及任何其他必需命令。您也可以简单地调用另一个 shell 脚本或 make install。我更喜欢我的 .spec 文件反映我的构建过程。请注意反斜杠,因为有些行太长,无法在此示例中容纳。

%install
mkdir -p $RPM_BUILD_ROOT/home/httpd/html/gatekeeper
mkdir -p $RPM_BUILD_ROOT/home/httpd/cgi-bin/gatekeeper
mkdir -p $RPM_BUILD_ROOT/usr/local/.Admin
mkdir -p $RPM_BUILD_ROOT/usr/local/bin
install -m 644 home/httpd/html/scidns/keypad.html\
$RPM_BUILD_ROOT/home/httpd/html/scidns/keypad.html
install -m 755 home/httpd/cgi-bin/scidns/locksmith.pl
$RPM_BUILD_ROOT/home/httpd/cgi-bin/scidns/locksmith.pl
install -m 755 usr/local/.Admin/sethosts.pl \
$RPM_BUILD_ROOT/usr/local/.Admin/sethosts.pl
install -m 4755 usr/local/bin/suguard \
$RPM_BUILD_ROOT/usr/local/bin/suguard

快到了,我的朋友们。当我们完成将我们的 RPM 二进制文件放在一起后,我们应该清理一下,不是吗?这就是我们这样做的地方。这是 %clean 部分。

%clean
rm -rf $RPM_BUILD_ROOT
现在我们来到最后一节,%files。这只是构成您的软件包的所有文件的列表。请记住,文件必须在此处列出——此部分中遗漏的任何内容都不会进入最终 RPM。
%files
%doc README
/home/httpd/html/gatekeeper/keypad.html
/home/httpd/cgi-bin/gatekeeper/locksmith.pl
/usr/local/.Admin/sethosts.pl
/usr/local/bin/suguard
当您分析本节的精彩简洁性时,还要注意 %doc 参数。我在此处包含的文件将自动安装在我的系统上的 /usr/doc 层次结构下以表示该软件包。在本例中,目录将是 /usr/doc/gatekeeper-1.0,下面有一个文件 (README)。

现在是我们一直等待的时刻。您的 .spec 文件已完成,您渴望看到它工作。这就是您构建软件包的方式

rpm -bb gatekeeper-1.0-.spec

-bb 选项表示“构建二进制文件”。rpm 命令有许多标志,用于定义您是构建源代码还是二进制文件,还是执行 .spec 文件的各个部分。当您在上面的命令中按 ENTER 时,当 RPM 处理 .spec 文件的每个部分时,许多内容开始在您的眼前滚动。在这种情况下,我寻找的行是

Wrote: /usr/src/redhat/RPMS/i386/gatekeeper-1.0-1.i386.rpm
那,我的朋友们,真是一件美好的事情。

在整篇文章中,我引用了诸如 RPM_BULD_ROOT 之类的变量,但没有解释这些东西来自哪里。在像我这样的 Red Hat 系统中,这是 /usr/src/redhat,我在其中找到以下目录:BUILD、RPMS、SOURCES、SPECS 和 SRPMS。如果您好奇它们是如何定义的,请查看文件 /usr/lib/rpm/macros。如果您在此位置找不到“macros”文件(请记住,必须加载 rpm),请使用以下命令找到它

rpm -ql rpm | grep macros

您看,rpm 是一个非常棒的工具,可以用于很多事情,包括使用 rpm 本身。

什么?啊,是的。我听到你们的声音了,我的朋友们。你们在问:“马塞尔,有没有其他方法来构建 RPM,也许更友好的方法?” 不要绝望。马塞尔厨师特别喜欢那个陈年的 UNIX 编辑器,vi。尽管如此,还有其他方法可以构建 RPM 软件包,从而将该过程带到桌面。请允许我向您展示这些美味佳肴。

我要提到的第一项是来自 KLabs 的东西,(奇怪的是)称为 RPM Builder(见图 1)。这是一个 Tcl/Tk 应用程序(由 Seek3r 编写),它可以从 tar.gz 发行版自动构建 .spec 文件的框架。非常好,尽管我们在 KLabs 的朋友们基于 1024x768 屏幕构建了屏幕。在我的 800x600 屏幕上,我会在笔记本电脑的底部丢失一部分。无需告诉他们——他们已经知道了。不过,仍然值得一看。

Rapid Program-Delivery Morsels, RPM

图 1. RPM Builder

我要推荐的另一个软件包是来自 Hills Design Group 的 Davin S. Hills 的 pkgbuild(见图 2)。这是一个外观非常漂亮的软件包,其屏幕设计将 GUI 分解为与 RPM 构建过程本身不同的部分。您有一个用于 preamble 的选项卡,一个用于“Prep and Build”,一个用于“Install and Clean”等等。一切都可以从一个界面完成。该软件基于 Jeroen van der Zijp 编写的 FOX C++ 开发库构建,因此如果您想自己构建该软件包,则需要获取该库。pkgbuild 的 RPM 适用于 Red Hat 用户。

Rapid Program-Delivery Morsels, RPM

图 2. pkgbuild

请务必查看侧边栏中的 RPM 资源。为了获得更多 RPM 杰作,我邀请您访问 RPM 官方网站,了解所有关于 RPM 的信息,以及 RPM 文档项目。RPM 文档项目网站仍处于起步阶段,内容有些稀疏。维护人员承诺在不久的将来提供更多信息,因此当您阅读本文时,它可能已经充满了信息。无论如何请查看一下。您将找到 Edward C. Bailey 的 Maximum RPM 书籍的链接,免费且在线。本书的这个版本已经有几年历史了,但您仍然会发现很多有用的信息。

好吧,我的朋友们,外面那只讨厌的公鸡告诉我快要关门了。我衷心希望我已设法帮助您使您出色的 Linux 软件包更接近现实,并更接近简单、可重复的安装和更新。再见,我的朋友们。请记住,您始终欢迎来到 马塞尔餐厅。祝您胃口大开!

资源

Rapid Program-Delivery Morsels, RPM
电子邮件:mggagne@salmar.com

Marcel Gagné (mggagne@salmar.com) 居住在安大略省密西沙加市。在现实生活中,他是 Salmar Consulting Inc. 的总裁,这是一家系统集成和网络咨询公司。他也是一名飞行员,撰写科幻小说和奇幻小说,并编辑科幻、奇幻和恐怖杂志 TransVersions。他热爱 Linux 和所有版本的 UNIX,甚至会在公共场合承认这一点。请查看他在 LJ 网站上的系统管理专栏。

加载 Disqus 评论