# Debian软件包管理前提

## 软件包配置

下面是 Debian 系统软件包配置的一些要点。

- Debian 尊重系统管理员的手动配置。换句话说，软件包配置系统不会为了方便而去更改那些配置。

- 每个软件包都带有自己的配置脚本，它使用标准用户接口 debconf(7) 来帮助软件包初始化安装过程。

- Debian 开发者通过软件包配置脚本，尽力使你能有一个完美的升级体验。

- 系统管理员可以使用软件包工具的全部功能。但在默认的安装中会禁用那些具有安全风险的。

- 如果你手动激活了一些具有安全隐患的服务，你有责任遏制风险。

- 高深的配置可以由系统管理员手动启用。这可能会对用于系统配置的通用流行帮助程序造成干

## 基本的注意事项

::: warning
不要从任何的混合源中安装软件包。它可能会打破软件包的一致性，这需要你要深厚的系统管理知识，例如 ABI 编译器、库版本和解释器特性等等。
比如不要混用deepin v20和 v23的源，也不能混用Debian和deepin源，如果因为混源导致任何问题请自行承担，社区将不会为此花费精力。
:::

deepin 系统默认只会提供软件的 stable 版本，除非你加入了测试计划，并且知晓相关风险。我的意思是，最好避免下列的一些行为作为一项预防措施，直到你十分了解 deepin 系统。下面有一些提醒。

- 在 “/etc/apt/sources.list” 中不要包含 testing 或 unstable 。

- 在 “/etc/apt/sources.list” 里不要在标准的 deepin 中混合使用其它非 deepin 的源，例如 Ubuntu或debian 。

- 不要建立 “/etc/apt/preferences” 。

- 不了解会造成的全部影响，就不要通过配置文件改变软件包管理工具的默认行为。

- 不要使用 “`dpkg -i <random_package>`” 安装任何软件包。如果要安装软件包可以使用软件包安装管理器或者`sudo apt install <软件包路径>`

- 绝不使用 “dpkg --force-all -i random_package” 安装任何软件包。

- 不要删除或修改 “/var/lib/dpkg/” 中的文件。

- 不要让从源码直接安装的程序覆盖系统文件(例如使用make install)。如果需要的话，将它们安装到 “/usr/local” 或 “/opt” 中。

上述对 deepin 软件包管理系统做的行为所导致的不兼容影响可能会使你的系统无法使用。

负责有关键任务的服务器的严谨的 deepin 系统系统管理员，应该使用额外的预防措施。

## 持续升级的生活

::: tip
如果你不了解软件包更新机制，建议只使用deepin自带的系统更新。
:::

当然，也有一些用户乐于使用最新的软件，只需要在控制中心打开测试通道，并且签署知情协议即可。（不要说我们没有警告你）

::: warning
我们不保证测试通道的软件包的稳定性，如果你因为测试通道的软件包导致系统无法使用，我们很难为此提供帮助，请在github上提交issue，以避免这个问题持续发生。
:::

建议你这么做的同时，准备好一个live CD的启动盘，以便于在deepin无法正常工作的时候挽救你的系统。

##deepin源

deepin源的指定在`/etc/apt/sources.list`文件下，例如，现在的v23 beige系统

```
https://community-packages.deepin.com/beige/ beige main commercial community
```

“/etc/apt/sources.list” 的含义在 sources.list(5) 中进行了描述，下面是一些要点。

- “deb” 的那行定义了二进制软件包。

- “deb-src” 的那行定义了源代码软件包。

- 第一个参数是 Debian 档案库的根 URL 。

- 第二个参数是发行版名称：可以使用套件名或代号。

- 第三个和之后的参数是 Debian 档案库的有效档案库范围名称。

如果只是用 aptitude（它不访问源代码相关的元数据），“deb-src”那行可以安全地删掉（或者在文件开头添加 “#” 来将它注释掉）。这可以加速档案库元数据的更新。URL 可以是“<http://>” 、“<ftp://>” 、 “file://” ……

##软件包依赖关系

Debian 系统通过其控制文件字段中的版本化二进制依赖声明机制来提供一致的二进制软件包集合。下面有一些它们的简单定义。

- 依赖”

  - 绝对的依赖，所有在这里列出的软件包都必须同时或提前安装。

- 预依赖

  - 类似于 Depends，但列出的软件包必须提前完成安装。

- 推荐

  - 这里表示一个强，但不是绝对的依赖关系 。大多数用户不会想要这个包，除非在这里列出的所有包都已经安装。

- 建议

  - 较弱的依赖。这个软件包的大多数用户可能会从安装所列的软件包中受益，但没有它们也可以有适当的功能。

- 增强

  - 这里表明一个像建议的弱依赖关系，不装也没关系。

- 破损

  - 表明一个软件包不兼容一些版本规范。一般的解决方法就是升级列出的所有软件包。

- 冲突

  - 这表明了绝对的不兼容。为了安装这个软件包必须移除所有列出的软件包。

- 替代

  - 这表明这个文件安装的文件会替代所列的软件包的文件。

- 提供

  - 表明这个软件包会提供所列的软件包所有的文件和功能。

包含源代码依赖关系的官方定义位于 [the Policy Manual: Chapter 7 - Declaring relationships between packages](https://www.debian.org/doc/debian-policy/ch-relationships)。

##APT包管理的事件流

这是 APT 提供的软件包管理的简单事件流摘要。

- 更新（“`apt update`”、“`aptitude update`” 或 “`apt-get update`”）：

  1. 从远程档案库获取档案库元数据

  2. 重建和更新 APT 使用的本地元数据

- 升级（“`apt upgrade`” 和 “`apt full-upgrade`”，或 “`aptitude safe-upgrade`” 和 “`aptitude full-upgrade`”，或 “`apt-get upgrade`” 和 “`apt-get dist-upgrade`”）：

  1. 选择候选版本，这通常是所有已安装软件包的最新可用版本。 (see 第 2.7.3 节 “调整候选版本” for exception)

  2. 解决软件包依赖关系

  3. 如果候选版本与已安装的版本不同，会从远程档案库获取所选择的二进制软件包

  4. 解包所获取的二进制软件包

  5. 运行 preinst 脚本

  6. 安装二进制文件

  7. 运行 postinst 脚本

- 安装（“apt install ...”、“aptitude install ..." 或者 "apt-get install …” ）：

  1. 选择命令行上列出的软件包

  2. 解决软件包依赖关系

  3. 从远程服务器获取已选二进制包

  4. 解包所获取的二进制软件包

  5. 运行 preinst 脚本

  6. 安装二进制文件

  7. 运行 postinst 脚本

- 移除 （"apt remove …", “aptitude remove …” 或 “apt-get remove …”）：

  1. 选择命令行上列出的软件包

  2. 解决软件包依赖关系

  3. 运行 prerm 脚本

  4. 移除已安装的文件，除了配置文件

  5. 运行 postrm 脚本

- 清除 （"apt purge",“aptitude purge …” 或 “apt-get purge …”）：

  1. 选择命令行上列出的软件包

  2. 解决软件包依赖关系

  3. 运行 prerm 脚本

  4. 移除已安装的文件，包含配置文件

  5. 运行 postrm 脚本

这里，为了大局，我特意省略了技术细节。
