dpkg - Debian 的软件包管理器
概要
dpkg [选项...] 命令
警告
本手册面向希望更详细地了解 dpkg 的命令行选项和软件包状态的用户,而不仅仅是 dpkg --help 提供的。
不应将其用于软件包维护者,他们希望了解 dpkg 如何安装他们的软件包。关于 dpkg 在安装和删除软件包时执行的操作的描述尤其不足。
描述
dpkg 是一种中级工具,用于安装、构建、删除和管理 Debian 软件包。作为命令行界面 (CLI) 的主要且更用户友好的 dpkg 前端是 [apt]({filename}../../apt)(8),作为终端用户界面 (TUI) 的是 aptitude(8)。dpkg 本身完全通过命令行参数进行控制,这些参数正好是一个命令和零个或多个选项。命令参数告诉 dpkg 要执行什么操作,选项以某种方式控制命令的行为。
dpkg 也可以用作 dpkg-deb(1) 和 dpkg-query(1) 的前端。支持的命令列表稍后可以在“命令”部分中找到。如果遇到任何此类命令,dpkg 只是使用给定的参数运行 dpkg-deb 或 dpkg-query,但当前未传递任何特定选项给它们,要使用任何此类选项,需要直接调用后端。
关于软件包的信息
dpkg 维护了一些关于可用软件包的有用信息。这些信息分为三类:状态、选择状态和标志。这些值主要打算使用 dselect 进行更改。
软件包状态
未安装
该软件包未安装在您的系统上。
配置文件
仅软件包的配置文件或 postrm 脚本及其需要删除的数据存在于系统中。
半安装
软件包的安装已开始,但由于某种原因未完成。
已解包
软件包已解包,但尚未配置。
半配置
软件包已解包,并且配置已开始,但由于某种原因尚未完成。
等待触发
该软件包等待另一个软件包触发处理。
触发已完成
该软件包已被触发。
已安装
该软件包已正确解包并配置。
软件包选择状态
安装
该软件包已选择用于安装。
保留
标记为保留的软件包将保持在同一版本上,也就是说,除非明确请求或允许使用 --force-hold 选项自动执行这些操作,否则不会对其执行任何自动的新安装、升级或删除。
deinstall
该软件包已选择进行卸载(即,我们希望删除所有文件,但保留配置文件)。
purge
该软件包已选择进行清除(即,我们希望从系统目录中删除所有内容,包括配置文件)。
unknown
软件包的选择状态未知。如果软件包同时处于未安装状态且带有“ok”标志,则在下次数据库存储时,它将被忽略。
软件包标志
ok 标记为“ok”的软件包处于已知状态,但可能需要进一步处理。
reinstreq
标记为“reinstreq”的软件包已损坏,需要重新安装。除非使用 --force-remove-reinstreq 选项强制操作,否则无法删除这些软件包。
命令
-i, --install package-file...
安装软件包。如果指定了 --recursive 或 -R 选项,则 package-file 必须指向一个目录。
安装包括以下步骤:
提取新软件包的控制文件。
如果在安装新软件包之前安装了相同软件包的另一个版本,则执行旧软件包的 prerm 脚本。
运行 preinst 脚本(如果软件包提供)。
解压缩新文件,并同时备份旧文件,以便如果出现问题,可以恢复它们。
如果在安装新软件包之前安装了相同软件包的另一个版本,则执行旧软件包的 postrm 脚本。请注意,此脚本在执行新软件包的 preinst 脚本之后执行,因为新文件会在删除旧文件的同时写入。
配置软件包。有关如何执行此操作的详细信息,请参阅 --configure。
--unpack package-file...
解压缩软件包,但不进行配置。如果指定了 --recursive 或 -R 选项,则 package-file 必须指向一个目录。
将处理 Pre-Depends 触发器,除非指定了 --no-triggers。
--configure package...|-a|--pending
配置已解压缩但尚未配置的软件包。如果指定 -a 或 --pending 而不是软件包,则将配置所有已解压缩但未配置的软件包。
要重新配置已配置的软件包,请尝试使用 dpkg-reconfigure(8) 命令(它是 debconf 项目的一部分)。
配置包括以下步骤:
解压缩 conffiles,并同时备份旧的 conffiles,以便如果出现问题,可以恢复它们。
运行 postinst 脚本(如果软件包提供)。
将处理触发器,除非指定了 --no-triggers。
--triggers-only package...|-a|--pending
仅处理触发器(自 dpkg 1.14.17 起)。所有待处理的触发器都将被处理。如果提供了软件包名称,则仅处理这些软件包的触发器,且仅处理一次。使用此选项可能会导致软件包处于不正确的 triggers-awaited 和 triggers-pending 状态。稍后可以通过运行以下命令来修复:dpkg --configure --pending。
-r, --remove package...|-a|--pending
移除已安装的软件包。这将移除所有内容,除了配置文件和其他由 postrm 脚本清理的数据,这可以避免在稍后重新安装软件包时需要重新配置软件包(配置文件是列在 DEBIAN/conffiles 控制文件中的文件)。如果不存在 DEBIAN/conffiles 控制文件或 DEBIAN/postrm 脚本,则此命令等效于调用 --purge。如果给出 -a 或 --pending 而不是软件包名称,则将移除所有已解压缩但标记为在文件 /var/lib/dpkg/status 中删除的软件包。
移除软件包包括以下步骤:
运行 prerm 脚本。
移除已安装的文件。
运行 postrm 脚本。
除非指定了 --no-triggers,否则将处理触发器。
-P, --purge package...|-a|--pending
清除已安装或已移除的软件包。这将移除所有内容,包括配置文件和 postrm 清理的任何其他内容。如果给出 -a 或 --pending 而不是软件包名称,则将清除所有已解压缩或已移除但标记为在文件 /var/lib/dpkg/status 中进行清除的软件包。
注意:某些配置文件可能对 dpkg 未知,因为它们是通过配置脚本单独创建和管理的。在这种情况下,dpkg 本身不会删除它们,但软件包的 postrm 脚本(由 dpkg 调用)必须在清除期间负责删除它们。当然,这仅适用于系统目录中的文件,而不适用于写入各个用户主目录的配置文件。
清除软件包包括以下步骤:
如果尚未移除,则移除该软件包。有关详细信息,请参阅 --remove。
运行 postrm 脚本。
除非指定了 --no-triggers,否则将处理触发器。
-V, --verify [package-name...]
验证软件包名称或所有软件包的完整性(如果省略),方法是将软件包安装的文件与 dpkg 数据库中存储的文件元数据信息进行比较(自 dpkg 1.17.2 起)。数据库中文件元数据信息的来源是二进制软件包本身。这些元数据在安装过程的软件包解压缩时收集。
当前执行的唯一功能性检查是对文件内容的 md5sum 验证,与数据库中存储的值进行比较。只有当数据库包含文件 md5sum 时,才会进行检查。要检查数据库中是否存在任何缺失的元数据,可以使用 --audit 命令。这只是一个完整性检查,不应将其视为任何形式的安全验证。
输出格式可以使用 --verify-format 选项选择,默认情况下使用 rpm 格式,但未来可能会更改,因此,解析此命令输出的程序应明确指定其期望的格式。
-C, --audit [package-name...]
对 package-name 或所有软件包执行数据库的完整性和一致性检查(如果省略)。例如,搜索系统中仅部分安装的软件包,或者缺少、错误或过时的控制数据或文件。dpkg 将建议如何修复它们。
--update-avail [Packages-file]
--merge-avail [Packages-file]
更新 dpkg 和 dselect 中有关可用软件包的信息。使用 --merge-avail 命令,旧信息将与 Packages-file 中的信息合并。使用 --update-avail 命令,旧信息将被 Packages-file 中的信息替换。随 Debian 分发的 Packages-file 简单地命名为“Packages”。如果缺少 Packages-file 参数或命名为“-”,则将从标准输入读取它(自 dpkg 1.17.7 起)。dpkg 将其关于可用软件包的记录保存在 /var/lib/dpkg/available 中。
一个更简单的单次命令,用于检索和更新可用文件是 dselect update。请注意,如果不同时使用基于 APT 的前端,则此文件几乎没有用处:APT 有自己的系统来跟踪可用软件包。
-A, --record-avail package-file...
使用 package-file 中的信息更新 dpkg 和 dselect 中有关可用软件包的信息。如果指定了 --recursive 或 -R 选项,则 package-file 必须引用一个目录。
--forget-old-unavail
现在已过时,并且是一个空操作,因为 dpkg 将自动忘记未安装的不可用软件包(自 dpkg 1.15.4 起),但仅限于不包含用户信息的软件包(例如软件包选择)。
--clear-avail
清除有关可用软件包的现有信息。
--get-selections [package-name-pattern...]
获取软件包选择列表,并将其写入标准输出。如果没有指定模式,则将不会显示未安装的软件包(即,之前已删除的软件包)。
--set-selections
使用从标准输入读取的文件设置软件包选择。该文件应采用“软件包 状态”的格式,其中状态为 install、hold、deinstall 或 purge。允许使用空行和以“#”开头的注释行。
为了使此命令有用,可用文件需要是最新的,否则未知的软件包将被忽略并显示警告。有关更多信息,请参见 --update-avail 和 --merge-avail 命令。
--clear-selections
将所有非必需软件包的请求状态设置为 deinstall(自 dpkg 1.13.18 起)。这旨在用于在执行 --set-selections 之前使用,以卸载任何未包含在传递给 --set-selections 的列表中的软件包。
--yet-to-unpack
搜索已选择用于安装但由于某种原因仍未安装的软件包。
注意:此命令同时使用可用的文件和软件包选择。
--predep-package
打印单个软件包,该软件包是一个或多个相关预依赖项的目标,并且本身没有未满足的预依赖项。
如果存在这样的软件包,则将其作为“Packages”文件条目输出,可以根据需要进行修改。
注意:此命令同时使用可用的文件和软件包选择。
如果打印了软件包,则返回 0;如果没有可用的软件包,则返回 1;如果发生错误,则返回 2。
--add-architecture 架构
将架构添加到允许安装软件包的架构列表中,无需使用 `--force-architecture`(自 dpkg 1.16.2 起)。dpkg 构建的架构(即 `--print-architecture` 的输出)始终是该列表的一部分。
--remove-architecture 架构
从允许安装软件包的架构列表中删除架构,无需使用 `--force-architecture`(自 dpkg 1.16.2 起)。如果该架构当前正在数据库中使用,则除非指定了 `--force-architecture`,否则该操作将被拒绝。dpkg 构建的架构(即 `--print-architecture` 的输出)不能从该列表中删除。
--print-architecture
打印 dpkg 安装软件包的架构(例如,“i386”)。
--print-foreign-architectures
打印一个换行分隔的列表,其中包含 dpkg 配置为允许安装软件包的其他架构(自 dpkg 1.16.2 起)。
--assert-help
提供有关 `--assert-feature` 选项的帮助(自 dpkg 1.21.0 起)。
--assert-feature
断言 dpkg 支持请求的功能。如果完全支持该功能,则返回 0;如果该功能已知但 dpkg 尚未提供对其的支持,则返回 1;如果该功能未知,则返回 2。当前可断言的功能列表是:
support-predepends
支持“Pre-Depends”字段(自 dpkg 1.1.0 起)。
working-epoch
支持版本字符串中的 epoch(自 dpkg 1.4.0.7 起)。
long-filenames
支持 deb(5) 存档中的长文件名(自 dpkg 1.4.1.17 起)。
multi-conrep
支持多个“Conflicts”和“Replaces”(自 dpkg 1.4.1.19 起)。
multi-arch
支持多架构字段和语义(自 dpkg 1.16.2 起)。
versioned-provides
支持带版本的“Provides”(自 dpkg 1.17.11 起)。
protected-field
支持“Protected”字段(自 dpkg 1.20.1 起)。
--validate-thing 字符串
验证字符串是否具有正确的语法(自 dpkg 1.18.16 起)。如果字符串有效,则返回 0;如果字符串无效,但在宽松的上下文中可能会被接受,则返回 1;如果字符串无效,则返回 2。当前可以验证的字符串列表是:
pkgname
验证给定的软件包名称(自 dpkg 1.18.16 起)。
trigname
验证给定的触发器名称(自 dpkg 1.18.16 起)。
archname
验证给定的架构名称(自 dpkg 1.18.16 起)。
version
验证给定的版本(自 dpkg 1.18.16 起)。
--compare-versions ver1 op ver2
比较版本号,其中 op 是一个二进制运算符。dpkg 如果指定的条件满足,则返回 true (0),否则返回 false (1)。有两组运算符,它们在处理空的 ver1 或 ver2 时有所不同。这些运算符将空版本视为早于任何版本:lt le eq ne ge gt。这些运算符将空版本视为晚于任何版本:lt-nl le-nl ge-nl gt-nl。这些运算符仅是为了与控制文件语法兼容:< << <= = >= >> >。< 和 > 运算符已过时,不应使用,因为它们的语义令人困惑。例如:0.1 < 0.1 的结果为 true。
-?, --help
显示简短的帮助消息。
--force-help
显示关于 --force-thing 选项的帮助信息。
-Dh, --debug=help
显示关于调试选项的帮助信息。
--version
显示 dpkg 版本信息。
当与 --robot 一起使用时,输出将是程序版本号,采用带点的数字格式,不带换行符。
dpkg-deb 命令
有关以下命令以及 dpkg 前端未公开的其他命令和选项,请参阅 dpkg-deb(1)。
-b, --build directory [archive|directory]
构建 deb 包。
-c, --contents archive
列出 deb 包的内容。
-e, --control archive [directory]
从包中提取控制信息。
-x, --extract archive directory
提取包中包含的文件。
-X, --vextract archive directory
提取并显示包中包含的文件名。
-f, --field archive [control-field...]
显示包的控制字段。
--ctrl-tarfile archive
输出 Debian 包中包含的控制 tar 文件。
--fsys-tarfile archive
输出 Debian 包中包含的文件系统 tar 文件。
-I, --info archive [control-file...]
显示有关包的信息。
dpkg-query 命令
有关以下命令以及 dpkg 前端未公开的其他命令和选项,请参阅 dpkg-query(1)。
-l, --list package-name-pattern...
列出与给定模式匹配的包。
-s, --status package-name...
报告指定包的状态。
-L, --listfiles package-name...
列出从包安装到您的系统中的文件。
-S, --search filename-search-pattern...
搜索已安装包中的文件名。
-p, --print-avail package-name...
显示有关 package-name 的详细信息,这些信息可以在 /var/lib/dpkg/available 中找到。使用基于 APT 的前端的用户应使用 apt show package-name 代替。
选项
所有选项都可以在命令行中指定,也可以在 dpkg 配置文件 /etc/dpkg/dpkg.cfg 或片段文件(名称与此 shell 模式 [0-9a-zA-Z_-]* 匹配)中指定,这些文件位于配置目录 /etc/dpkg/dpkg.cfg.d/ 中。配置文件中的每一行要么是一个选项(与命令行选项完全相同,但没有前导连字符),要么是一个注释(如果它以“#”开头)。
--abort-after=number
更改 dpkg 在多少错误后中止。默认值为 50。
-B, --auto-deconfigure
当卸载一个软件包时,可能会出现另一个已安装的软件包依赖于该已卸载软件包的情况。指定此选项将导致自动解配置软件包,该软件包依赖于已卸载的软件包。
-Doctal, --debug=octal
启用调试。octal 由以下列表中所需的数值进行按位 OR 运算(请注意,这些值可能会在未来的版本中更改)。-Dh 或 --debug=help 将显示这些调试值。
数值 描述 1 通常有用的进度信息 2 维护脚本的调用和状态 10 每个处理的文件输出 100 每个处理的文件的大量输出 20 每个配置文件输出 200 每个配置文件的庞大输出 40 依赖关系和冲突 400 大量依赖关系/冲突输出 10000 触发器激活和处理 20000 大量关于触发器的输出 40000 关于触发器的大量无意义输出 1000 关于例如 dpkg/info 目录的大量无用信息 2000 大量无用的信息
--force-things
--no-force-things, --refuse-things
强制或拒绝(no-force 和 refuse 含义相同)执行某些操作。things 是一个逗号分隔的列表,指定了以下操作。--force-help 将显示一条描述这些操作的消息。带有 (*) 标记的操作默认强制执行。
警告:这些选项主要供专家使用。在完全了解其影响之前使用它们可能会破坏整个系统。
all:
启用(或禁用)所有强制选项。
downgrade(*):
安装一个软件包,即使已经安装了较新版本。
警告:目前,dpkg 在降级时不会进行任何依赖性检查,因此不会警告您降级是否会破坏其他软件包的依赖关系。这可能会产生严重的副作用,降级基本系统组件甚至可能使整个系统无法使用。请谨慎使用。
configure-any:
配置当前软件包所依赖的任何已解压但未配置的软件包。
hold:
允许自动安装、升级或删除软件包,即使这些软件包被标记为“保留”。注意:当这些操作被显式请求时,始终会忽略“保留”软件包选择状态。
remove-reinstreq:
删除一个软件包,即使该软件包已损坏并被标记为需要重新安装。这可能会导致软件包的某些部分保留在系统中,然后 dpkg 会忘记这些部分。
remove-protected:
删除,即使该软件包被视为受保护的(自 dpkg 1.20.1 起)。受保护的软件包主要包含重要的系统启动基础设施或用于自定义的系统本地元软件包。删除它们可能会导致整个系统无法启动或失去所需的运行功能,因此请谨慎使用。
remove-essential:
删除,即使该软件包被视为必需的。必需的软件包主要包含非常基本的 Unix 命令,这些命令对于软件包系统、系统的整体运行或启动期间(尽管后者应转换为受保护的软件包)是必需的。删除它们可能会导致整个系统停止工作,因此请谨慎使用。
depends:
将所有依赖问题转换为警告。 这会影响“Pre-Depends”和“Depends”字段。
depends-version:
在检查依赖关系时,忽略版本。 这会影响“Pre-Depends”和“Depends”字段。
breaks:
即使安装会破坏另一个软件包,也进行安装(自 dpkg 1.14.6 起)。 这会影响“Breaks”字段。
conflicts:
即使存在冲突,也进行安装。 这很危险,因为它通常会导致某些文件被覆盖。 这会影响“Conflicts”字段。
confmiss:
始终安装缺少的配置文件,无需提示。 这很危险,因为它意味着不会保留对文件的更改(删除)。
confnew:
如果配置文件已被修改,并且软件包中的版本已更改,则始终安装新版本,无需提示,除非同时指定了 --force-confdef,在这种情况下,将首选默认操作。
confold:
如果配置文件已被修改,并且软件包中的版本已更改,则始终保留旧版本,无需提示,除非同时指定了 --force-confdef,在这种情况下,将首选默认操作。
confdef:
如果配置文件已被修改,并且软件包中的版本已更改,则始终选择默认操作,无需提示。 如果没有默认操作,它将停止提示用户,除非同时指定了 --force-confnew 或 --force-confold,在这种情况下,它将使用这些选项来确定最终操作。
confask:
如果配置文件已被修改,则始终提供将其替换为软件包中版本的选项,即使软件包中的版本未更改(自 dpkg 1.15.8 起)。 如果同时指定了 --force-confnew、--force-confold 或 --force-confdef,它将用于确定最终操作。
overwrite:
用另一个软件包的文件覆盖一个软件包的文件。
overwrite-dir:
用另一个软件包的文件覆盖一个软件包的目录。
overwrite-diverted:
用未重定向的版本覆盖重定向的文件。
statoverride-add:
在添加时,覆盖现有的 stat 覆盖(自 dpkg 1.19.5 起)。
statoverride-remove:
在删除时,忽略缺少的 stat 覆盖(自 dpkg 1.19.5 起)。
security-mac(*):
在将文件安装到文件系统中时,使用特定于平台的基于强制访问控制 (MAC) 的安全机制(自 dpkg 1.19.5 起)。 在 Linux 系统上,该实现使用 SELinux。
unsafe-io:
在解包时,不执行安全 I/O 操作(自 dpkg 1.15.8.6 起)。 当前,这意味着在文件重命名之前不执行文件系统同步,这已知会导致某些文件系统发生重大性能下降,不幸的是,这些文件系统正是由于其不可靠的行为,在发生突然的系统崩溃时会产生零长度的文件,因此需要执行安全 I/O 操作。
注意:对于 ext4,主要的问题在于,可以考虑使用挂载选项 nodelalloc,它将修复性能下降和数据安全问题,后者是通过防止在任何未在原子重命名之前执行同步操作的软件发生系统突然崩溃时,文件系统产生零长度文件来实现的。
警告:使用此选项可能会提高性能,但可能会导致数据丢失,请谨慎使用。
script-chrootless:
即使软件包不支持此操作模式,也可以在不使用 chroot(2) 进入 instdir 的情况下运行维护程序脚本(自 dpkg 1.18.5 起)。
警告:这可能会破坏您的主机系统,请极其谨慎地使用。
architecture:
处理具有错误架构或没有架构的软件包。
bad-version:
处理具有错误版本的软件包(自 dpkg 1.16.1 起)。
bad-path:
PATH 缺少重要的程序,因此可能会出现问题。
not-root:
尝试在非 root 用户状态下(卸)安装程序。
bad-verify:
即使软件包未能通过身份验证检查,也可以安装它。
--ignore-depends=package,...
忽略指定软件包的依赖项检查(实际上,会执行检查,但只会给出冲突的警告,不会执行其他操作)。这会影响 Pre-Depends、Depends 和 Breaks 字段。
--no-act、--dry-run、--simulate
执行所有应该执行的操作,但不写入任何更改。这用于查看在不实际修改任何内容的情况下,指定命令会发生什么。
请确保在命令参数之前给出 --no-act,否则您可能会得到不希望的结果(例如,dpkg --purge foo --no-act 首先会卸载软件包“foo”,然后尝试卸载软件包“--no-act”,尽管您可能希望它实际上什么都不做)。
-R、--recursive
递归处理在指定目录及其所有子目录中找到的所有匹配模式 *.deb 的常规文件。这可与 -i、-A、--install、--unpack 和 --record-avail 命令一起使用。
-G 不要安装软件包,如果已安装了较新版本的相同软件包。这是 --refuse-downgrade 的别名。
--admindir=directory
将管理目录设置为 directory。此目录包含许多文件,这些文件提供有关已安装或未安装软件包的状态等信息。如果未设置 DPKG_ADMINDIR,则默认设置为“/var/lib/dpkg”。
--instdir=directory
设置安装目录,即软件包要安装到的目录。instdir 也是传递给 chroot(2) 在运行软件包的安装脚本之前使用的目录,这意味着脚本将 instdir 视为根目录。如果未设置 DPKG_ROOT,则默认设置为“/”(自 dpkg 1.21.10 起)。
--root=directory
将根目录设置为 directory,这将设置安装目录为“directory”,并将管理目录设置为“directory/var/lib/dpkg”,如果未设置 DPKG_ROOT(自 dpkg 1.21.10 起)。
-O, --selected-only
仅处理那些被选定用于安装的软件包。实际的标记操作由 dselect 或 dpkg 在处理软件包时完成。例如,当一个软件包被移除时,它将被标记为用于卸载。
-E, --skip-same-version
如果已安装相同版本和架构的软件包,则不安装该软件包。
从 dpkg 1.21.10 开始,还会考虑架构,这使得可以交叉升级软件包或安装具有相同版本但不同架构的附加可同时安装的实例。
--pre-invoke=command
--post-invoke=command
设置一个 invoke 钩子命令,通过“sh -c”在 dpkg 为解包、配置、安装、仅触发、移除和清除操作(从 dpkg 1.15.4 开始),以及添加架构和移除架构操作(从 dpkg 1.17.19 开始)运行时,在操作之前或之后运行。此选项可以多次指定。选项指定的顺序将被保留,配置文件中的选项将优先。环境变量 DPKG_HOOK_ACTION 将被设置为当前 dpkg 操作,供钩子使用。
当指定了 --no-act 或以非 root 用户身份运行时(除非使用 --force-not-root),invoke 钩子将不会被执行。
注意:前端可能会为每个调用调用 dpkg 多次,这可能会导致钩子运行的次数超过预期。
--path-exclude=glob-pattern
--path-include=glob-pattern
将 glob-pattern 设置为路径过滤器,通过排除或重新包含在安装期间匹配指定模式的先前排除的路径(从 dpkg 1.15.8 开始)。
警告:请注意,根据排除的路径,您可能会完全破坏您的系统,请谨慎使用。
glob 模式使用与 shell 中相同的通配符,其中“”匹配任何字符序列,包括空字符串,也匹配“/”。例如,“/usr//READ*”匹配“/usr/share/doc/package/README”。通常,“?”匹配任何单个字符(同样也包括“/”)。并且“[”开始一个字符类,该类可以包含一个字符列表、范围和补集。有关 globbing 的详细信息,请参阅 glob(7)。注意:当前实现可能会重新包含比需要的更多的目录和符号链接,特别是当存在更具体的重新包含时,为了安全起见并避免可能的解包失败;未来的工作可能会修复这个问题。
这可用于删除所有路径,除了某些特定路径;一个典型的例子是:
--path-exclude=/usr/share/doc/*
--path-include=/usr/share/doc/*/copyright
以删除所有文档文件,但保留版权文件。
这两个选项可以多次指定,并且可以相互交错。两者都按照给定的顺序处理,并且最后一个匹配文件名的规则将做出决定。
这些过滤器是在解包二进制软件包时应用的,因此它们只能了解当前正在过滤的对象类型(例如,普通文件或目录),并且无法了解后续对象。 由于这些过滤器具有副作用(与 find(1) 过滤器相反),因此排除恰好是目录对象的确切路径(例如 /usr/share/doc)不会产生预期的结果,并且仅排除该路径(如果代码认为有必要,则该路径可能会被自动重新包含)。 随后包含在该目录中的任何文件都将无法解包。
提示:确保 shell 不会扩展通配符。
--verify-format format-name
设置 --verify 命令的输出格式(从 dpkg 1.17.2 开始)。
当前仅支持的输出格式为 rpm,它由一行表示,其中包含所有未能通过任何检查的路径。 这些行的格式如下:
missing [c] pathname [(error-message)]
?M5?????? [c] pathname
前 9 个字符用于报告检查结果,要么是字面上的 missing,表示文件不存在或无法获取其元数据,要么是以下特殊字符之一,它们报告每个检查的结果:
‘?’ 表示无法执行检查(缺少支持、文件权限等)。
‘.’ 表示检查已通过。
‘A-Za-z0-9’
表示特定检查失败。 目前支持以下位置和字母数字字符:
1‘?’
这些检查当前不受支持,始终为 ‘?’。
2‘M’
文件模式检查失败(从 dpkg 1.21.0 开始)。 由于当前未跟踪路径名元数据,因此此检查只能通过对具有已知摘要的路径名执行非常简单的启发式方法来部分模拟,这表示它们应该是常规文件,在这种情况下,如果路径名不是文件系统上的常规文件,则检查将失败。 此检查当前永远不会成功,因为它没有足够的信息。
3‘5’
摘要检查失败,这意味着文件内容已更改。 这仅是完整性检查,不应将其视为任何类型的安全验证。
49 ‘?’
这些检查当前不受支持,始终为 ‘?’。
该行后跟一个空格和一个属性字符。 支持以下属性字符:
‘c’ 路径名是配置文件。
最后后跟另一个空格和路径名。
如果该条目是“missing”类型,并且该文件实际上未存在于文件系统中,则该行后跟一个空格和用括号括起来的错误消息。
--status-fd n
将机器可读的软件包状态和进度信息发送到文件描述符 n。 可以多次指定此选项。 通常,信息为每行一条记录,格式如下:
status: package: status
软件包状态已更改;状态与状态文件中的状态相同。
status: package : error : extended-error-message
发生错误。extended-error-message 中可能存在的任何换行符在输出之前都将被转换为空格。
status: file : conffile-prompt : 'real-old' 'real-new' useredited distedited
正在向用户询问一个配置文件问题。
processing: stage: package
在处理阶段开始之前发送。stage 是以下之一:upgrade、install(在解包之前发送)、configure、trigproc、disappear、remove、purge。
--status-logger=command
将机器可读的软件包状态和进度信息发送到 shell 命令的标准输入,以便通过“sh -c”运行。此选项可以多次指定。使用的输出格式与 --status-fd 中使用的格式相同。
当指定 --no-act 时,或者在非 root 用户下运行且未使用 --force-not-root 时,状态记录器不会执行。
--log=filename
将状态更改更新和操作记录到 filename,而不是默认的 /var/log/dpkg.log。如果多次指定此选项,则使用最后一个文件名。日志消息的格式如下:
YYYY-MM-DD HH:MM:SS startup type command
对于每次 dpkg 调用,其中 type 为 archives(command 为 unpack 或 install)或 packages(command 为 configure、triggers-only、remove 或 purge)。
YYYY-MM-DD HH:MM:SS status state pkg installed-version
用于状态更改更新。
YYYY-MM-DD HH:MM:SS action pkg installed-version available-version
用于操作,其中 action 为 install、upgrade、configure、trigproc、disappear、remove 或 purge。
YYYY-MM-DD HH:MM:SS conffile filename decision
用于配置文件更改,其中 decision 为 install 或 keep。
--robot
使用机器可读的输出格式。这为需要解析某些命令的输出的程序提供了一个接口,而这些命令本身不会输出机器可读的格式。不使用本地化,并且会修改输出以使其更易于解析。
当前唯一支持的命令是 --version。
--no-pager
禁用在显示信息时使用任何分页器(自 dpkg 1.19.2 起)。
--no-debsig
不尝试验证软件包签名。
--no-triggers
在此运行中不运行任何触发器(自 dpkg 1.14.17 起),但仍会记录激活。如果与 --configure package 或 --triggers-only package 一起使用,则即使只需要运行触发器,指定的软件包的 postinst 仍然会运行。使用此选项可能会导致软件包处于不正确的触发器等待状态和触发器挂起状态。以后可以通过运行以下命令来修复:dpkg --configure --pending。
--triggers
取消先前的 --no-triggers(自 dpkg 1.14.17 起)。
退出状态
0 请求的命令已成功执行。或者,检查或断言命令返回了 true。
1 检查或断言命令返回 false。
2 由于命令行用法无效,或与系统的交互(例如访问数据库、内存分配等)而导致的致命或无法恢复的错误。
环境
外部环境
PATH
此变量应在环境中定义,并指向系统路径,其中可以找到几个必需的程序。如果未设置或未找到程序,dpkg 将中止。
HOME
如果设置,dpkg 将使用它作为读取用户特定配置文件目录。
TMPDIR
如果设置,dpkg 将使用它作为创建临时文件和目录的目录。
SHELL
当启动新的交互式 shell 时,或者通过 shell 启动命令时,程序 dpkg 将执行。
PAGER
DPKG_PAGER
当运行分页器时,dpkg 将执行此程序,它将使用“$SHELL -c”执行,例如,在显示 conffile 差异时。如果未设置 SHELL,则将使用“sh”。
DPKG_PAGER 覆盖 PAGER 环境变量(自 dpkg 1.19.2 起)。如果 DPKG_PAGER 或 PAGER 指向的程序都不存在,则将按以下顺序尝试以下程序(自 dpkg 1.22.12 起):默认分页器 pager,然后 less(1),more(1),最后 cat(1)。
DPKG_COLORS
设置颜色模式(自 dpkg 1.18.5 起)。当前接受的值为:auto(默认)、always 和 never。
DPKG_NLS
如果设置,它将用于决定是否启用本机语言支持,也称为国际化 (i18n) 支持(自 dpkg 1.22.7 起)。接受的值为:0 和 1(默认)。
DPKG_DEBUG
从八进制值设置调试掩码(自 dpkg 1.21.10 起)。当前接受的标志在 --debug 选项中描述。
DPKG_FORCE
设置强制标志(自 dpkg 1.19.5 起)。如果存在此变量,则不应用任何内置的强制默认值。如果变量存在但为空,则将禁用所有强制标志。
DPKG_ROOT
如果设置,并且未指定 --instdir 或 --root 选项,则它将用作文件系统根目录(自 dpkg 1.21.10 起)。
DPKG_ADMINDIR
如果设置,并且未指定 --admindir 或 --root 选项,则它将用作 dpkg 管理目录(自 dpkg 1.20.0 起)。
DPKG_FRONTEND_LOCKED
由包管理器前端设置,以通知 dpkg 不应获取前端锁(自 dpkg 1.19.1 起)。
DPKG_PATH_PASSWD
设置系统 passwd 文件的路径名。此路径相对于 --root 目录。默认值为 /etc/passwd。
自 dpkg 1.22.16 起。
DPKG_PATH_GROUP
设置系统 group 文件的路径名。此路径相对于 --root 目录。默认值为 /etc/group。
自 dpkg 1.22.16 起。
内部环境
LESS
由 dpkg 定义为“-FRSXMQ”,如果尚未设置,则在启动分页器时(自 dpkg 1.19.2 起)。要更改默认行为,可以将此变量预设为其他值,包括空字符串,或者可以将 PAGER 或 DPKG_PAGER 变量设置为禁用特定选项,例如 DPKG_PAGER="less -+F"。
DPKG_ROOT
由 dpkg 在维护脚本环境中定义,用于指示要操作的安装目录(自 dpkg 1.18.5 起)。该值旨在作为前缀添加到维护脚本操作的任何路径中。在正常操作期间,此变量为空。当将软件包安装到不同的 `instdir` 时,dpkg 通常会使用 `chroot(2)` 调用来执行维护脚本,并使此变量为空,但如果指定了 `--force-script-chrootless`,则跳过 `chroot(2)` 调用,并设置此变量为 `instdir`(这将是非空的)。
DPKG_ADMINDIR
由 dpkg 在维护脚本环境中定义,用于指示要使用的 dpkg 管理目录(自 dpkg 1.16.0 起)。此变量始终设置为当前 `--admindir` 值。
DPKG_FORCE
由 dpkg 在子进程环境中定义,用于表示当前启用的所有强制选项名称,这些选项名称由逗号分隔(自 dpkg 1.19.5 起)。
DPKG_SHELL_REASON
由 dpkg 在为检查情况而生成配置文件的 shell 中定义(自 dpkg 1.15.6 起)。当前有效值为:`conffile-prompt`。
DPKG_CONFFILE_OLD
由 dpkg 在为检查情况而生成配置文件的 shell 中定义(自 dpkg 1.15.6 起)。包含旧配置文件的路径。
DPKG_CONFFILE_NEW
由 dpkg 在为检查情况而生成配置文件的 shell 中定义(自 dpkg 1.15.6 起)。包含新配置文件的路径。
DPKG_HOOK_ACTION
由 dpkg 在执行钩子操作时生成的 shell 中定义(自 dpkg 1.15.4 起)。包含当前的 dpkg 操作。
DPKG_RUNNING_VERSION
由 dpkg 在维护脚本环境中定义,用于表示当前正在运行的 dpkg 实例的版本(自 dpkg 1.14.17 起)。
DPKG_MAINTSCRIPT_PACKAGE
由 dpkg 在维护脚本环境中定义,用于表示正在处理的软件包的名称(非架构限定)(自 dpkg 1.14.17 起)。
DPKG_MAINTSCRIPT_PACKAGE_REFCOUNT
由 dpkg 在维护脚本环境中定义,用于表示软件包引用计数,即状态大于未安装的软件包实例数(自 dpkg 1.17.2 起)。
DPKG_MAINTSCRIPT_ARCH
由 dpkg 在维护脚本环境中定义,用于表示软件包构建的架构(自 dpkg 1.15.4 起)。
DPKG_MAINTSCRIPT_NAME
由 dpkg 在维护脚本环境中定义,用于表示正在运行的脚本的名称,可以是 `preinst`、`postinst`、`prerm` 或 `postrm`(自 dpkg 1.15.7 起)。
DPKG_MAINTSCRIPT_DEBUG
由 dpkg 在维护脚本环境中定义,用于表示一个值('0' 或 '1'),指示是否请求对维护脚本进行调试(使用 `--debug` 选项)(自 dpkg 1.4 起)。
文件
/etc/dpkg/dpkg.cfg.d/[0-9a-zA-Z_-]*
配置片段文件(自 dpkg 1.15.4 起)。
/etc/dpkg/dpkg.cfg
包含默认选项的配置文件。
/var/log/dpkg.log
默认日志文件(请参阅 /etc/dpkg/dpkg.cfg 和 --log 选项)。
以下其他文件位于其默认目录中,请参阅 --admindir 选项,以了解如何更改这些文件的位置。
/var/lib/dpkg/available
可用软件包列表。
/var/lib/dpkg/status
可用软件包的状态。此文件包含有关软件包是否标记为删除、是否已安装等信息。请参阅“软件包信息”部分,了解更多信息。
状态文件每天备份到 /var/backups。如果由于文件系统问题而丢失或损坏,它可能会很有用。
二进制软件包的格式和内容在 deb(5) 中描述。
文件系统文件名
在解包和配置期间,dpkg 使用各种文件名进行备份和回滚。以下是对这些文件名在软件包安装期间的使用方式的简化说明。
*.dpkg-new
在解包期间,dpkg 将新的文件系统对象提取到 pathname.dpkg-new(除了现有的目录或指向目录的符号链接,这些将被跳过)。完成后,在对旧对象执行备份之后,这些对象将被重命名为 pathname。
*.dpkg-tmp
在解包期间,dpkg 将旧文件系统对象的备份提取到 pathname.dpkg-tmp,然后再提取新的对象。这些备份将作为目录的重命名(但仅当它们切换文件类型时)、符号链接的新符号链接复制或任何其他文件系统的硬链接来执行,除了配置文件,因为它们将在稍后阶段处理。
如果需要回滚,这些备份将用于恢复对象的先前内容。这些备份将在安装完成后自动删除。
*.dpkg-old
在配置期间,当安装新版本时,dpkg 可以将先前修改的配置文件备份到 pathname.dpkg-old。
*.dpkg-dist
在配置期间,当保留旧版本时,dpkg 可以将新的未修改的配置文件备份到 pathname.dpkg-dist。
安全性
任何需要对数据库或文件系统进行写访问的操作都将被视为特权操作,可能会允许进行 root 权限提升。这些操作绝不能委托给不受信任的用户或在不受信任的软件包上执行,因为这可能会允许不受信任的用户获得系统的 root 访问权限。
某些操作(例如软件包验证)可能需要 root 权限才能访问文件系统上的文件,否则由于受限的权限,这些文件将无法访问,但应正常工作并在这些情况下生成适当的消息。
查询操作绝不应需要 root 权限,并且通过某种 gain-root 命令将它们的执行委托给非特权用户可能会带来安全隐患(例如权限提升),例如,当工具自动调用分页器时。
请参阅 dpkg-deb(1) 和 dpkg-split(1) 手册页的“安全性”部分。
错误
--no-act 通常提供的信息不足。
示例
要列出与编辑器 vi(1) 相关的已安装软件包(请注意,dpkg-query 默认情况下不再加载可用文件,并且应使用 dpkg-query --load-avail 选项来代替):
dpkg -l '*vi*'
要查看 /var/lib/dpkg/available 中两个软件包的条目:
dpkg --print-avail vim neovim | less
要自行搜索软件包列表:
dpkg --print-avail | less
要删除已安装的 neovim 软件包:
dpkg -r neovim
要安装软件包,首先需要在归档或介质光盘中找到它。当使用基于池结构的归档时,知道归档区域和软件包名称足以推断出路径:
dpkg -i /media/bdrom/pool/main/v/vim/vim_9.0.2018-1_amd64.deb
要制作软件包选择状态的本地副本:
dpkg --get-selections >myselections
您可以将此文件传输到另一台计算机,并在那里使用您选择的软件包管理器前端更新可用文件(有关更多详细信息,请参见 [https://wiki.debian.org/Teams/Dpkg/FAQ#set-selections]),例如:
apt-cache dumpavail | dpkg --merge-avail
然后,您可以使用以下命令安装它:
dpkg --clear-selections
dpkg --set-selections <myselections
请注意,这不会实际安装或删除任何内容,而只是设置请求软件包的选择状态。您需要使用其他应用程序来实际下载并安装请求的软件包。例如,运行 apt-get dselect-upgrade。
通常,您会发现 dselect(1) 提供了一种更方便的方式来修改软件包选择状态。
附加功能
可以通过安装以下任何软件包来获得附加功能:apt、aptitude 和 debsig-verify。
参见
aptitude(8)、apt(8)、dselect(1)、dpkg-deb(1)、dpkg-query(1)、deb(5)、deb-control(5)、dpkg.cfg(5) 和 dpkg-reconfigure(8)。
作者
请参见 /usr/share/doc/dpkg/THANKS,以获取对 dpkg 做出贡献的人员列表。