Debian 软件包依赖关系Debian 软件包依赖关系Debian 软件包依赖关系Debian 软件包依赖关系
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

Debian 软件包依赖关系

发表 admin at 2025年2月28日
类别
  • 未分类
标签

对于 Debian GNU/Linux 等 Linux 发行版,存在超过 60.000 个不同的软件包。他们都有特定的角色。在本文中,我们将解释包管理如何在安装、更新或删除过程中可靠地管理如此大量的软件包,以保持系统正常运行并完全稳定。

对于 Debian GNU/Linux,这是指工具 apt、apt-get、aptitude、apt-cache、apt-depends、apt-rdepends、dpkg-deb 和 apt-mark。

软件包的可用性

如上所述,Linux 发行版由大量不同的软件包组成。到目前为止,软件已经相当复杂,这就是为什么通常将软件分成几个单独的包。这些包可以按功能或角色进行分类,例如二进制包、库、文档、使用示例以及特定于语言的集合,并仅提供软件的选定部分。它没有固定的规则,划分是由工具的开发团队或负责 Linux 发行版软件包的软件包维护者进行的。图 1 使用 aptitude 列出了包含 Web 浏览器 Mozilla Firefox 不同语言翻译的包。

图1:aptitude-firefox.png

这种工作方式使得每个包都可以由不同的开发人员或作为整个团队来维护。此外,划分为单个组件也允许其他软件包将其用于自己的目的。可以应用所需的功能,无需重新发明。

包组织

Debian GNU/Linux 发行版上的包管理工具会不断地确保已安装包的依赖关系得到完全满足。如果要在系统上安装、更新或删除软件包,则尤其如此。缺失的软件包将被添加到系统中,或者已安装的软件包将从系统中删除,以防不再需要。图 2 演示了使用“apt-get”删除包“mc-data”的情况。软件包“mc-data”也建议自动删除软件包“mc”,因为没有“mc-data”安装它就不再有意义。

图 2:apt-get-remove-mc.png

包装标记和标志

在工作过程中,包管理工具会尊重所设置的包标志和标记。它们可以自动设置,也可以由系统管理员手动设置。特别是此行为指的是为不应删除的包设置的标志“essential package”。在您执行此操作之前,会发出明确的警告(参见图 3)。

图 3:apt-get-remove.png

此外,还考虑了“自动”、“手动”和“保持”三个标记。它们将软件包标记为自动安装、手动安装或不得更新(保留当前版本)。软件包要么标记为“自动”,要么标记为“手动”,但不能同时标记为“自动”和“手动”。

其中,命令“apt-mark”使用以下子命令处理标记和标志:

  • auto:将软件包设置为自动安装

  • Hold:保存当前版本的包

  • 手动:将软件包设置为手动安装

  • showauto:显示自动安装的软件包

  • showmanual:显示手动安装的软件包

  • showhold:列出处于保留状态的软件包

  • unhold:删除给定包的保留标志

为了列出所有手动安装的软件包,请发出以下命令:

$ apt-mark showmanual
abiword
abs-guide
ack-grep
acl
acpi
…
$

为了保留软件包版本,请使用子命令“hold”。下面的示例显示了包“mc”的情况。

# apt-mark hold mc
mc set on hold
#

子命令“showhold”列出了处于保留状态的软件包(在我们的例子中,仅是软件包“mc”):

# apt-mark showhold
mc
#

使用名为“apt pinning”的替代方法,包按优先级进行分类。 Apt 应用它们来决定如何处理该软件包以及软件存储库中可用的版本。

包说明

使用名为“apt pinning”的替代方法,包按优先级进行分类。 Apt 应用它们来决定如何处理该软件包以及软件存储库中可用的版本。

每个软件包都有自己的标准化软件包描述。在其他字段中,此描述明确指定了它所依赖的其他包。特定于发行版的工具从包描述中提取此信息,然后为您计算和可视化依赖关系。下一个示例使用命令“apt-cache show”来显示包“poppler-utils”的包描述(参见图 4)。

图 4:package-description-poppler-utils.png

包描述包含一个名为“Depends”的部分。本节列出了当前软件包所依赖的其他软件包以及版本号。在图 4 中,此部分以红色框出,显示“poppler-utils”依赖于包“libpoppler64”、“libc6”、“libcairo2”、“libfreetype6”、“liblcms2-2”、“libstdc++6”和'zlib1g'。

显示包依赖关系

阅读包描述是找出包依赖关系的困难方法。接下来,我们将向您展示如何简化此操作。

有多种方法可以在命令行上显示包依赖关系。对于作为本地文件的 deb 包,请使用带有两个参数的命令“dpkg-deb”——包的文件名和关键字“Depends”。下面的示例演示了包“skypeforlinux-64.deb”的这一点:

$ dpkg-deb -f Downloads/skypeforlinux-64.deb Depends
gconf-service, libasound2 (>= 1.0.16), libatk1.0-0 (>= 1.12.4), libc6 (>= 2.17),
libcairo2 (>= 1.2.4), libcups2 (>= 1.4.0), libexpat1 (>= 2.0.1),
libfreetype6 (>= 2.4.2), libgcc1 (>= 1:4.1.1), libgconf-2-4 (>= 3.2.5),
libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.31.8), libgtk2.0-0 (>= 2.24.0),
libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.13.4-2~), libpango-1.0-0 (>= 1.14.0),
libpangocairo-1.0-0 (>= 1.14.0), libsecret-1-0 (>= 0.7), libv4l-0 (>= 0.5.0),
libx11-6 (>= 2:1.4.99.1), libx11-xcb1, libxcb1 (>= 1.6), libxcomposite1 (>= 1:0.3-1),
libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3,
libxi6 (>= 2:1.2.99.4), libxrandr2 (>= 2:1.2.99.3), libxrender1, libxss1,
libxtst6, apt-transport-https, libfontconfig1 (>= 2.11.0), libdbus-1-3 (>= 1.6.18),
libstdc++6 (>= 4.8.1)
$

为了对已安装的软件包执行相同的操作,请使用“apt-cache”。第一个示例结合了子命令“show”,后跟包的名称。输出被发送到“grep”命令,该命令过滤“Depends”行:

$ apt-cache show xpdf | grep Depends
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libpoppler46 (>= 0.26.2),
libstdc++6 (>= 4.1.1), libx11-6, libxm4 (>= 2.3.4), libxt6
$

命令“grep-status -F package -s Depends xpdf”将报告相同的信息。

更具体地说,第二个示例再次使用“apt-cache”,但使用子命令“depends”。该子命令后跟包的名称:

$ apt-cache depends xpdf
xpdf
Depends: libc6
Depends: libgcc1
Depends: libpoppler46
Depends: libstdc++6
Depends: libx11-6
Depends: libxm4
Depends: libxt6
Recommends: poppler-utils
poppler-utils:i386
Recommends: poppler-data
Recommends: gsfonts-x11
Recommends: cups-bsd
cups-bsd:i386
Collides with:
Collides with:
Collides with:
Collides with:
Replaces:
Replaces:
Replaces:
Replaces:
Collides with: xpdf:i386
$

上面的列表相当长,可以使用开关“-i”(“–important”的缩写)来缩短:

$ apt-cache depends -i xpdf
xpdf
Depends: libc6
Depends: libgcc1
Depends: libpoppler46
Depends: libstdc++6
Depends: libx11-6
Depends: libxm4
Depends: libxt6
$

命令“apt-rdepends”执行相同的操作,但如果在描述中指定,则带有版本信息:

$ apt-rdepends xpdf
Reading package lists… Done
Building dependency tree
Reading state information… Done
xpdf
Depends: libc6 (>= 2.4)
Depends: libgcc1 (>= 1:4.1.1)
Depends: libpoppler46 (>= 0.26.2)
Depends: libstdc++6 (>= 4.1.1)
Depends: libx11-6
Depends: libxm4 (>= 2.3.4)
Depends: libxt6
libc6
Depends: libgcc1
…
$

命令“aptitude”也适用于开关。对于依赖项,请使用开关“~R”,后跟包的名称。图 5 显示了包“xpdf”的情况。 “aptitude”输出的第二列中的字母“A”将软件包标识为自动安装。

图 5:aptitude-rdepends.png

包依赖关系可能有点棘手。它可能有助于以图形方式显示包依赖关系。使用命令“debtree”,后跟包的名称,以创建包依赖关系的图形表示。 Graphviz 包中的工具“dot”将描述转换为图像,如下所示:

$ debtree xpdf | dot -Tpng > graph.png

在图 6 中,您可以看到创建的包含依赖关系图的 PNG 图像。

图 6:dot.png

显示反向依赖

到目前为止,我们已经回答了一个包需要哪些包的问题。还有相反的方式——所谓的反向依赖。接下来的示例涉及该包以及依赖于该包的包。第一个示例使用“apt-cache”和子命令“rdepends”,如下所示:

$ apt-cache rdepends xpdf
xpdf
Reverse Depends:
|octave-doc
xpdf:i386
libfontconfig1:i386
|xmds-doc
xfe
wiipdf
|vim-latexsuite
python-scapy
|ruby-tioga
|python-tables-doc
|page-crunch
|octave-doc
|muttprint-manual
mozplugger
mlpost
libmlpost-ocaml-dev
…
$

依赖于其他包的包用管道符号标记。这些软件包不需要安装在您的系统上,但必须列在软件包数据库中。

下一个示例使用“aptitude”列出对包“xpdf”具有硬引用的包(参见图 7)。

图 7:aptitude-search.png

验证安装是否缺少软件包

“Apt-get”提供了子命令“check”,可以验证安装。如果您看到以下输出,则说明没有丢失任何包:

# apt-get check
Reading package lists… Done
Building dependency tree
Reading state information… Done
#

结论

使用正确的工具可以很好地查找包依赖关系。正确使用它们可以帮助您了解安装软件包的原因以及可能缺少哪些软件包。

链接和参考

  • Axel Beckert、Frank Hofmann:Das Debian-Paketmanagement-Buch,https://www.dpmb.org/

©2015-2025 Norria support@norria.com