docs: update docs

Log:
This commit is contained in:
xiangzelong 2023-02-18 13:43:13 +08:00
parent a54d5507fd
commit d2aca7f167
4 changed files with 306 additions and 4 deletions

@ -31,6 +31,8 @@ export default {
{ text: "2.1.Debian软件包管理前提", link: "/deepin进阶教程/2.deepin软件包管理/2.1.Debian软件包管理前提.md" },
{ text: "2.2.基础软件包管理操作", link: "/deepin进阶教程/2.deepin软件包管理/2.2.基础软件包管理操作" },
{text: "2.3.为deepin添加来自debian或ubuntu的软件包", link: "/deepin进阶教程/2.deepin软件包管理/2.3.为deepin添加来自debian或ubuntu的软件包" },
{text: "2.4.高级软件包管理操作", link: "/deepin进阶教程/2.deepin软件包管理/2.4.高级软件包管理操作" },
{text: "2.5.Debian软件包内部管理", link: "/deepin进阶教程/2.deepin软件包管理/2.5.Debian软件包内部管理" },
],
}
],

@ -27,27 +27,29 @@ dget https://deb.debian.org/debian/pool/main/n/neofetch/neofetch_7.1.0-1.dsc
同栏目的其他文件会被同步拉取,这里是`neofetch_7.1.0.orig.tar.xz``neofetch_7.1.0-1.debian.tar.xz`
### 2. 解压源码包
```shell
dpkg-source -x neofetch_7.1.0-1.dsc
```
你可以获得一个`neofetch-7.1.0`的目录,进入目录,可以看到`debian`目录这个目录就是debian的源码包。
> 注意检查源码中是否包含发行版的判断比如debian/rules、CMakeList 等构建时的判断检查等
你可以获得一个`neofetch-7.1.0`的目录,进入目录,可以看到`debian`目录这个目录就是debian的源码包。
:::tip
注意检查源码中是否包含发行版的判断比如debian/rules、CMakeList 等构建时的判断检查等
:::
### 3. 检查依赖
```shell
进入源码目录执行dpkg-checkbuilddeps
```
shell会提示你缺少哪些依赖这里是`dh-autoreconf`使用apt安装即可。
```shell
sudo apt install dh-autoreconf
```
部分依赖源内有,但是需要检查一下版本是否满足要求。如果不满足,则需要对依赖包进行打包。(重复上述步骤)
### 4. 打包
@ -59,11 +61,13 @@ sudo apt install dh-autoreconf
```shell
sudo dpkg -i neofetch_7.1.0-1_amd64.deb // [!code error]
```
上述操作是错误的,还记得我们之前的提示吗,不要使用`dpkg -i`安装软件包,这里我们使用`apt install`安装。
```shell
sudo apt install ./neofetch_7.1.0-1_amd64.deb
```
apt会自动解决依赖关系安装完成后可以使用`neofetch`命令查看效果。
## 从ubuntu添加软件包
@ -80,4 +84,8 @@ apt会自动解决依赖关系安装完成后可以使用`neofetch`命令
如果你想要为deepin贡献来自其他发行版的软件包可以参考上述步骤进行打包安装验证确定没有问题后可以提交到deepin-community仓库deepin社区会进行审核审核通过后会合并到deepin仓库中。
::: tip
建议软件包来源为debian或者自己打包的软件包这样可以保证软件包的一致性。
:::
具体要求在[deepin-wiki](https://wiki.deepin.org/zh/01_deepin%E9%85%8D%E5%A5%97%E7%94%9F%E6%80%81/01_deepin%E5%85%A5%E9%97%A8/02_%E5%BC%80%E5%8F%91%E7%9B%B8%E5%85%B3/02_%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97/deepin-community%E5%8D%8F%E4%BD%9C%E6%B5%81%E7%A8%8B)

@ -0,0 +1,81 @@
# 2.4.高级软件包管理操作
## 2.4.1. 命令行中的高级软件包管理操作
下面列出一些高级的软件包管理操作,这些操作需要你对软件包管理有一定的了解。
约定:尖括号内容为你需要替换的内容。
| 命令 | 操作 |
|:-------------------------------------------------------:|:----------------------------------------------------------------:|
| `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 包”.
## 2.4.2. 验证安装的软件包文件
已经安装 debsums 软件包的,能使用 debsums(1) 命令通过 "`/var/lib/dpkg/info/*.md5sums`" 文件中的 MD5sum 值,验证已安装的文件。参见第 10.3.5 节 “MD5 校验和”来获得 MD5sum 是怎样工作的信息。
::: warning 注意
因为 MD5sum 数据库可能被侵入者篡改debsums(1) 作为安全工具使用有限。这种工具用于校验管理者造成的本地修改或媒体错误造成的损坏是很不错的
:::
## 2.4.3. 预防软件包故障与故障处理
如果你已经加入deepin内测计划那么我们可能会向你推送不稳定的软件包这些软件包可能会导致系统崩溃或者其他问题。如果你不想接收这些软件包可以在控制中心退出内测计划。
你需要关注内测SIG群以便及时了解内测软件包的情况。
如果发现软件包有问题,可以通过以下方式反馈给我们:
- github issue
- 内测SIG群
- linuxdeepin论坛
需要你提供具体的软件包名,以及软件包的版本号,复现问题的步骤,以及系统的版本号。这方便我们快速定位问题。
如果你有一定开发经验可以尝试自己修复问题然后提交PR给我们。

@ -0,0 +1,211 @@
# 2.5.Debian软件包内部管理
deepin 采用了 Debian 的软件包管理机制,所以在 deepin 中,软件包的管理和 Debian 中的软件包管理是一样的。本节将介绍 Debian 中的软件包内部管理机制。
## 2.5.1. 档案库元数据
每个发行版的元数据文件都保存在 deepin 镜像站的 “dist/codename” 下面,例如 “[https://community-packages.deepin.com/beige/](https://community-packages.deepin.com/beige/)”。档案库的结构可以通过网络浏览器来浏览。其中有 6 种关键的元数据。
| 文件 | 位置 | 内容 |
|:---------------------:|:-------------------:|:-------------------------------:|
| Release | 发行版的顶层 | 档案库描述和完整性信息 |
| Release.gpg | 发行版的顶层 | "Release" 文件的签名文件,使用档案库密钥签名 |
| Contents-architecture | 发行版的顶层 | 列出在相关架构中所有软件包的全部文件 |
| Release | 每个发行版/区域/架构组合的顶部 | 归档描述使用 apt_preferences( 5 ) 的规则 |
| Packages | 每个发行版/区域/二进制架构组合的顶部 | 连接 debian/control 获得二进制包 |
| Sources | 每个 发行版/区域/源代码 组合的顶部 | 连接 debian/control 获取源代码包 |
为了减少网络流量,在最近的档案库中,这些元数据存储为压缩了的差分文件。
## 2.5.2. 顶层“Release”文件及真实性
::: tip
顶层“Release”文件用于签署 secure APT 系统下的归档文件。
:::
每个 deepin 档案库的网址都有一个这样的 “Release” 文件,例如 “[https://community-packages.deepin.com/beige/dists/beige/Release](https://community-packages.deepin.com/beige/dists/beige/Release)”,内容如下
```Text
Origin: Linux Deepin
Label: Deepin
Codename: beige
Version: 2022
Date: Tue, 07 Feb 2023 13:04:48 UTC
Architectures: i386 amd64 arm64
Components: main commercial community
Description: Deepin Beige packages.
MD5Sum:
07c4f01af3bb28cdac46fc2e8c005832 9105156 main/binary-i386/Packages
b10224cbd1db535edbd82fbf1a04097d 2338130 main/binary-i386/Packages.gz
90315149a67fcc23f9e16191360c6222 120 main/binary-i386/Release
d41d8cd98f00b204e9800998ecf8427e 0 main/debian-installer/binary-i386/Packages
7029066c27ac6f5ef18d660d5741979a 20 main/debian-installer/binary-i386/Packages.gz
d388804b4ff6fb4e8b09278a2187b1e9 26055803 main/binary-amd64/Packages
510345c94769b5e010887ca34c3785c0 6820724 main/binary-amd64/Packages.gz
07a506716d5940e121ef109c33607ba4 121 main/binary-amd64/Release
```
::: warning 注意
在 第 2.1.4 节 “Debian 档案库基础” 里,你能够发现我使用"suite" 和 "codename"的逻辑。“发行版”被用来同时谈及"suite" 和 "codename".所有由档案库提供的归档 "area" 名,会被列在 "Components" 下.
:::
顶层文件 "Release" 的完整性,是由叫 secure apt 的加密架构来验证.
- 加密签名文件 "Release.gpg" 是由顶层授权文件 "Release" 和加密的 Debian 档案库公钥创建。
- 公开的 Debian 档案库公钥能够被植入“/etc/apt/trusted.gpg”
- 这样的操作可以由安装最新的 base-files 软件包的方式完成,或者
- 手动使用 gpg 或者 apt-key 工具 获取发布在 ftp-master.debian.org 上最新的档案库公钥。
- secure APT 系统验证下载的顶层文件 "Release" 的完整性。加密验证过程用到了"Release.gpg"文件和在"/etc/apt/trusted.gpg"里的 Debian 档案库公钥.
所有 "Packages" 和 "Sources" 文件的完整性是由在顶层 "Release" 文件里的 MD5sum 值来验证。所有软件包文件的完整性由 "Packages" 和 "Sources" 文件里的 MD5sum 值来验证.参见 debsums(1) 和 第 2.4.2 节 “验证安装的软件包文件”.
因加密签名验证比计算 MD5sum 值消耗更多的 CPU使用 MD5sum 值来验证每一个软件包,使用加密签名来验证顶层的 "Release" 文件,这种方式提供[较好安全性的同时,也有比较好的性能](http://www.infodrom.org/~joey/Writing/Linux-Journal/secure-apt/) (参见 第 10.3 节 “数据安全基础”).
## 2.5.3. 档案库层的“Release”文件
::: tip
档案库层的“Release”文件将用作 apt_preferences(5) 的规则。
:::
归档层次的 "Release" 文件,其全部归档位置在 "/etc/apt/sources.list"中的 "deb"行中指定,如以下的 "[https://community-packages.deepin.com/beige/dists/beige/main/binary-amd64/Release](https://community-packages.deepin.com/beige/dists/beige/main/binary-amd64/Release)"
或 "[https://community-packages.deepin.com/beige/dists/beige/main/binary-arm64/Release](https://community-packages.deepin.com/beige/dists/beige/main/binary-arm64/Release)"。
```Text
Version: 2022
Component: main
Origin: Linux Deepin
Label: Deepin
Architecture: amd64
Description: Deepin Beige packages.
```
对于部分档案库,比如说 experimental 和 bullseye-backports, 它们包含的软件包不会被自动安装,这是因为有额外的行,例如在 "http://deb.debian.org/debian/dists/experimental/main/binary-amd64/Release" 里面有如下额外的一行。
```Text
Archive: experimental
Origin: Debian
Label: Debian
NotAutomatic: yes
Component: main
Architecture: amd64
```
请注意,普通的档案库没有 "NotAutomatic: yes", 默认的 Pin-Priority 值是 500, 而对于有 "NotAutomatic: yes"的特殊档案库, 默认的 Pin-Priority 值是 1 (参见 apt_preferences(5) 和 第 2.7.3 节 “调整候选版本”).
## 2.5.4. 获取用于软件包的元数据
当使用 APT 工具时,如 aptitude, apt-get, synaptic, apt-file, auto-apt我们需要更新包含 Debian 档案库信息元数据的本地拷贝。这些本地拷贝的文件名称,和在 "/etc/apt/sources.list" 文件里面的 distribution, area, architecture 相应名称一致。 (参见 第 2.1.4 节 “Debian 档案库基础”).
- "/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_Release"
- "/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_Release.gpg"
- "/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_area_binary-architecture_Packages"
- "/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_area_source_Sources"
- "/var/cache/apt/apt-file/deb.debian.org_debian_dists_distribution_Contents-architecture.gz" (apt-file)
前 4 种类型的文件是所有相关的 APT 命令共享的,并且可以通过 “apt-get update” 或 “aptitude update” 在命令行中进行更新。如果在 “/etc/apt/sources.list” 中有相应的 “deb” 行,则 “软件包” 元数据会进行更新。如果在 “/etc/apt/sources.list” 中有相应的 “deb-src” 行,则 “源代码” 元数据会进行更新。
"Packages" 和 "Sources" 的元数据文件包含有“Filename:”字段,指向二进制和源代码包文件的位置。目前,这些软件包都统一放在"pool/"目录树下,这样可以改善跨版本发布的传输。
“软件包”元数据的本地副本可以使用 aptitude 来进行交互式的搜索。专门的搜索命令 grep-dctrl(1) 可以搜索“软件包”和“源代码”元数据的本地副本。
"Contents-architecture"元数据的本地拷贝,能够被"apt-file update"更新,它的位置和其它 4 个不同。参见 apt-file(1). (auto-apt 的 "Contents-architecture.gz"文件的本地拷贝默认也使用不同的位置。)
## 2.5.5. APT 的软件包状态
除了远程获取元数据lenny 之后的 APT 工具还会将它在本地产生的安装状态信息保存在 “/var/lib/apt/extended_states” 中APT 会使用它们来追踪自动安装的所有软件包。
## 2.5.6. aptitude 的软件包状态
除了远程获取元数据aptitude 命令还会将它在本地产生的安装状态信息保存在 “/var/lib/aptitude/pkgstates” 中,这些信息只能被 aptitude 使用。
## 2.5.7. 获取的软件包的本地副本
所有通过 APT 机制远程获取的软件包都被保存在 “/var/cache/apt/archives” 中,直到它们被清除。
aptitude 的这个缓存文件清理策略,能够在"Options" → "Preferences"下设置,也可以通过它的菜单,"Actions"下的"Clean package cache" 或 "Clean obsolete files" 来执行强制清理。
## 2.5.8. deepin 软件包文件名称
deepin 软件包名称和Debian 软件包名称类似,但是有一些不同。
| 软件包类型 | 名称结构 |
|:------------------------------------:|:---------------------------------------------------------------:|
| 二进制软件包(亦称 deb | package-name_upstream-version-deepin.revision_architecture.deb |
| 用于 debian-installer 的二进制软件包(亦称 udeb | package-name_upstream-version-deepin.revision_architecture.udeb |
| 源代码软件包(上游源代码) | package-name_upstream-version-deepin.revision.orig.tar.gz |
| 1.0 源代码软件包(Debian 改变) | package-name_upstream-version-deepin.revision.diff.gz |
| 3.0 (quilt 补丁管理工具) 源代码软件包(Debian 改变) | package-name_upstream-version-deepin.revision.debian.tar.gz |
| 源代码软件包(说明) | package-name_upstream-version-deepin.revision.dsc |
其中,"package-name" 是软件包的名称,"upstream-version" 是软件包的上游版本,"deepin.revision" 是 deepin 打包版本,"architecture" 是软件包的架构。
## 2.5.9. dpkg 命令
dpkg(1) 是 Debian 软件包管理中最底层的工具。它非常强大,必须小心使用。
当安装名为 “package_name” 的软件包时dpkg 会按照下列的顺序处理它。
1. 解包 deb 文件(等同于 “ar -x”
2. 使用 debconf(1) 执行 “package_name.preinst”
3. 将软件包安装到系统中(等同于 “tar -x”
4. 使用 debconf(1) 执行 “package_name.postinst”
debconf 系统提供带有 I18N 和 L10N (第 8 章 国际化和本地化)支持的标准化用户交互。
dpkg 创建的重要文件:
| 文件 | 内容说明 |
|:-----------------------------------------:|:---------------------------------------------:|
| /var/lib/dpkg/info/package_name.conffiles | 列出配置文件。(使用者可修改的) |
| /var/lib/dpkg/info/package_name.list | 列出软件包安装的所有文件和目录 |
| /var/lib/dpkg/info/package_name.md5sums | 列出软件包安装的文件的 MD5 哈希值 |
| /var/lib/dpkg/info/package_name.preinst | 软件包安装之前运行的软件包脚本 |
| /var/lib/dpkg/info/package_name.postinst | 软件包安装之后运行的软件包脚本 |
| /var/lib/dpkg/info/package_name.prerm | 软件包移除之前运行的软件包脚本 |
| /var/lib/dpkg/info/package_name.postrm | 软件包移除之后运行的软件包脚本 |
| /var/lib/dpkg/info/package_name.config | 用于 debconf 系统的软件包脚本 |
| /var/lib/dpkg/alternatives/package_name | update-alternatives 命令使用的替代信息 |
| /var/lib/dpkg/available | 所有软件包的可用性信息 |
| /var/lib/dpkg/diversions | dpkg(1) 使用的文件移动信息,由 dpkg-divert(8) 设置 |
| /var/lib/dpkg/statoverride | dpkg(1) 使用的文件状态改变信息,由 dpkg-statoverride(8) 设置 |
| /var/lib/dpkg/status | 所有软件包的状态信息 |
| /var/lib/dpkg/status-old | “var/lib/dpkg/status” 文件的第一代备份 |
| /var/backups/dpkg.status* | 第二代备份以及“var/lib/dpkg/status”文件更旧的备份 |
## 2.5.10. update-alternatives 命令
Debian 系统使用 update-alternatives(1) 让用户可以不受干扰地安装多种重叠的程序。例如,如果同时安装了 vim 和 nvi 软件包,你可以使 vi 命令选择运行 vim。
```bash
$ ls -l $(type -p vi)
lrwxrwxrwx 1 root root 20 2007-03-24 19:05 /usr/bin/vi -> /etc/alternatives/vi
$ sudo update-alternatives --display vi
...
$ sudo update-alternatives --config vi
Selection Command
----------------------------------------------
1 /usr/bin/vim
*+ 2 /usr/bin/nvi
Enter to keep the default[*], or type selection number: 1
```
Debian 选择系统在 "`/etc/alternatives/`" 目录里通过符号链接来维持它的选择。选择进程使用"`/var/lib/dpkg/alternatives/`"目录里面的相应文件。
## 2.5.11. dpkg-statoverride 命令
当安装一个软件包时,由 dpkg-statoverride(8) 命令提供的 状态修改是告诉dpkg(1) 对 文件 使用不同的属主或权限的一个方法。如果使用了 "--update" 选项,并且文件存在,则该文件会被立即设置为新的属主和模式。
::: warning 小心
系统管理员使用 chmod 或 chown 命令直接修改某个软件包文件的属主或权限,在下次软件包升级时,将会被重置。
:::
::: tip 注意
本人在此使用了文件 一词但事实上也可用于dpkg 所处理的任何文件系统对象,包括目录,设备等
:::
## 2.5.12. dpkg-divert 命令
dpkg-divert(8) 命令提供的文件转移功能,是强制 dpkg(1) 不将文件安装到其默认位置,而是安装到被转移 的位置。dpkg-divert 专用于软件包维护脚本。不建议系统管理员随意使用它。
:::danger
dpkg-divert 除非你知道你在做什么,否则不要使用它。因为有些软件包可能会依赖于它们的文件位置,如果你随意转移文件,可能会导致软件包无法正常工作。
:::