第 3 章 预备知识

# 第 3 章 预备知识

这里给出您在投入 Debian 相关工作之前应当理解掌握的一些必备的预备知识。

## 3.1. Debian 社区的工作者

在 Debian 社区中有这几类常见的角色：

- 上游作者（upstream author）：程序的原始作者。
- 上游维护者（upstream maintainer）：目前在上游维护程序代码的人。
- 软件包维护者（maintainer）：制作并维护该程序 Debian 软件包的人。
- 赞助者（sponsor）：帮助维护者上传软件包到 Debian 官方仓库的人（在通过内容检查之后）。
- 导师（mentor）：帮助新手维护者熟悉和深入打包的人。
- Debian 开发者（DD, Debian Developer）：Debian 社区的官方成员。DD 拥有向 Debian 官方仓库上传的全部权限。
- Debian 维护者（Debian Maintainer, DM）：拥有对 Debian 官方仓库部分上传权限的人。

Please note that you can’t become an official Debian Developer (DD) overnight, as it requires more than just technical skills. Don’t be discouraged by this. If your work is useful to others, you can still upload your package either as a maintainer through a sponsor or as a Debian Maintainer.

Please note that you don’t need to create new packages to become an official Debian Developer. Contributing to existing packages can also provide a path to becoming an official Debian Developer. There are many packages waiting for good maintainers (see “"`第 3.8 节 “贡献流程””`").

## 3.2. 如何做出贡献

请参考下列文档来了解应当如何为 Debian 作出贡献：

- “您如何协助 Debian？”（官方）
- “The Debian GNU/Linux 常见问题，第 13 章 - “向 Debian 计划作出贡献””（半官方）
- “Debian Wiki, HelpDebian”（补充内容）
- “Debian 新成员站点”（官方）
- “Debian Mentors FAQ”（补充内容）

## 3.3. Debian 的社会驱动力

为做好准备和 Debian 进行交互，请理解 Debian 的社会动力学：

- 我们都是志愿者。

  - 任何人都不能把事情强加给他人。
  - 您应该主动地做自己要做的事情。

- 友好的合作是我们前行的动力。

  - 您的贡献不应致使他人增加负担。
  - 只有当别人欣赏和感激您的贡献时，它才有真正的价值。

- Debian 并不是一所学校，在这里没有所谓的老师会自动地注意到您。

  - 您需要有独立学习大量知识和技能的能力。
  - 其他志愿者的关注是比较稀缺的资源。

- Debian 一直在不断进步。

  - Debian 期望您制作出高质量的软件包。
  - 您应该随时调整自己来适应变化。

在这篇指南之后的部分中，我们只关注打包的技术方面。因此，请参考下面的文档来理解 Debian 的社会动力学：

- “Debian：17 年的自由软件、“实干主义”、和民主”（前任 DPL 制作的介绍性幻灯片）

## 3.4. 技术提醒

这里给出一些技术上的建议，参考行事可以让您与其他维护者共同维护软件包时变得更加轻松有效，从而让 Debian 项目的输出成果最大化。

- 让您的软件包容易除错（debug）。

  - 保持您的软件包简单易懂。
  - 不要对软件包过度设计。

- 让您的软件包拥有良好的文档记录。

  - 使用可读的代码风格。
  - 在代码中写注释。
  - 格式化代码使其风格一致。
  - 维护软件包的 git 仓库 [4]。

| 注意
对软件进行除错（debug）通常会比编写初始可用的软件花费更多的时间。

即使是开发系统，在不稳定（unstable）套件下运行基本系统也是不明智的。

- Creation and verification of binary deb packages should use a minimal unstable chroot as described in “第 4.7 节 “sbuild 设置””.
- Basic interactive package development activities should use an unstable chroot as described in “第 4.8 节 “Persistent chroot setup””.

| 注意
Advanced package development activities, such as testing full Desktop systems, network daemons, and system installer packages, should use the unstable suite running under “virtualization”.

## 3.5. Debian 文档

Please make yourself ready to read the pertinent part of the latest Debian documentation to generate perfect Debian packages:

- “Debian 政策手册”

  - 正式的，“必须遵循”的规则 (https://www.debian.org/doc/devel-manuals#policy)

- “Debian 开发者参考”

  - 官方的“最佳实践”文档（https://www.debian.org/doc/devel-manuals#devref）

- “Debian 维护者指南”——即本指南

  - A “tutorial reference” document (https://www.debian.org/doc/devel-manuals#debmake-doc)

All these documents are published on https://www.debian.org using the unstable suite versions of corresponding Debian packages. If you wish to have local access to all these documents from your base system, please consider using techniques such as “apt-pinning” and “chroot”.

如果本指南文档的内容与官方的 Debian 文档有所冲突，那么官方的那些总是对的。请使用 reportbug 工具向 debmake-doc 软件包报告问题。

这里有一些替代性的教程文档，您可以与本指南一起阅读进行参考：

- “《Debian 打包教程》”

  - https://www.debian.org/doc/devel-manuals#packaging-tutorial
  - https://packages.qa.debian.org/p/packaging-tutorial.html

- “Ubuntu 打包指南”（Ubuntu 基于 Debian。）

  - http://packaging.ubuntu.com/html/

- “Debian 新维护者指南”（本文档的前身，已弃用）

  - https://www.debian.org/doc/devel-manuals#maint-guide
  - https://packages.qa.debian.org/m/maint-guide.html

| 提示
When reading these, you may consider using the debmake command in place of the dh_make command.

## 3.6. 帮助资源

Before deciding to ask your question in a public forum, please do your part by reading the relevant documentation:

- 软件包的信息可以使用 aptitude、apt-cache 以及 dpkg 命令进行查看。
- 所有相关软件包在 /usr/share/doc/软件包名 目录下的文件。
- 所有相关命令在 man 命令 下输出的内容。
- 所有相关命令在 info 命令 下输出的内容。
- “debian-mentors@lists.debian.org 邮件列表存档” 的内容。
- “debian-devel@lists.debian.org 邮件列表存档” 的内容。

You can find your desired information effectively by using a well-formed search string such as "keyword site:lists.debian.org" to limit the search domain of the web search engine.

Creating a small test package is a good way to learn the details of packaging. Inspecting existing well-maintained packages is the best way to learn how other people make packages.

如果您对打包仍然存在疑问，您可以使用以下方式与他人进行沟通：

- debian-mentors@lists.debian.org mailing list. (This mailing list is for the novice.)
- debian-devel@lists.debian.org mailing list. (This mailing list is for the expert.)
- IRC such as #debian-mentors.
- 专注某个特定软件包集合的团队。（完整列表请见 https://wiki.debian.org/Teams）

- 特定语言的邮件列表。

  - “debian-devel-{french,italian,portuguese,spanish}@lists.debian.org”
  - “debian-chinese-gb@lists.debian.org”（该邮件列表用于一般的（简体）中文讨论。）
  - “debian-devel@debian.or.jp”

More experienced Debian developers will gladly help you if you ask properly after making the required efforts.

| 小心
Debian development is a moving target. Some information found on the web may be outdated, incorrect, or non-applicable. Please use such information carefully.

## 3.7. 仓库状况

请了解 Debian 仓库的当前状况。

- Debian 已经包含了绝大多数种类程序的软件包。
- Debian 仓库内软件包的数量是活跃维护者的数十倍。
- 遗憾的是，某些软件包缺乏维护者的足够关注。

因此，对已经存在于仓库内的软件包做出贡献是十分欢迎的（这也更有可能得到其他维护者的支持和协助上传）。

| 提示
The wnpp-alert command from the devscripts package can check for installed packages that are up for adoption or orphaned.

| 提示
The how-can-i-help package can show opportunities for contributing to Debian based on packages installed locally.

## 3.8. 贡献流程

这里使用类 Python 伪代码，给出了向 Debian 贡献名为 program 的软件所走的贡献流程：

    if exist_in_debian(program):
      if is_team_maintained(program):
        join_team(program)
      if is_orphaned(program): # maintainer: Debian QA Group
        adopt_it(program)
      elif is_RFA(program): # Request for Adoption
        adopt_it(program)
      else:
        if need_help(program):
          contact_maintainer(program)
          triaging_bugs(program)
          preparing_QA_or_NMU_uploads(program)
        else:
          leave_it(program)
    else: # new packages
      if not is_good_program(program):
        give_up_packaging(program)
      elif not is_distributable(program):
        give_up_packaging(program)
      else: # worth packaging
        if is_ITPed_by_others(program):
          if need_help(program):
            contact_ITPer_for_collaboration(program)
          else:
            leave_it_to_ITPer(program)
        else: # really new
          if is_applicable_team(program):
            join_team(program)
          if is_DFSG(program) and is_DFSG(dependency(program)):
            file_ITP(program, area="main") # This is Debian
          elif is_DFSG(program):
            file_ITP(program, area="contrib") # This is not Debian
          else: # non-DFSG
            file_ITP(program, area="non-free") # This is not Debian
          package_it_and_close_ITP(program)

其中：

- 对 exist_in_debian() 和 is_team_maintained()，需检查：

  - aptitude 命令
  - “Debian 软件包” 网页
  - Debian 维基“团队”页面

- 对 is_orphaned()、is_RFA() 和 is_ITPed_by_others()，需检查：

  - wnpp-alert 命令的输出。
  - “需要投入精力和未来的软件包（WNPP）”
  - “Debian 缺陷报告记录：在 unstable 版本中 wnpp 伪软件包的缺陷记录”
  - “需要“关爱”的 Debian 软件包”
  - “基于 debtags 浏览 wnpp 缺陷记录”

- 对于 is_good_program()，请检查：

  - 这个程序应当有用。
  - 这个程序不应当向 Debian 系统引入安全和维护上的问题。
  - 这个程序应当有良好的文档，其源代码需要可被理解（即，未经混淆）。
  - 这个程序的作者同意软件被打包，且对 Debian 态度友好。[5]

- 对 is_it_DFSG()，及 is_its_dependency_DFSG()，请检查：

  - “Debian 自由软件指导方针”（DFSG）。

- 对 is_it_distributable()，请检查：

  - 该软件必须有一个许可证，其中应当允许软件被发行。

You either need to file an ITP or adopt a package to start working on it. See the “Debian Developer’s Reference”:

- “5.1. 新软件包”。
- “5.9. 移动、删除、重命名、丢弃、接手和重新引入软件包”。

## 3.9. 新手贡献者和维护者

新手贡献者和维护者可能想知道在开始向 Debian 进行贡献之前需要事先学习哪些知识。根据您个人的侧重点不同，下面有我的一些建议供您参考：

- 打包

  - POSIX shell 和 make 的基本知识。
  - 一些 Perl 和 Python 的入门知识。

- 翻译

  - 基于 PO 的翻译系统的工作原理和基本知识。

- 文档

  - 文本标记语言的基础知识（XML、ReST、Wiki 等）。

新手贡献者和维护者可能想知道从哪里开始向 Debian 进行贡献。根据您掌握的技能，下面有我的一些建议供您参考：

- POSIX shell、Perl 和 Python 的技巧：

  - 向 Debian 安装器提交补丁。
  - Send patches to the Debian packaging helper scripts such as devscripts, sbuild, schroot, etc. mentioned in this document.

- C 和 C++ 技能：

  - 向具有 required 和 important 优先级的软件包提交补丁。

- 英语之外的技能：

  - 向 Debian 安装器项目提交补丁。
  - 为具有 required 和 important 优先级的软件包中的 PO 文件提交补丁。

- 文档技能：

  - 更新 “Debian 维基（Wiki）” 中的内容。
  - 向已有的 “Debian 文档” 提交补丁。

这些活动应当能让您在各位 Debian 社区成员之间得到存在感，从而建立您的信誉与名气。

新手维护者应当避免打包具有潜在高度安全隐患的程序：

- setuid 或 setgid 程序
- 守护进程（daemon）程序
- 安装至 /sbin/ 或 /usr/sbin/ 目录的程序

在积累足够的打包经验后，您可以再尝试打包这样的程序。

[4] 绝大多数 Debian 维护者使用 git 而非其它版本控制系统，如 hg、bzr 等等。

[5] 这一条不是绝对的要求，但请注意：遇上不友好的上游可能需要大家为此投入大量精力，而一个友好的上游则能协助解决程序的各类问题。

第 2 章 概览 |  | 第 4 章 工具的配置