[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 下一页 ]


Debian GNU/Linux FAQ
第 7 章 - Debian 软件包管理系统基础知识


本章介绍 Debian 软件包管理的一些底层内部原理。如果您主要对相关工具的使用感兴趣,请跳至 Debian 软件包管理工具,第 8 章 和/或 保持 Debian 系统更新,第 9 章


7.1 什么是 Debian 软件包?

软件包通常包含实现一组相关命令或功能所需的所有文件。Debian 软件包有两种类型

通过软件包系统安装软件使用由软件包维护者精心设计的“依赖关系”。这些依赖关系记录在与每个软件包关联的 control 文件中。例如,包含 GNU C 编译器 (gcc) 的软件包“依赖”于包含链接器和汇编器的 binutils 软件包。如果用户尝试在未先安装 binutils 的情况下安装 gcc,则软件包管理系统 (dpkg) 将发送一条错误消息,指出它还需要 binutils,并停止安装 gcc。(但是,这种机制可以被坚持的用户覆盖,请参阅 dpkg(8)。)更多信息请参见下面的 软件包的依赖推荐建议冲突替换破坏提供另一个软件包是什么意思?,第 7.9 节

Debian 的打包工具可用于


7.2 Debian 二进制软件包的格式是什么?

Debian “软件包”或 Debian 归档文件包含与特定程序套件或一组相关程序关联的可执行文件、库和文档。通常,Debian 归档文件的文件名以 .deb 结尾。

Debian 二进制软件包格式的内部结构在 deb(5) 手册页中描述。此内部格式可能会更改(在 Debian GNU/Linux 的主要版本之间),因此,如果您需要在 .deb 文件上进行低级操作,请始终使用 dpkg-deb(1)


7.3 为什么 Debian 软件包文件名如此之长?

Debian 二进制软件包文件名符合以下约定:<foo>_<版本号>-<Debian 修订号>_<Debian 架构>.deb

请注意,foo 应该是软件包名称。作为检查,可以通过以下方式之一了解与特定 Debian 归档文件(.deb 文件)关联的软件包名称

VVV 组件是由上游开发人员指定的版本号。这里没有标准,因此版本号的格式可能差异很大,例如“19990513”和“1.3.8pre1”。

RRR 组件是 Debian 修订号,由 Debian 开发人员(或个人用户,如果他选择自己构建软件包)指定。此数字对应于 Debian 软件包的修订级别,因此,新的修订级别通常表示 Debian Makefile (debian/rules)、Debian 控制文件 (debian/control)、安装或删除脚本 (debian/p*) 或与软件包一起使用的配置文件中的更改。

AAA 组件标识软件包构建所针对的处理器。这通常是 i386,指的是与 Intel 386 或更高版本兼容的芯片。有关其他可能性,请查看 Debian FTP 目录结构,网址为 Debian FTP 归档中的所有目录是什么?,第 6.7 节。有关详细信息,请参阅手册页 dpkg-architecture(1) 中“Debian 架构”的描述。


7.4 什么是 Debian 控制文件?

有关 Debian 控制文件内容的具体信息,请参阅 Debian 策略手册第 5 节,请参见 关于 Debian 系统的其他文档有哪些?,第 12.1 节

简而言之,下面显示了 Debian 软件包 hello 的示例控制文件

     Package: hello
     Priority: optional
     Section: devel
     Installed-Size: 45
     Maintainer: Adam Heath <doogie@debian.org>
     Architecture: i386
     Version: 1.3-16
     Depends: libc6 (>= 2.1)
     Description: The classic greeting, and a good example
      The GNU hello program produces a familiar, friendly greeting.  It
      allows nonprogrammers to use a classic computer science tool which
      would otherwise be unavailable to them.
      .
      Seriously, though: this is an example of how to do a Debian package.
      It is the Debian version of the GNU Project's `hello world' program
      (which is itself an example for the GNU Project).

Package 字段给出软件包名称。这是软件包工具可以操作软件包的名称,通常与 Debian 归档文件名中的第一个组件字符串相似但不一定相同。

Version 字段同时给出上游开发人员的版本号和(在最后一个组件中)此程序 Debian 软件包的修订级别,如 为什么 Debian 软件包文件名如此之长?,第 7.3 节 中所述。

Architecture 字段指定编译此特定二进制文件所针对的芯片。

Depends 字段给出了成功安装此软件包必须安装的软件包列表。

Installed-Size 指示已安装软件包将消耗多少磁盘空间。这旨在供安装前端使用,以显示是否有足够的磁盘空间来安装程序。

Section 行给出此 Debian 软件包在 Debian FTP 站点上存储的“section”。

Priority 指示此软件包对于安装的重要性,以便像 dselect 或 aptitude 这样的半智能软件可以将软件包分类为例如可选安装的软件包。请参见 什么是必要必需重要标准可选额外软件包?,第 7.7 节

Maintainer 字段给出当前负责维护此软件包的人员的电子邮件地址。

Description 字段给出软件包功能的简短摘要。

有关软件包可能具有的所有可能字段的更多信息,请参阅 Debian 策略手册第 5 节“控制文件及其字段”,请参见 关于 Debian 系统的其他文档有哪些?,第 12.1 节


7.5 什么是 Debian 配置文件?

配置文件是配置文件的列表(通常放在 /etc 中),软件包管理系统在升级软件包时不会覆盖这些配置文件。这确保了这些文件内容的本地值将被保留,并且是启用在运行系统上就地升级软件包的关键功能。

要确定在升级期间精确保留哪些文件,请运行

     dpkg --status package

并在“Conffiles:”下查找。


7.6 什么是 Debian preinst、postinst、prerm 和 postrm 脚本?

这些文件是可执行脚本,在安装软件包之前或之后自动运行。与名为 control 的文件一起,所有这些文件都是 Debian 归档文件的“控制”部分的一部分。

各个文件是

preinst

此脚本在软件包从其 Debian 归档 (".deb") 文件解包之前执行。许多 'preinst' 脚本会停止正在升级的软件包的服务,直到其安装或升级完成(在成功执行 'postinst' 脚本之后)。

postinst

此脚本通常在 foo 从其 Debian 归档 (".deb") 文件解包后完成软件包 foo 的任何必需配置。通常,'postinst' 脚本会要求用户输入,和/或警告用户,如果他接受默认值,他应该记住返回并根据情况重新配置该软件包。许多 'postinst' 脚本然后执行启动或重新启动服务所需的任何命令,一旦安装或升级了新软件包。

prerm

此脚本通常停止与软件包关联的任何守护程序。它在删除与软件包关联的文件之前执行。

postrm

此脚本通常修改与 foo 关联的链接或其他文件,和/或删除由软件包创建的文件。(另请参阅 什么是虚拟软件包?,第 7.8 节。)

目前,所有控制文件都可以在目录 /var/lib/dpkg/info 中找到。与软件包 foo 相关的文件以名称“foo”开头,并具有“preinst”、“postinst”等文件扩展名,具体取决于情况。该目录中的文件 foo.list 列出了随软件包 foo 安装的所有文件。(请注意,这些文件的位置是 dpkg 内部的;您不应依赖它。)


7.7 什么是必要必需重要标准可选额外软件包?

每个 Debian 软件包都由发行版维护者分配一个优先级,作为软件包管理系统的辅助手段。优先级为

如果您执行默认的 Debian 安装,则所有优先级为 标准 或更高的软件包都将安装在您的系统中。如果您选择预定义的任务,您还将获得较低优先级的软件包。

此外,某些软件包被标记为 必要,因为它们对于系统的正常运行绝对必要。软件包管理工具将拒绝删除这些软件包。


7.8 什么是虚拟软件包?

虚拟软件包是一个通用名称,适用于一组软件包中的任何一个,所有这些软件包都提供类似的基本功能。例如,tintrn 程序都是新闻阅读器,因此应该满足程序对系统上新闻阅读器的任何依赖关系,以便工作或有用。因此,据说它们都提供了名为 news-reader 的“虚拟软件包”。

类似地,smailsendmail 都提供了邮件传输代理的功能。因此,据说它们提供了虚拟软件包“mail transport agent”。如果安装了其中任何一个,那么任何依赖于 mail-transport-agent 安装的程序都将通过此虚拟软件包的存在而得到满足。

Debian 提供了一种机制,以便如果系统上安装了多个提供相同虚拟软件包的软件包,则系统管理员可以将其中一个设置为首选软件包。相关命令是 update-alternatives,并在 有些人喜欢 mawk,有些人喜欢 gawk;有些人喜欢 vim,有些人喜欢 elvis;有些人喜欢 trn,有些人喜欢 tin;Debian 如何支持多样性?,第 11.10 节 中进一步描述。


7.9 软件包的依赖推荐建议冲突替换破坏提供另一个软件包是什么意思?

Debian 软件包系统有一系列软件包“依赖关系”,旨在指示(在一个标志中)程序 A 在给定系统上独立于程序 B 的存在而运行的级别

有关每个术语的使用的更详细信息,请参见 Debian 策略手册第 7.2 节“二进制依赖关系”,请参见 关于 Debian 系统的其他文档有哪些?,第 12.1 节


7.10 Pre-Depends 是什么意思?

“Pre-Depends”是一种特殊的依赖关系。对于大多数软件包,无论系统上是否存在它所依赖的文件,dpkg 都会解包其归档文件(即其 .deb 文件)。简单来说,解包意味着 dpkg 将从旨在安装在您的文件系统上的归档文件中提取文件,并将它们放在适当的位置。如果这些软件包依赖于您的系统上存在某些其他软件包,则 dpkg 将拒绝完成安装(通过执行其“configure”操作),直到安装了其他软件包。

但是,对于某些软件包,dpkg 甚至会拒绝解包它们,直到某些依赖关系得到解决。据说此类软件包“Pre-depend”于某些其他软件包的存在。Debian 项目提供了这种机制,以支持从 a.out 格式到 ELF 格式的系统安全升级,其中软件包解包的顺序至关重要。在其他大型升级情况下,此方法也很有用,例如,具有必需优先级的软件包及其 LibC 依赖关系。

与以前一样,有关此方面的更多详细信息可以在策略手册中找到。


7.11 软件包状态中的未知安装删除清除保留是什么意思?

这些“want”标志告诉用户想要对软件包执行的操作(如用户在 dselect 的“选择”部分中的操作,或用户直接调用 dpkg 所指示的那样)。

它们的含义是


7.12 如何将软件包置于保留状态?

有三种方法可以保留软件包,使用 dpkg、aptitude 或 dselect。

使用 dpkg,您必须导出软件包选择列表,使用

     dpkg --get-selections \* > selections.txt

然后编辑生成的文件 selections.txt,将包含您要保留的软件包(例如 libc6)的行从

     libc6                                           install

更改为

     libc6                                           hold

保存文件,然后使用以下命令将其重新加载到 dpkg 数据库中

     dpkg --set-selections < selections.txt

使用 aptitude,您可以使用以下命令保留软件包

     aptitude hold package_name

并使用以下命令取消保留

     aptitude unhold package_name

使用 dselect,您必须进入 [S]elect 屏幕,找到您希望保持其当前状态的软件包,然后按 `=` 键(或 `H`)。更改将在您退出 [S]elect 屏幕后立即生效。


7.13 如何安装源代码软件包?

Debian 源代码软件包实际上无法“安装”,它们只是在您想要构建它们生成的二进制软件包的任何目录中解包。

源代码软件包分布在大多数与您可以获取二进制软件包相同的镜像上。如果您设置 APT 的 sources.list(5) 以包含适当的“deb-src”行,您将能够通过运行以下命令轻松下载任何源代码软件包

     apt-get source foo

为了帮助您实际构建源代码软件包,Debian 源代码软件包提供了所谓的构建依赖关系机制。这意味着源代码软件包维护者保留了构建其软件包所需的其他软件包的列表。要了解这有多么有用,请运行

     apt-get build-dep foo

在构建源代码之前。


7.14 如何从源代码软件包构建二进制软件包?

首选方法是使用各种包装器工具。我们将展示如何使用 devscripts 工具完成此操作。如果您尚未安装此软件包,请安装它。

现在,首先获取源代码软件包

     apt-get source foo

并更改到源代码树

     cd foo-*

然后安装所需的构建依赖项(如果有)

     sudo apt-get build-dep foo

然后创建您自己的构建专用版本(这样您以后在 Debian 本身发布新版本时就不会感到困惑)

     dch -l local 'Blah blah blah'

最后构建您的软件包

     debuild -us -uc

如果一切正常,您现在应该可以通过运行以下命令来安装您的软件包

     sudo dpkg -i ../*.deb

如果您喜欢手动操作,并且不想使用 devscripts,请按照以下步骤操作

您将需要所有 foo_*.dsc、foo_*.tar.gz 和 foo_*.diff.gz 来编译源代码(注意:某些 Debian 原生软件包没有 .diff.gz)。

一旦您拥有它们(如何安装源代码软件包?,第 7.13 节),如果您安装了 dpkg-dev 软件包,则以下命令

     dpkg-source -x foo_version-revision.dsc

会将软件包提取到名为 foo-version 的目录中。

如果您只想编译软件包,您可以 cd 进入 foo-version 目录并发出命令

     dpkg-buildpackage -rfakeroot -b

构建软件包(请注意,这也需要 fakeroot 软件包),然后

     dpkg -i ../foo_version-revision_arch.deb

安装新构建的软件包。


7.15 如何自己创建 Debian 软件包?

有关此方面的更详细描述,请阅读《新维护人员指南》,该指南在 maint-guide 软件包中提供,或访问 http://www.debian.org/doc/devel-manuals#maint-guide


[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 下一页 ]


Debian GNU/Linux FAQ

版本 5.0,2011 年 8 月 27 日

作者列在 Debian FAQ 作者