Linux 发行版使用的打包格式主要有两种:Redhat Package Manager (RPM) 和 Debian
(DEB)。两者的用途差不多,而具体的方法不同。总的来说,两者都是“增强的”文件档案格式。这些包格式提供的增强包括:版本号注释、应用程序对其他应
用程序或库的依赖性、打包工具的可读性描述、管理安装、升级和卸载的打包工具通用机制。
在 DEB 文件中,嵌套的配置文件 control 包含大多数包元数据。而 RPM 文件中则是 spec。以这两种格式创建包的完整细节超出了本教程的范围,这里仅作基本介绍。
DEB 包使用存档工具和 tar 的近亲 ar(或某种使用 ar 的更高级的工具)创建。因此可使用 ar 查看 .deb 文件的内容。通常使用更高级的工具如 dpkg、dpkg-deb 或 apt-get 与 DEB 包打交道。比如:
% ar tv unzip_5.51-2ubuntu1.1_i386.deb rw-r--r-- 0/0 4 Aug 1 07:23 2005 debian-binary rw-r--r-- 0/0 1007 Aug 1 07:23 2005 control.tar.gz rw-r--r-- 0/0 133475 Aug 1 07:23 2005 data.tar.gz
|
文件 debian-binary 只包括 DEB 版本号(目前为 2.0)。档案 data.tar.gz 包含实际的应用程序文件 —— 可执行文件、文档、手册、配置文件,等等。
档案 control.tar.gz 从打包的角度来看最有趣。我们来看看这个 DEB 包:
% tar tvfz control.tar.gz drwxr-xr-x root/root 0 2005-08-01 07:23:43 ./ -rw-r--r-- root/root 970 2005-08-01 07:23:43 ./md5sums -rw-r--r-- root/root 593 2005-08-01 07:23:43 ./control
|
与预料的一样,md5sums
包含所有分发文件的加密散列值用于验证。元数据包含在 control
文件中。多数情况下,可能会发现或希望在 control.tar.gz 中包含名为 postinst 和 prerm 的脚本,分别用于在安装后和删除前执行某些步骤。
安装脚本可以做 shell 脚本能够做的任何事情(看看现有包中的一些例子就知道了)。但是这些脚本是可选的,常常不需要或者没有。.deb 包需要的是 control 文件。该文件的格式包括各种元数据字段,最好用一个例子来说明:
% cat control Package: unzip Version: 5.51-2ubuntu1.1 Section: utils Priority: optional Architecture: i386 Depends: libc6 (>= 2.3.2.ds1-4) Suggests: zip Conflicts: unzip-crypt (<< 5.41) Replaces: unzip-crypt (<< 5.41) Installed-Size: 308 Maintainer: Santiago Vila Description: De-archiver for .zip files InfoZIP's unzip program. With the exception of multi-volume archives (ie, .ZIP files that are split across several disks using PKZIP's /& option), this can handle any file produced either by PKZIP, or the corresponding InfoZIP zip program. . This version supports encryption.
|
基本上,除了自定义的数据值以外,您的 control 文件应该和这个差不多。对非 CPU 专用包,无论是脚本、纯文档或源代码,都使用 Architecture: all
。
创建 DEB 包要使用工具 dpkg-deb。我们不可能讨论打包的所有细节,但基本的思路是,创建一个工作目录 ./debian/,然后在运行 dpkg-deb 之前将所有需要的内容放入其中。可能还需要设置文件的权限以便适应安装时需要的状态。比如:
% mkdir -p ./debian/usr/bin/ % cp foo-util ./debian/usr/bin # copy executable/script % mkdir -p ./debian/usr/share/man/man1 % cp foo-util.1 ./debian/usr/share/man/man1 # copy the manpage % gzip --best ./debian/usr/share/man/man1/foo-util.1 % find ./debian -type d | xarg chmod 755 # set dir permissions % mkdir -p ./debian/DEBIAN % cp control ./debian/DEBIAN # first create a matching 'control' % dpkg-deb --build debian # create the archive % mv debian.deb foo-util_1.3-1all.deb # rename to final package name
|
上一节中可以看到,./debian/ 下的本地目录结构是为了和预期的安装结果相匹配。要创建一个好的包,还有几点值得注意。
创建包时,RPM 采取了和 DEB 略有不同的策略。它的配置文件称为 spec 而不是 control,而且 spec 文件的内容也比 control 文件多。安装前后、卸载前和安装本身需要的所有步骤的细节都包含在 spec 配置内嵌的脚本文件中。事实上,spec 格式甚至提供了宏和通用动作。
如果需要创建 RPM 包,可使用 rpm -b
工具程序。比如:
% rpm -ba foo-util-1.3.spec # perform all build steps
|
包的构建过程不依赖于 DEB 中那些特殊命名的目录,而是更复杂的 spec 文件中的指令。
RPM 中的主要元数据和 DEB 中的非常类似。比如,foo-util-1.3.spec 可能包含如下所示的内容:
# spec file for foo-util 1.3 Summary: A utility that fully foos Name: foo-util Version: 1.3 Release: 1 Copyright: GPL Group: Application/Misc Source: ftp://example.com/foo-util.tgz URL: Distribution: MyLinux Vendor: Acme Systems Packager: John Doe
%description The foo-util program is an advanced fooer that combines the capabilities of OneTwo's foo-tool and those in the GPL bar-util.
|
RPM spec 文件中的一些段可以包含一些很小的 shell 脚本。其中包括:
%prep
:为准备构建而要执行的步骤,比如清除以前的(部分)版本。通常下面的宏很有用:
%build
:实际构建工具的步骤。如果使用 make
工具,可能如下所示:
%install
:安装工具的步骤。如果使用 make
,如下所示:
%files
:必须 包含属于该包的文件列表。即便 Makefile 可能使用这些文件,包管理器程序(rpm)也不会知道它们,除非将它们包含在这里:
%files %doc README /usr/bin/foo-util /usr/share/man/man1/foo-util.1
|
阅读(2459) | 评论(2) | 转发(0) |