[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 下一页 ]
本章介绍 Debian 软件包管理的一些底层内部原理。如果您主要对相关工具的使用感兴趣,请跳至 Debian 软件包管理工具,第 8 章 和/或 保持 Debian 系统更新,第 9 章。
软件包通常包含实现一组相关命令或功能所需的所有文件。Debian 软件包有两种类型
二进制软件包,其中包含可执行文件、配置文件、man/info 页面、版权信息和其他文档。这些软件包以 Debian 特定的归档格式分发(参见 Debian 二进制软件包的格式是什么?,第 7.2 节);它们通常以 '.deb' 文件扩展名区分。可以使用 Debian 实用程序 dpkg(可能通过诸如 aptitude
之类的前端)解压缩二进制软件包;详细信息请参阅其手册页。
源代码软件包,它由一个 .dsc 文件(描述源代码软件包,包括以下文件的名称)、一个 .orig.tar.gz 文件(包含 gzip 压缩 tar 格式的原始未修改源代码)以及通常一个 .diff.gz 文件(包含 Debian 对原始源代码的特定更改)组成。实用程序 dpkg-source 打包和解包 Debian 源代码归档文件;详细信息请参阅其手册页。(程序 apt-get
可以用作 dpkg-source 的前端。)
通过软件包系统安装软件使用由软件包维护者精心设计的“依赖关系”。这些依赖关系记录在与每个软件包关联的 control 文件中。例如,包含 GNU C 编译器 (gcc
) 的软件包“依赖”于包含链接器和汇编器的 binutils
软件包。如果用户尝试在未先安装 binutils
的情况下安装 gcc
,则软件包管理系统 (dpkg) 将发送一条错误消息,指出它还需要 binutils
,并停止安装 gcc
。(但是,这种机制可以被坚持的用户覆盖,请参阅 dpkg(8)
。)更多信息请参见下面的 软件包的依赖、推荐、建议、冲突、替换、破坏或提供另一个软件包是什么意思?,第 7.9 节。
Debian 的打包工具可用于
操作和管理软件包或软件包的组成部分,
管理软件包中文件的本地覆盖,
帮助开发人员构建软件包归档,以及
帮助用户安装位于远程 FTP 站点上的软件包。
Debian “软件包”或 Debian 归档文件包含与特定程序套件或一组相关程序关联的可执行文件、库和文档。通常,Debian 归档文件的文件名以 .deb 结尾。
Debian 二进制软件包格式的内部结构在 deb(5)
手册页中描述。此内部格式可能会更改(在 Debian GNU/Linux 的主要版本之间),因此,如果您需要在 .deb 文件上进行低级操作,请始终使用 dpkg-deb(1)
。
Debian 二进制软件包文件名符合以下约定:<foo>_<版本号>-<Debian 修订号>_<Debian 架构>.deb
请注意,foo 应该是软件包名称。作为检查,可以通过以下方式之一了解与特定 Debian 归档文件(.deb 文件)关联的软件包名称
检查 Debian FTP 归档站点上存储它的目录中的“Packages”文件。此文件包含描述每个软件包的节;每个节中的第一个字段是正式软件包名称。
使用命令 dpkg --info foo_VVV-RRR_AAA.deb(其中 VVV、RRR 和 AAA 分别是相关软件包的版本、修订和架构)。除其他外,这会显示与正在解包的归档文件对应的软件包名称。
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 架构”的描述。
有关 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 节。
配置文件是配置文件的列表(通常放在 /etc 中),软件包管理系统在升级软件包时不会覆盖这些配置文件。这确保了这些文件内容的本地值将被保留,并且是启用在运行系统上就地升级软件包的关键功能。
要确定在升级期间精确保留哪些文件,请运行
dpkg --status package
并在“Conffiles:”下查找。
这些文件是可执行脚本,在安装软件包之前或之后自动运行。与名为 control 的文件一起,所有这些文件都是 Debian 归档文件的“控制”部分的一部分。
各个文件是
此脚本在软件包从其 Debian 归档 (".deb") 文件解包之前执行。许多 'preinst' 脚本会停止正在升级的软件包的服务,直到其安装或升级完成(在成功执行 'postinst' 脚本之后)。
此脚本通常在 foo 从其 Debian 归档 (".deb") 文件解包后完成软件包 foo 的任何必需配置。通常,'postinst' 脚本会要求用户输入,和/或警告用户,如果他接受默认值,他应该记住返回并根据情况重新配置该软件包。许多 'postinst' 脚本然后执行启动或重新启动服务所需的任何命令,一旦安装或升级了新软件包。
此脚本通常停止与软件包关联的任何守护程序。它在删除与软件包关联的文件之前执行。
此脚本通常修改与 foo 关联的链接或其他文件,和/或删除由软件包创建的文件。(另请参阅 什么是虚拟软件包?,第 7.8 节。)
目前,所有控制文件都可以在目录 /var/lib/dpkg/info 中找到。与软件包 foo 相关的文件以名称“foo”开头,并具有“preinst”、“postinst”等文件扩展名,具体取决于情况。该目录中的文件 foo.list 列出了随软件包 foo 安装的所有文件。(请注意,这些文件的位置是 dpkg 内部的;您不应依赖它。)
每个 Debian 软件包都由发行版维护者分配一个优先级,作为软件包管理系统的辅助手段。优先级为
必要:系统正常运行所必需的软件包。
这包括修复系统缺陷所需的所有工具。您不得删除这些软件包,否则您的系统可能会完全损坏,您甚至可能无法使用 dpkg 将其恢复原状。仅包含必要软件包的系统可能无法使用,但它们确实具有足够的功能来允许系统管理员启动并安装更多软件。
必需软件包应在任何类 Unix 系统上找到。
系统运行不良或无法使用的其他软件包将在此处。这不包括 Emacs 或 X 或 TeX 或任何其他大型应用程序。这些软件包仅构成基本的基础设施。
标准软件包是任何 Linux 系统上的标准配置,包括一个相当小但不太受限制的字符模式系统。包括能够浏览 Web(使用 w3m)、发送电子邮件(使用 mutt)和从 FTP 服务器下载文件的工具。
如果用户未选择其他任何内容,这将是默认安装的内容。它不包括许多大型应用程序,但它确实包括 Python 解释器和一些服务器软件,如 OpenSSH(用于远程管理)、Exim(用于邮件传递,尽管它可以配置为仅本地传递)、identd 服务器 (pidentd) 和 RPC 端口映射器 (portmap)。它还包括一些大多数用户会发现有用的常见通用文档。
可选软件包包括所有那些如果您不知道它是什么,或者没有特殊要求,您可能会合理地想要安装的软件包。
这包括 X、完整的 TeX 发行版和许多应用程序。
额外:与其他优先级较高的软件包冲突、仅在您已经知道它们是什么时才可能有用,或者具有特殊要求而使其不适合“可选”的软件包。
如果您执行默认的 Debian 安装,则所有优先级为 标准 或更高的软件包都将安装在您的系统中。如果您选择预定义的任务,您还将获得较低优先级的软件包。
此外,某些软件包被标记为 必要,因为它们对于系统的正常运行绝对必要。软件包管理工具将拒绝删除这些软件包。
虚拟软件包是一个通用名称,适用于一组软件包中的任何一个,所有这些软件包都提供类似的基本功能。例如,tin 和 trn 程序都是新闻阅读器,因此应该满足程序对系统上新闻阅读器的任何依赖关系,以便工作或有用。因此,据说它们都提供了名为 news-reader 的“虚拟软件包”。
类似地,smail 和 sendmail 都提供了邮件传输代理的功能。因此,据说它们提供了虚拟软件包“mail transport agent”。如果安装了其中任何一个,那么任何依赖于 mail-transport-agent 安装的程序都将通过此虚拟软件包的存在而得到满足。
Debian 提供了一种机制,以便如果系统上安装了多个提供相同虚拟软件包的软件包,则系统管理员可以将其中一个设置为首选软件包。相关命令是 update-alternatives,并在 有些人喜欢 mawk,有些人喜欢 gawk;有些人喜欢 vim,有些人喜欢 elvis;有些人喜欢 trn,有些人喜欢 tin;Debian 如何支持多样性?,第 11.10 节 中进一步描述。
Debian 软件包系统有一系列软件包“依赖关系”,旨在指示(在一个标志中)程序 A 在给定系统上独立于程序 B 的存在而运行的级别
如果程序 A 绝对必须安装软件包 B 才能运行,则程序 A 依赖于软件包 B。在某些情况下,程序 A 不仅依赖于 B,还依赖于 B 的某个版本。在这种情况下,版本依赖关系通常是下限,从某种意义上说,程序 A 依赖于 B 的任何版本,该版本比某个指定的版本更新。
如果软件包维护者判断大多数用户不希望程序 A 在没有软件包 B 提供的功能的情况下使用程序 A,则程序 A 推荐软件包 B。
如果软件包 B 包含与程序 A 的功能相关(并且通常增强)的文件,则程序 A 建议软件包 B。
当系统上安装了软件包 B 时,程序 A 将无法运行,则程序 A 与软件包 B 冲突。最常见的是,冲突是程序 A 包含的文件是对软件包 B 中的文件的改进的情况。“冲突”通常与“替换”结合使用。
当软件包 B 安装的文件被删除并且(在某些情况下)被程序 A 中的文件覆盖时,程序 A 替换软件包 B。
当两个软件包不能同时在系统中配置时,程序 A 破坏软件包 B。如果系统中已经安装并配置了另一个软件包,则软件包管理系统将拒绝安装一个软件包。
当软件包 B 的所有文件和功能都并入程序 A 时,程序 A 提供软件包 B。这种机制为磁盘空间受限的用户提供了一种仅获取他们真正需要的软件包 A 的部分的方法。
有关每个术语的使用的更详细信息,请参见 Debian 策略手册第 7.2 节“二进制依赖关系”,请参见 关于 Debian 系统的其他文档有哪些?,第 12.1 节。
“Pre-Depends”是一种特殊的依赖关系。对于大多数软件包,无论系统上是否存在它所依赖的文件,dpkg 都会解包其归档文件(即其 .deb 文件)。简单来说,解包意味着 dpkg 将从旨在安装在您的文件系统上的归档文件中提取文件,并将它们放在适当的位置。如果这些软件包依赖于您的系统上存在某些其他软件包,则 dpkg 将拒绝完成安装(通过执行其“configure”操作),直到安装了其他软件包。
但是,对于某些软件包,dpkg 甚至会拒绝解包它们,直到某些依赖关系得到解决。据说此类软件包“Pre-depend”于某些其他软件包的存在。Debian 项目提供了这种机制,以支持从 a.out 格式到 ELF 格式的系统安全升级,其中软件包解包的顺序至关重要。在其他大型升级情况下,此方法也很有用,例如,具有必需优先级的软件包及其 LibC 依赖关系。
与以前一样,有关此方面的更多详细信息可以在策略手册中找到。
这些“want”标志告诉用户想要对软件包执行的操作(如用户在 dselect 的“选择”部分中的操作,或用户直接调用 dpkg 所指示的那样)。
它们的含义是
unknown - 用户从未指示他是否想要该软件包
install - 用户想要安装或升级软件包
remove - 用户想要删除软件包,但不希望删除任何现有的配置文件。
purge - 用户想要完全删除软件包,包括其配置文件。
hold - 用户希望不处理此软件包,即,他希望保持当前版本及其当前状态,无论状态如何。
有三种方法可以保留软件包,使用 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 屏幕后立即生效。
Debian 源代码软件包实际上无法“安装”,它们只是在您想要构建它们生成的二进制软件包的任何目录中解包。
源代码软件包分布在大多数与您可以获取二进制软件包相同的镜像上。如果您设置 APT 的 sources.list(5)
以包含适当的“deb-src”行,您将能够通过运行以下命令轻松下载任何源代码软件包
apt-get source foo
为了帮助您实际构建源代码软件包,Debian 源代码软件包提供了所谓的构建依赖关系机制。这意味着源代码软件包维护者保留了构建其软件包所需的其他软件包的列表。要了解这有多么有用,请运行
apt-get build-dep foo
在构建源代码之前。
首选方法是使用各种包装器工具。我们将展示如何使用 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
安装新构建的软件包。
有关此方面的更详细描述,请阅读《新维护人员指南》,该指南在 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 日