# 高级软件包管理操作

## 命令行中的高级软件包管理操作

下面列出一些高级的软件包管理操作，这些操作需要你对软件包管理有一定的了解。
约定：尖括号内容为你需要替换的内容。
| 命令                                                      | 操作                                                               |
|:-------------------------------------------------------:|:----------------------------------------------------------------:|
| `COLUMNS=120 dpkg -l <packagename_pattern>`                | 列出已安装软件包的列表用于错误报告                                                |
| `dpkg -L <package_name>`                       | 显示一个已安装软件包的内容                                          |
| `dpkg -L <package_name> \| egrep '/usr/share/man/man.*/.+'` | 列出一个已安装软件包的 man 手册页                                 |
| `dpkg -S file_name_pattern`                               | 列出匹配文件名的已安装软件包                                                   |
| `apt-file search <file_name_pattern>`             | 列出档案库中匹配文件名的软件包                                        |
| `apt-file list <package_name>_pattern`                      | 列出档案库中匹配的软件包的内容                                                  |
| `dpkg-reconfigure <package_name>`                           | 重新配置软件包                                                          |
| `dpkg-reconfigure -plow <package_name>`               | 通过最详细的方式来重新配置软件包                                          |
| `configure-debian`                                        | 以全屏菜单的形式重新配置软件包                                                  |
| `dpkg --audit`                                            | 部分安装软件包的审计系统                                                     |
| `dpkg --configure -a`                                     | 配置所有部分安装的软件包                                                     |
| `apt-cache policy binary_package_name`               | 显示一个二进制软件包的可用版本、优先级和档案库信息                                 |
| `apt-cache madison <package_name>`              | 显示一个软件包的可用版本和档案库信息                                   |
| `apt-cache showsrc <binary_package_name>`        | 显示一个二进制软件包的源代码软件包信息                                          |
| `apt-get build-dep <package_name>`                  | 安装构建软件包所需要的软件包                                              |
| `aptitude build-dep <package_name>`            | 安装构建软件包所需要的软件包                                                   |
| `apt-get source <package_name>`                     | （从标准档案库）下载源代码                                                    |
| `dget <dsc 文件的 URL>`                           | （从其它档案库）下载源代码软件包                                                 |
| `dpkg-source -x <package_name_version-debian.revision>.dsc` | 从源代码软件包集合（“`*.orig.tar.gz`” 和 “`*.debian.tar.g`z`"/"`*.diff.gz`”）中构建代码树 |
| `debuild binary`                | 从本地的源代码树中构建软件包                                                   |
| `make-kpkg <kernel_image>`                    | 从内核源代码树中构建一个内核软件包                                                |
| `make-kpkg --initrd <kernel_image>`                | 从启用了 initramfs 的内核代码树中构建一个内核软件包                                  |
| `dpkg -i <package_name_version-debian.revision_arch>.deb` | 安装一个本地的软件包到系统中                                                   |
| `apt install </path/to/package_filename>.deb`         | 安装本地软件包到系统中，同时尝试自动解决依赖                                           |
| `debi <package_name_version-debian.revision_arch>.dsc`      | 安装本地软件包到系统中                                                      |
| `dpkg --get-selections '*' >selection.txt`              | 保存 dpkg 级别的软件包选择状态信息                                             |
| `dpkg --set-selections <selection.txt`                   | 使用 dpkg 设置软件包选择状态                                                |
| `echo <package_name> hold | dpkg --set-selections`  | 使用 dpkg 将一个软件包的包选择状态设置为 hold（相当于 "aptitude hold 包名"）             |

::: tip
对于一个支持多架构的软件包，你可能需要为一些命令指定架构名称。例如，使用 “dpkg -L libglib2.0-0:amd64” 来列出 amd64 架构的 libglib2.0-0 软件包的内容
:::

::: warning 小心
系统管理员应该小心使用低级的软件包工具（例如 “dpkg -i …” 和 “debi …”），它们不会自动处理所需的软件包依赖。
dpkg 的命令行选项 “--force-all” 和类似的选项（参见 dpkg(1)）只适用于高手。没有完全理解它们的效果却使用它们会破坏你的整个系统。
:::

请注意以下几点。

- 所有的系统配置和安装命令都需要以 root 运行。
- 不同于使用正则表达式的 aptitude （参见 第 1.6.2 节 “正则表达式”），
    其它的软件包管理命令使用类似于 shell glob 的通配符（参见 第 1.5.6 节 “Shell“ ））
- `apt-file`(1) 由 `apt-file` 软件包提供，并且需要先运行 “`apt-file update`”。
- `configure-debian`(8) 由 `configure-debian` 软件包提供，它运行 dpkg-reconfigure(8) 作为后端。
- `dpkg-reconfigure`(8) 使用 `debconf`(1) 作为后端来运行软件包脚本。
- "`apt-get build-dep`" 、"`apt-get source`" 和 "`apt-cache showsrc`" 命令需要 "`/etc/apt/sources.list`" 中存在 "deb-src" 条目。
- `dget`(1) 、`debuild`(1) 和 `debi`(1) 需要 `devscripts` 软件包。
参见 第 2.7.13 节 “移植一个软件包到 stable 系统” 里使用 "apt-get source" 的打包（重打包）过程。
make-kpkg 命令需要 kernel-package 软件包（参见 第 9.10 节 “内核”）。
通用打包参见 第 12.9 节 “制作 Debian 包”.

## 验证安装的软件包文件

已经安装 debsums 软件包的，能使用 debsums(1) 命令通过 "`/var/lib/dpkg/info/*.md5sums`" 文件中的 MD5sum 值，验证已安装的文件。参见第 10.3.5 节 “MD5 校验和”来获得 MD5sum 是怎样工作的信息。
::: warning 注意
因为 MD5sum 数据库可能被侵入者篡改，debsums(1) 作为安全工具使用有限。这种工具用于校验管理者造成的本地修改或媒体错误造成的损坏是很不错的
:::

## 预防软件包故障与故障处理

如果你已经加入deepin内测计划，那么我们可能会向你推送不稳定的软件包，这些软件包可能会导致系统崩溃或者其他问题。如果你不想接收这些软件包，可以在控制中心退出内测计划。
你需要关注内测SIG群，以便及时了解内测软件包的情况。

如果发现软件包有问题，可以通过以下方式反馈给我们：

- github issue
- 内测SIG群
- linuxdeepin论坛

需要你提供具体的软件包名，以及软件包的版本号，复现问题的步骤，以及系统的版本号。这方便我们快速定位问题。

如果你有一定开发经验，可以尝试自己修复问题，然后提交PR给我们。
