目录
本章包含与创建、上传、维护和移植软件包相关的信息。
如果您想为 Debian 发行版创建一个新软件包,您应该首先查看待处理和预期软件包 (WNPP)列表。查看 WNPP 列表确保没有人已经在打包该软件,并且不会重复工作。阅读WNPP 网页以获取更多信息。
假设没有人已经在处理您预期的软件包,那么您必须提交一个错误报告(第 7.1 节,“错误报告”)给伪软件包 wnpp
,描述您创建新软件包的计划,包括但不限于软件包的描述、预期软件包的许可证以及可以从中下载的当前 URL。
您应该将错误的主题设置为 ITP:
,用新软件包的名称替换 foo
-- 简短描述
foo
。错误报告的严重程度必须设置为 wishlist
。请使用 X-Debbugs-CC 标头发送副本到 <debian-devel@lists.debian.org>
(不要使用 CC:,因为那样邮件的主题不会指示错误编号)。如果您要打包非常多的新软件包(>10),以至于在单独的消息中通知邮件列表会造成太大的干扰,请在提交错误后向 debian-devel 列表发送摘要。这将告知其他开发者即将到来的软件包,并允许审查您的描述和软件包名称。
请在新软件包的 changelog 中包含 Closes: #
条目,以便在新软件包安装到存档后自动关闭错误报告(请参阅第 5.8.4 节,“当错误通过新的上传关闭时”)。nnnnn
如果您认为您的软件包需要对 NEW 软件包队列的管理员进行一些解释,请将它们包含在您的 changelog 中,回复您作为维护者在上传后收到的电子邮件,或回复拒绝电子邮件(如果您已经重新上传)。发送给 <ftpmaster@debian.org>
。
当关闭安全错误时,请同时包含 CVE 编号和 Closes: #
。这对于安全团队跟踪漏洞非常有用。如果在咨询 ID 已知之前进行上传以修复错误,则鼓励在下次上传时修改历史 changelog 条目。即使在这种情况下,请在原始 changelog 条目中包含所有可用的背景信息指针。nnnnn
我们要求维护者宣布其意图的原因有很多:
它有助于(潜在的新)维护者利用列表上的人的经验,并让他们知道是否有人已经在处理它。
它让其他考虑处理该软件包的人知道已经有一位志愿者,因此可以共享努力。
它让其余的维护者更多地了解软件包,而不仅仅是发布到 <debian-devel-changes@lists.debian.org>
的一行描述和通常的 changelog 条目“Initial release”。
这对那些依赖 unstable
(并构成我们第一线测试人员)的人们很有帮助。我们应该鼓励这些人。
这些公告让维护者和其他感兴趣的各方更好地了解项目中正在发生的事情以及新事物。
有关新软件包的常见拒绝原因,请参阅 http://ftp-master.debian.org/REJECT-FAQ.html。
您对软件包所做的更改需要记录在 debian/changelog
中。这些更改应提供对更改内容的简明描述、原因(如有疑问),并注明是否关闭了任何错误。它们还记录了软件包完成的时间。此文件将安装在 /usr/share/doc/
中,或者对于原生软件包安装在 package
/changelog.Debian.gz/usr/share/doc/
中。package
/changelog.gz
debian/changelog
文件符合特定的结构,具有许多不同的字段。其中一个值得注意的字段 distribution
在第 5.5 节,“选择发行版”中描述。有关此文件结构的更多信息,请参阅 Debian 策略中标题为 debian/changelog
的部分。
Changelog 条目可用于在软件包安装到存档时自动关闭 Debian 错误。请参阅第 5.8.4 节,“当错误通过新的上传关闭时”。
按照惯例,包含软件新上游版本的软件包的 changelog 条目如下所示:
* New upstream release.
有一些工具可以帮助您创建条目并完成用于发布的 changelog
— 请参阅第 A.6.1 节,“devscripts
”和第 A.6.6 节,“dpkg-dev-el
”。
在上传软件包之前,您应该对其进行基本测试。至少,您应该尝试以下活动(您需要拥有同一 Debian 软件包的旧版本):
安装软件包并确保软件可以工作,或者如果已经存在 Debian 软件包,则将软件包从旧版本升级到新版本。
在软件包上运行 lintian。您可以按如下方式运行 lintian:lintian -v
。这将检查源码包以及二进制包。如果您不理解 lintian 生成的输出,请尝试添加 package-version
.changes-i
开关,这将导致 lintian 输出问题的非常详细的描述。
通常,如果软件包导致 lintian 发出错误(它们将以 E
开头),则不应上传该软件包。
有关 lintian 的更多信息,请参阅第 A.2.1 节,“lintian
”。
可选地运行 debdiff(请参阅第 A.2.2 节,“debdiff”)以分析与旧版本的更改(如果存在旧版本)。
将软件包降级到以前的版本(如果存在)— 这将测试 postrm
和 prerm
脚本。
移除软件包,然后重新安装它。
将源码包复制到不同的目录中,并尝试解包并重新构建它。这将测试软件包是否依赖于外部的现有文件,或者它是否依赖于 .diff.gz
文件中包含的文件上的权限是否被保留。
有两种类型的 Debian 源码包:
所谓的 native
软件包,其中原始源码和为 Debian 应用的补丁之间没有区别
(更常见的)软件包,其中有一个原始源码 tarball 文件,以及另一个包含 Debian 所做更改的文件
对于原生软件包,源码包包括 Debian 源码控制文件 (.dsc
) 和源码 tarball (.tar.{gz,bz2,xz}
)。非原生软件包的源码包包括 Debian 源码控制文件、原始源码 tarball (.orig.tar.{gz,bz2,xz}
) 和 Debian 更改 (.diff.gz
,用于源码格式 “1.0”;或 .debian.tar.{gz,bz2,xz}
,用于源码格式 “3.0 (quilt)”)。
使用源码格式 “1.0” 时,软件包是否为原生软件包由 dpkg-source 在构建时确定。现在建议通过在 debian/source/format
中放置 “3.0 (quilt)” 或 “3.0 (native)” 来明确说明所需的源码格式。本节的其余部分仅与非原生软件包有关。
首次上传与特定上游版本对应的版本时,应上传原始源码 tar 文件并将其包含在 .changes
文件中。随后,应使用完全相同的 tar 文件来构建新的 diff 和 .dsc
文件,并且无需重新上传。
默认情况下,如果当前 changelog 条目与前一个条目具有不同的上游版本,dpkg-genchanges 和 dpkg-buildpackage 将包含原始源码 tar 文件。可以使用 -sa
始终包含它,或使用 -sd
始终将其排除来修改此行为。
如果上传中未包含原始源码,则 dpkg-source 在构造要上传的 .dsc
文件和 diff 时使用的原始源码 tar 文件必须与存档中已有的文件逐字节相同。
请注意,在非原生软件包中,不在 *.orig.tar.{gz,bz2,xz}
中的文件的权限将不会被保留,因为 diff 不会将文件权限存储在补丁中。但是,当使用源码格式 “3.0 (quilt)” 时,debian
目录中的文件权限将被保留,因为它们存储在 tar 存档中。
每次上传都需要指定软件包的目标发行版。软件包构建过程从 debian/changelog
文件的第一行提取此信息,并将其放置在 .changes
文件的 Distribution
字段中。
此字段有几个可能的值:stable
、unstable
、testing-proposed-updates
和 experimental
。通常,软件包上传到 unstable
。
实际上,还有其他两个可能的发行版:stable-security
和 testing-security
,但有关这些发行版的更多信息,请阅读第 5.8.5 节,“处理安全相关的错误”。
无法同时将软件包上传到多个发行版。
上传到 stable
意味着该软件包将被转移到 proposed-updates-new
队列,以供 stable 发布管理器审查,如果获得批准,将被安装在 Debian 存档的 stable-proposed-updates
目录中。从那里,它将在下一个 point release 中包含在 stable
中。
为了确保您的上传被接受,您应该在上传之前与 stable 发布团队讨论更改。为此,使用 reportbug 向 release.debian.org
伪软件包提交错误,包括您要应用于当前 stable
版本软件包的补丁。对于上传到 stable
发行版的软件包,请始终在您的 changelog 条目中详细说明。
上传到 stable
时应格外小心。基本上,仅当发生以下情况之一时,才应将软件包上传到 stable
:
真正关键的功能问题
软件包变得无法卸载
已发布的架构缺少该软件包
过去,上传到 stable
也用于解决安全问题。但是,这种做法已被弃用,因为用于 Debian 安全公告的上传在公告发布时会自动复制到相应的 proposed-updates
存档。有关处理安全问题的详细信息,请参阅第 5.8.5 节,“处理安全相关的错误”。如果安全团队认为该问题过于良性,无法通过 DSA
修复,则 stable 发布管理器通常仍愿意在常规上传到 stable
中包含您的修复程序。
不鼓励更改软件包中任何不重要的内容,因为即使是微不足道的修复也可能在以后引起错误。
上传到 stable
的软件包需要在运行 stable
的系统上编译,以便它们的依赖项仅限于 stable
中可用的库(和其他软件包);例如,上传到 stable
的软件包如果依赖于仅在 unstable
中存在的库软件包,将被拒绝。强烈不鼓励更改其他软件包的依赖项(通过修改 Provides
或 shlibs
文件),这可能会导致其他软件包无法卸载。
只要 oldstable
发行版尚未被存档,就可以上传到该发行版。与 stable
相同的规则适用。
请参阅testing 部分中的信息以了解详细信息。
要上传软件包,您应该使用匿名 ftp 将文件(包括签名后的 changes 文件和 dsc 文件)上传到 ftp.upload.debian.org
的目录 /pub/UploadQueue/。为了在那里处理这些文件,它们需要使用 Debian 开发者密钥环或 Debian 维护者密钥环中的密钥进行签名(请参阅 http://wiki.debian.org/DebianMaintainer)。
请注意,您应该最后传输 changes 文件。否则,您的上传可能会被拒绝,因为存档维护软件将解析 changes 文件并看到并非所有文件都已上传。
您可能还会发现 Debian 软件包 dupload 或 dput 在上传软件包时很有用。这些方便的程序有助于自动化将软件包上传到 Debian 的过程。
有关删除软件包的信息,请参阅 ftp://ftp.upload.debian.org/pub/UploadQueue/README 和 Debian 软件包 dcut。
有时立即上传软件包很有用,但希望此软件包仅在几天后才到达存档。例如,在准备非维护者上传时,您可能希望给维护者几天时间做出反应。
上传到 delayed 目录会将软件包保留在延迟上传队列中。当指定的等待时间结束时,软件包将被移动到常规的 incoming 目录进行处理。这是通过自动上传到 ftp.upload.debian.org
的上传目录 DELAYED/
(X
-dayX
在 0 到 15 之间)完成的。0-day 每天多次上传到 ftp.upload.debian.org
。
使用 dput,您可以使用 --delayed
参数将软件包放入其中一个队列。DELAY
在没有安全团队事先授权的情况下,不要将软件包上传到安全上传队列(oldstable-security
、stable-security
等)。如果软件包不完全符合团队的要求,则会在处理不需要的上传时引起许多问题和延误。有关详细信息,请参阅第 5.8.5 节,“处理安全相关的错误”。
欧洲有一个备用上传队列,位于 ftp://ftp.eu.upload.debian.org/pub/UploadQueue/。它的操作方式与 ftp.upload.debian.org
相同,但对于欧洲开发者来说应该更快。
也可以通过 ssh 上传软件包到 ssh.upload.debian.org
;文件应放在 /srv/upload.debian.org/UploadQueue
。此队列不支持延迟上传。
Debian 存档维护者负责处理软件包上传。在大多数情况下,上传由存档维护工具 dak process-upload 每天自动处理。具体来说,对 unstable
发行版现有软件包的更新是自动处理的。在其他情况下,特别是新软件包,将上传的软件包放入发行版是手动处理的。当手动处理上传时,存档的更改可能需要一些时间才能发生。请耐心等待。
在任何情况下,您都会收到一封电子邮件通知,指示软件包已添加到存档中,这也指示哪些错误将通过上传关闭。请仔细检查此通知,检查您打算关闭的任何错误是否未被触发。
安装通知还包括有关软件包插入到哪个 section 的信息。如果存在差异,您将收到一封单独的电子邮件通知您。请继续阅读以下内容。
请注意,如果您通过队列上传,队列守护程序软件也会通过电子邮件向您发送通知。
debian/control
文件的 Section
和 Priority
字段实际上并未指定文件将放置在存档中的位置,也未指定其优先级。为了保持存档的整体完整性,存档维护者控制这些字段。 debian/control
文件中的值实际上只是提示。
存档维护者在 override file
中跟踪软件包的规范 section 和优先级。如果 override file
和 debian/control
中指示的软件包字段之间存在差异,那么当软件包安装到存档时,您将收到一封电子邮件,指出这种差异。您可以更正您的 debian/control
文件以进行下次上传,或者您可能希望在 override file
中进行更改。
要更改软件包实际放入的 section,您需要首先确保软件包中的 debian/control
文件是准确的。接下来,针对 ftp.debian.org
提交一个错误,请求将您的软件包的 section 或优先级从旧的 section 或优先级更改为新的 section 或优先级。使用诸如 override: PACKAGE1:section/priority, [...], PACKAGEX:section/priority
之类的主题,并在错误报告的正文中包含更改的理由。
有关 override files
的更多信息,请参阅 dpkg-scanpackages(1) 和 http://www.debian.org/Bugs/Developer#maintincorrect。
请注意,Section
字段描述了 section 和 subsection,它们在第 4.6.1 节,“Sections”中描述。如果 section 是 main,则应省略。允许的 subsection 列表可以在 http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections 中找到。
每位开发者都必须能够使用 Debian 错误跟踪系统。这包括了解如何正确提交错误报告(请参阅第 7.1 节,“错误报告”)、如何更新和重新排序它们,以及如何处理和关闭它们。
错误跟踪系统的功能在面向开发者的 BTS 文档中描述。这包括关闭错误、发送后续消息、分配严重性和标签、将错误标记为已转发以及其他问题。
将错误重新分配给其他软件包、合并关于同一问题的单独错误报告或在错误被过早关闭时重新打开错误等操作,都使用所谓的控制邮件服务器来处理。此服务器上所有可用的命令都在 BTS 控制服务器文档中描述。
如果您想成为一名优秀的维护者,您应该定期检查 Debian 错误跟踪系统 (BTS) 以查找您的软件包的错误。BTS 包含针对您的软件包的所有未解决的错误。您可以通过浏览此页面来检查它们:http://bugs.debian.org/
。yourlogin
@debian.org
维护者通过 bugs.debian.org
的电子邮件地址与 BTS 交互。有关可用命令的文档,请访问 http://www.debian.org/Bugs/,或者,如果您安装了 doc-debian
软件包,您可以查看本地文件 /usr/share/doc/debian/bug-*
。
有些人发现获取有关未解决错误的定期报告很有用。如果您想每周收到一封概述针对您的软件包的所有未解决错误的电子邮件,您可以添加如下 cron 作业:
# ask for weekly reports of bugs in my packages
0 17 * * fri echo "index maint address
" | mail request@bugs.debian.org
将 address
替换为您的官方 Debian 维护者地址。
在响应错误时,请确保您关于错误的所有讨论都同时发送给错误的原始提交者和错误本身(例如,<
)。如果您正在写一封新邮件,并且不记得提交者的电子邮件地址,您可以使用 123
@bugs.debian.org><
电子邮件来联系提交者并在错误日志中记录您的邮件(这意味着您无需将邮件副本发送到 123
-submitter@bugs.debian.org><
)。123
@bugs.debian.org>
如果您收到一个错误,其中提到 FTBFS,则表示 Fails to build from source(从源码构建失败)。移植者经常使用此首字母缩略词。
一旦您处理完错误报告(例如,修复了它),请通过向 <
发送解释消息,将其标记为 123
-done@bugs.debian.org>done
(关闭它)。如果您通过更改和上传软件包来修复错误,您可以按照第 5.8.4 节,“当错误通过新的上传关闭时”中的描述自动化错误关闭。
您绝不应该通过发送到 <control@bugs.debian.org>
的错误服务器 close
命令来关闭错误。如果您这样做,原始提交者将不会收到任何关于错误为何关闭的信息。
作为软件包维护者,您经常会发现其他软件包中的错误,或者您自己的软件包收到错误报告,但实际上这些错误是其他软件包中的错误。错误跟踪系统的功能在Debian 开发人员的 BTS 文档中进行了描述。重新分配、合并和标记错误报告等操作在BTS 控制服务器文档中进行了描述。本节包含一些基于 Debian 开发人员集体经验的关于管理您自己错误的指南。
为在其他软件包中发现的问题提交错误报告是维护者的公民义务之一,详情请参阅第 7.1 节 “错误报告”。然而,处理您自己软件包中的错误更为重要。
以下是您可以遵循的处理错误报告的步骤列表:
确定该报告是否对应于真正的错误。有时用户只是以错误的方式调用程序,因为他们没有阅读文档。如果您诊断出这种情况,只需关闭该错误,并提供足够的信息,以便用户纠正他们的问题(给出指向良好文档的指针等等)。如果相同的报告反复出现,您可能需要问问自己,文档是否足够好,或者程序是否应该检测到其误用,以便给出信息丰富的错误消息。这是一个可能需要与上游作者讨论的问题。
如果错误提交者不同意您关闭错误的决定,他们可以重新打开它,直到您就如何处理达成一致。如果您们无法达成一致,您可能需要将错误标记为 wontfix
,以告知人们该错误存在,但不会被修复。如果这种情况是不可接受的,您(或提交者)可能希望通过将错误重新分配给 tech-ctte
来请求技术委员会的决定(如果您希望保持针对您的软件包的报告,可以使用 BTS 的 clone 命令)。在此之前,请阅读推荐的程序。
如果错误是真实的,但它是由另一个软件包引起的,只需将错误重新分配给正确的软件包。如果您不知道应该重新分配给哪个软件包,您应该在 IRC 或 <debian-devel@lists.debian.org>
上寻求帮助。请通知您重新分配错误的软件包的维护者,例如通过抄送(Cc:)将执行重新分配的消息发送到 <
,并在邮件中解释您的理由。请注意,简单的重新分配 不会 以电子邮件形式发送给被重新分配软件包的维护者,因此他们只有在查看其软件包的错误概览时才会知道。packagename
@packages.debian.org>
如果错误影响了您的软件包的运行,请考虑克隆该错误并将克隆的错误重新分配给真正导致该行为的软件包。否则,该错误将不会显示在您的软件包的错误列表中,可能会导致用户一遍又一遍地报告相同的错误。您应该使用重新分配的克隆错误来阻止“您的”错误,以记录这种关系。
有时您还需要调整错误的严重性,使其与我们对严重性的定义相匹配。这是因为人们倾向于夸大错误的严重性,以确保他们的错误能够快速修复。有些错误甚至可能被降级为 wishlist 严重性,当请求的更改仅仅是外观上的。
如果错误是真实的,但其他人已经报告了相同的问题,那么应该使用 BTS 的 merge 命令将两个相关的错误报告合并为一个。这样,当错误被修复时,所有提交者都将收到通知。(但是请注意,发送给一个错误报告提交者的电子邮件不会自动发送给另一个报告的提交者。)有关 merge 命令及其相对命令 unmerge 命令的技术细节,请参阅 BTS 控制服务器文档。
错误提交者可能忘记提供一些信息,在这种情况下,您必须要求他们提供所需的信息。您可以使用 moreinfo
标签将错误标记为这样。此外,如果您无法重现该错误,请将其标记为 unreproducible
。然后,任何可以重现该错误的人都被邀请提供更多关于如何重现它的信息。几个月后,如果仍然没有人发送此信息,则可以关闭该错误。
如果错误与打包有关,您只需修复它即可。如果您自己无法修复它,请将错误标记为 help
。您也可以在 <debian-devel@lists.debian.org>
或 <debian-qa@lists.debian.org>
上寻求帮助。如果是上游问题,您必须将其转发给上游作者。转发错误是不够的,您必须在每次发布时检查错误是否已修复。如果已修复,您只需关闭它,否则您必须提醒作者注意它。如果您具备所需的技能,您可以准备一个修复该错误的补丁,并同时将其发送给作者。确保将补丁发送到 BTS 并将错误标记为 patch
。
如果您已经在本地副本中修复了错误,或者修复已提交到 VCS 存储库,您可以将错误标记为 pending
,以告知人们该错误已更正,并将在下次上传时关闭(在 changelog
中添加 closes:
)。如果您有多个开发人员在同一个软件包上工作,这将特别有用。
一旦更正后的软件包在存档中可用,就应该关闭该错误,并指示修复该错误的软件包版本。这可以自动完成,请阅读第 5.8.4 节 “当错误通过新的上传关闭时”。
当您的软件包中的错误和问题被修复时,作为软件包维护者,您有责任关闭这些错误。但是,您不应该在修复该错误的软件包被 Debian 存档接受之前关闭错误。因此,一旦您收到通知,告知您的更新软件包已安装到存档中,您就可以并且应该在 BTS 中关闭该错误。此外,应该使用正确的版本关闭该错误。
但是,可以避免在上传后手动关闭错误——只需在您的 debian/changelog
文件中列出已修复的错误,遵循一定的语法,存档维护软件将为您关闭错误。例如:
acme-cannon (3.1415) unstable; urgency=low * Frobbed with options (closes: Bug#98339) * Added safety to prevent operator dismemberment, closes: bug#98765, bug#98713, #98714. * Added man page. Closes: #98725.
从技术上讲,以下 Perl 正则表达式描述了如何识别错误关闭变更日志:
/closes:\s*(?:bug)?\#\s*\d+(?:,\s*(?:bug)?\#\s*\d+)*/ig
我们更喜欢 closes: #
语法,因为它是最简洁的条目,并且最容易与 XXX
changelog
的文本集成。除非通过 -v
开关指定给 dpkg-buildpackage,否则只关闭最近的变更日志条目中关闭的错误(基本上,正是 .changes
文件中的 changelog 部分中提到的错误被关闭)。
从历史上看,被标识为非维护者上传 (NMU)的上传会被标记为 fixed
而不是被关闭,但该做法随着版本跟踪的出现而停止。标签 fixed-in-experimental
也应用了相同的做法。
如果您不小心输错了错误编号或在变更日志条目中忘记了错误,请毫不犹豫地撤销错误造成的任何损害。要重新打开错误关闭的错误,请向错误跟踪系统的控制地址 <control@bugs.debian.org>
发送 reopen
命令。要关闭由您的上传修复的任何剩余错误,请将 XXX
.changes
文件通过电子邮件发送到 <
,其中 XXX
-done@bugs.debian.org>XXX
是错误编号,并将 Version: YYY
和一个空行作为电子邮件正文的前两行,其中 YYY
是错误被修复的第一个版本。
请记住,不一定必须使用如上所述的变更日志来关闭错误。如果您只是想关闭与您进行的上传无关的错误,请通过电子邮件向 <
发送解释说明来完成。如果软件包的该版本中的更改与错误没有任何关系,不要在版本的变更日志条目中关闭错误。XXX
-done@bugs.debian.org>
有关如何编写变更日志条目的通用信息,请参阅第 6.3 节 “debian/changelog
的最佳实践”。
由于安全相关错误的敏感性,必须谨慎处理。Debian 安全团队的存在是为了协调这项活动,跟踪未解决的安全问题,帮助维护者解决安全问题或自行修复,发送安全公告,并维护 security.debian.org
。
当您意识到 Debian 软件包中存在安全相关错误时,无论您是否是维护者,都请收集有关该问题的相关信息,并及时联系安全团队,最好是在他们的 Request Tracker 中提交工单。请参阅 http://wiki.debian.org/rt.debian.org#Security_Team。或者,您也可以发送电子邮件至 <team@security.debian.org>
。在未联系团队之前,请勿上传任何用于 stable
的软件包。有用的信息包括,例如:
该错误是否已公开。
已知哪些版本的软件包受该错误影响。检查受支持的 Debian 发行版、testing
和 unstable
中存在的每个版本。
修复的性质,如果有任何可用的修复(补丁特别有帮助)。
您自己准备的任何已修复的软件包(仅发送 .diff.gz
和 .dsc
文件,并首先阅读 第 5.8.5.4 节 “准备软件包以解决安全问题”)。
您可以提供任何帮助以协助测试(漏洞利用、回归测试等)。
公告所需的任何信息(请参阅 第 5.8.5.3 节 “安全公告”)。
作为软件包的维护者,您有责任维护它,即使在 stable 发行版中也是如此。您处于评估补丁和测试更新软件包的最佳位置,因此请参阅以下关于如何为安全团队准备软件包的章节。
安全团队维护一个中央数据库,即Debian 安全跟踪器。其中包含所有关于安全问题的已知公共信息:哪些软件包和版本受到影响或已修复,以及 stable、testing 和/或 unstable 是否易受攻击。仍然保密的信息不会添加到跟踪器中。
您可以搜索特定问题,也可以按软件包名称搜索。查找您的软件包以查看哪些问题仍然未解决。如果可以,请提供有关这些问题的更多信息,或帮助在您的软件包中解决这些问题。说明在跟踪器网页上。
与 Debian 中的大多数其他活动不同,有时必须将有关安全问题的信息暂时保密。这允许软件分发商协调他们的披露,以最大程度地减少用户的暴露风险。这是否适用取决于问题的性质和相应的修复,以及它是否已经是公众知识。
开发人员可以通过几种方式了解到安全问题:
他们在公共论坛(邮件列表、网站等)上注意到它。
有人提交了错误报告。
有人通过私人电子邮件通知他们。
在前两种情况下,信息是公开的,尽快修复非常重要。然而,在最后一种情况下,它可能不是公开信息。在这种情况下,有几种处理问题的方法:
如果安全风险较小,有时无需对问题保密,应该进行修复并发布。
如果问题严重,最好与其他供应商共享信息并协调发布。安全团队与各个组织和个人保持联系,可以处理此事。
在所有情况下,如果报告问题的人要求不公开,则应尊重此类请求,明显的例外是通知安全团队,以便为 Debian 的 stable 发行版生成修复程序。当向安全团队发送机密信息时,请务必提及此事。
请注意,如果需要保密,您可能无法将修复程序上传到 unstable
(或任何其他地方,例如公共 VCS 存储库)。混淆更改的细节是不够的,因为代码本身是公开的,并且可以(并且将会)被公众检查。
即使请求保密,也有两个原因需要发布信息:问题已经为人所知一段时间,或者问题或漏洞利用已公开。
安全团队拥有 PGP 密钥,以启用关于敏感问题的加密通信。有关详细信息,请参阅安全团队 FAQ。
安全公告仅针对当前的已发布 stable 发行版发布,不 针对 testing
或 unstable
。发布后,公告将发送到 <debian-security-announce@lists.debian.org>
邮件列表,并发布在 安全网页上。安全公告由安全团队编写和发布。但是,如果维护者可以为他们提供一些信息,或编写部分文本,他们当然不会介意。公告中应包含的信息包括:
问题及其范围的描述,包括:
问题的类型(权限提升、拒绝服务等)。
可能获得的权限以及由谁获得(如果有)。
如何利用它。
它是远程还是本地可利用的。
问题是如何修复的。
此信息允许用户评估对其系统的威胁。
受影响软件包的版本号。
已修复软件包的版本号。
关于从何处获取更新软件包的信息(通常来自 Debian 安全存档)。
参考上游公告、CVE 标识符,以及任何其他有助于交叉引用漏洞的信息。
您可以协助安全团队履行职责的一种方法是为他们提供适用于 stable Debian 发行版安全公告的已修复软件包。
当对 stable 发行版进行更新时,必须注意避免更改系统行为或引入新的错误。为了做到这一点,请尽可能少地进行更改以修复错误。用户和管理员依赖于发行版一旦发布后的确切行为,因此任何进行的更改都可能破坏某人的系统。对于库来说尤其如此:确保您永远不要更改 API 或 ABI,无论更改多么小。
这意味着迁移到新的上游版本不是一个好的解决方案。相反,应该将相关的更改反向移植到当前 stable Debian 发行版中存在的版本。通常,如果需要,上游维护者愿意提供帮助。如果不是,Debian 安全团队可能会提供帮助。
在某些情况下,不可能反向移植安全修复程序,例如,当需要修改或重写大量源代码时。如果发生这种情况,可能需要迁移到新的上游版本。但是,这仅在极端情况下完成,并且您必须始终事先与安全团队协调。
与此相关的是另一个重要的指导原则:始终测试您的更改。如果您有可用的漏洞利用程序,请尝试它,看看它是否确实在未打补丁的软件包上成功,而在已修复的软件包上失败。也要测试其他正常操作,因为有时安全修复程序可能会以微妙的方式破坏看似无关的功能。
不要在您的软件包中包含任何与修复漏洞不直接相关的更改。这些更改只会需要被还原,这会浪费时间。如果您的软件包中还有其他您想修复的错误,请在安全公告发布后,以通常的方式上传到 proposed-updates。安全更新机制不是引入您的软件包更改的手段,否则这些更改将被 stable 发行版拒绝,所以请不要尝试这样做。
尽可能多地审查和测试您的更改。反复检查与之前版本的差异(来自 patchutils
软件包的 interdiff 和来自 devscripts
的 debdiff 是为此目的有用的工具,请参阅第 A.2.2 节 “debdiff”)。
务必验证以下项目:
在您的 debian/changelog
中定位正确的发行版。对于 stable
,这是 stable-security
,对于 testing
,这是 testing-security
,对于之前的 stable 发行版,这是 oldstable-security
。不要定位 distribution
-proposed-updates
或 stable
!
上传应具有 urgency=high。
制作描述性强、有意义的变更日志条目。其他人将依靠它们来确定是否修复了特定的错误。为任何已提交的 Debian 错误 添加 closes:
语句。始终包含外部参考,最好是 CVE 标识符,以便可以交叉引用。但是,如果尚未分配 CVE 标识符,请不要等待它,而是继续该过程。标识符可以稍后交叉引用。
确保 版本号 正确。它必须大于当前软件包,但小于更高版本发行版中的软件包版本。如有疑问,请使用 dpkg --compare-versions
进行测试。小心不要重复使用您已用于先前上传的版本号,或与 binNMU 冲突的版本号。约定是附加 +
codename
1
,例如 1:2.4.3-4+lenny1
,当然,对于任何后续上传,将 1 递增。
除非上游源代码之前已上传到 security.debian.org
(通过之前的安全更新),否则请使用完整的上游源代码构建上传(dpkg-buildpackage -sa
)。如果之前有使用相同的上游版本上传到 security.debian.org
,您可以不带上游源代码上传(dpkg-buildpackage -sd
)。
务必使用与普通存档中使用的完全相同的 *.orig.tar.{gz,bz2,xz}
,否则稍后无法将安全修复程序移至主存档中。
在干净的系统上构建软件包,该系统仅安装了您要构建的发行版中的软件包。如果您自己没有这样的系统,您可以使用 debian.org 机器(请参阅第 4.4 节 “Debian 机器”)或设置 chroot(请参阅第 A.4.3 节 “pbuilder
” 和 第 A.4.2 节 “debootstrap
”)。
在未事先获得安全团队授权的情况下,不要将软件包上传到安全上传队列(oldstable-security
、stable-security
等)。如果软件包不完全符合团队的要求,则会在处理不需要的上传时引起许多问题和延迟。
在未与安全团队协调的情况下,不要将您的修复程序上传到 proposed-updates
。security.debian.org
中的软件包将自动复制到 proposed-updates
目录中。如果已将版本号相同或更高的软件包安装到存档中,则安全更新将被存档系统拒绝。这样,stable 发行版最终将不会获得此软件包的安全更新。
一旦您创建并测试了新的软件包,并且已获得安全团队的批准,就需要上传它,以便可以将其安装在存档中。对于安全上传,上传位置是 ftp://security-master.debian.org/pub/SecurityUploadQueue/
。
一旦安全队列的上传被接受,软件包将自动为所有架构构建,并存储以供安全团队验证。
等待接受或验证的上传仅安全团队可以访问。这是必要的,因为可能存在安全问题的修复程序,这些问题尚无法公开披露。
如果安全团队的成员接受了一个软件包,它将被安装在 security.debian.org
上,并建议用于 ftp-master.debian.org
上的适当的 distribution
-proposed-updates
。
某些存档操作在 Debian 上传过程中不是自动化的。这些程序应由维护者手动执行。本章提供了有关在这些情况下应执行的操作的指南。
有时软件包会更改其 section。例如,来自 non-free
section 的软件包可能在以后的版本中获得 GPL 许可,在这种情况下,软件包应移至“main”或“contrib”。[3]
如果您需要更改您的软件包的 section,请更改软件包控制信息以将软件包放置在所需的 section 中,并重新上传软件包(有关详细信息,请参阅Debian 策略手册)。您必须确保在上传中包含 .orig.tar.{gz,bz2,xz}
(即使您未上传新的上游版本),否则它将不会与软件包的其余部分一起出现在新的 section 中。如果您的新 section 有效,它将自动移动。如果无效,请联系 ftpmasters 以了解发生了什么。
另一方面,如果您需要更改您的软件包的 subsection
(例如,“devel”、“admin”),则过程略有不同。更正软件包控制文件中找到的 subsection,并重新上传。此外,您还需要更新 override 文件,如第 5.7 节 “指定软件包 section、subsection 和优先级”中所述。
如果出于某种原因您要完全删除一个软件包(例如,如果它是一个不再需要的旧兼容性库),您需要针对 ftp.debian.org
提交一个错误报告,要求删除该软件包;与所有错误一样,此错误的严重性通常应为 normal。错误标题应采用 RM:
格式,其中 package
[architecture list]
-- reason
package
是要删除的软件包,reason
是删除请求原因的简短摘要。[architecture list]
是可选的,仅当删除请求仅适用于某些架构而非所有架构时才需要。请注意,当您使用 reportbug 向 ftp.debian.org
伪软件包报告错误时,它将创建一个符合这些规则的标题。
如果您要删除您维护的软件包,您应该在错误标题中通过前置 ROM
(Request Of Maintainer) 来注明这一点。软件包删除的原因中使用了其他几个标准首字母缩略词,请参阅 http://ftp-master.debian.org/removals.html 以获取完整列表。该页面还提供了待处理删除请求的便捷概览。
请注意,删除只能针对 unstable
、experimental
和 stable
发行版完成。软件包不会直接从 testing
中删除。相反,在软件包从 unstable
中删除并且 testing
中没有软件包依赖于它之后,它们将自动删除。
有一种例外情况,不需要明确的删除请求:如果(源或二进制)软件包不再从源代码构建,它将半自动删除。对于二进制软件包,这意味着不再有任何源软件包生成此二进制软件包;如果二进制软件包只是不再在某些架构上生成,则仍然需要删除请求。对于源软件包,这意味着它引用的所有二进制软件包都已被另一个源软件包接管。
在您的删除请求中,您必须详细说明证明该请求合理的理由。这是为了避免不必要的删除并保留软件包被删除原因的痕迹。例如,您可以提供取代要删除的软件包的软件包名称。
通常,您只请求删除您自己维护的软件包。如果您想删除另一个软件包,您必须获得其维护者的批准。如果软件包已孤立且因此没有维护者,您应该首先在 <debian-qa@lists.debian.org>
上讨论删除请求。如果达成共识,认为应该删除该软件包,您应该重新分配和重新命名针对 wnpp
软件包提交的 O:
错误,而不是提交新的错误作为删除请求。
有关这些和其他软件包删除相关主题的更多信息,请访问 http://wiki.debian.org/ftpmaster_Removals 和 http://qa.debian.org/howto-remove.html。
如果您不确定软件包是否可丢弃,请发送电子邮件至 <debian-devel@lists.debian.org>
征求意见。同样值得关注的是来自 apt
软件包的 apt-cache 程序。当以 apt-cache showpkg
形式调用时,该程序将显示 package
package
的详细信息,包括反向依赖关系。其他有用的程序包括 apt-cache rdepends、apt-rdepends、build-rdeps(在 devscripts
软件包中)和 grep-dctrl。孤立软件包的删除在 <debian-qa@lists.debian.org>
上讨论。
软件包删除后,应处理软件包的错误。如果实际代码已演变为另一个软件包(例如,libfoo12
已删除,因为 libfoo13
取代了它),则应将其重新分配给另一个软件包;如果该软件只是不再是 Debian 的一部分,则应将其关闭。关闭错误时,为避免将错误标记为在先前 Debian 发行版中的软件包版本中已修复,应将它们标记为在版本 <most-recent-version-ever-in-Debian>+rm
中已修复。
当您的软件包的上游维护者选择重命名他们的软件(或者您在命名软件包时犯了错误),您应该遵循一个两步流程来重命名它。第一步,更改 debian/control
文件以反映新名称,并替换、提供和冲突过时的软件包名称(详情请参阅 Debian 策略手册)。请注意,只有当所有依赖于过时软件包名称的软件包在重命名后继续工作时,您才应该添加 Provides
关系。一旦您上传了软件包并且该软件包已移动到存档中,请针对 ftp.debian.org
提交一个错误报告,要求删除具有过时名称的软件包(请参阅 第 5.9.2 节,“移除软件包”)。不要忘记同时正确地重新分配软件包的错误报告。
在其他时候,您可能会在构建软件包时犯错,并希望替换它。唯一的方法是增加版本号并上传新版本。旧版本将以通常的方式过期。请注意,这适用于您软件包的每个部分,包括源代码:如果您希望替换软件包的上游源代码 tarball,您需要使用不同的版本上传它。一个简单的可能性是将 foo_1.00.orig.tar.gz
替换为 foo_1.00+0.orig.tar.gz
或 foo_1.00.orig.tar.bz2
。此限制为 ftp 站点上的每个文件赋予唯一名称,这有助于确保镜像网络的一致性。
如果您无法再维护某个软件包,您需要通知其他人,并确保该软件包被标记为孤立。您应该将软件包维护者设置为 Debian QA Group <packages@qa.debian.org>
,并针对伪软件包 wnpp
提交一个错误报告。错误报告的标题应为 O:
,表明该软件包现在是孤立的。错误的严重程度应设置为 package
-- short description
normal
;如果软件包的优先级为 standard 或更高,则应设置为 important。如果您觉得有必要,请将副本发送到 <debian-devel@lists.debian.org>
,方法是将地址放在消息的 X-Debbugs-CC: 标头中(不,不要使用 CC:,因为那样消息的主题将不会指示错误编号)。
如果您只是打算放弃软件包,但目前可以继续维护,那么您应该改为针对 wnpp
提交一个错误报告,并将标题设置为 RFA:
。package
-- short description
RFA
代表 Request For Adoption
(请求认领)。
更多信息请访问 WNPP 网页。
需要新维护者的软件包列表可在 Work-Needing and Prospective Packages list (WNPP) 中找到。如果您希望接管 WNPP 中列出的任何软件包的维护工作,请查看上述页面以获取信息和步骤。
简单地接管您认为被忽视的软件包是不可以的——那将是软件包劫持。当然,您可以联系当前的维护者,询问是否可以接管该软件包。如果您有理由相信维护者已经 AWOL(擅离职守),请参阅 第 7.4 节,“处理不活跃和/或无法联系的维护者”。
一般来说,未经当前维护者的同意,您不得接管软件包。即使他们无视您,这仍然不是接管软件包的理由。关于维护者的投诉应提交到开发者邮件列表。如果讨论没有积极的结论,并且问题是技术性的,请考虑将其提请技术委员会注意(有关更多信息,请参阅 技术委员会网页)。
如果您接管了一个旧软件包,您可能希望在错误跟踪系统中被列为该软件包的官方维护者。一旦您上传了带有更新的 Maintainer
字段的新版本,这将自动发生,尽管上传完成后可能需要几个小时。如果您预计在一段时间内不会上传新版本,您可以使用 第 4.10 节,“软件包跟踪系统” 来获取错误报告。但是,请确保旧维护者对他们在此期间继续收到错误报告没有异议。
Debian 支持越来越多的架构。即使您不是移植者,并且您只使用一种架构,了解移植性问题也是您作为维护者的职责的一部分。因此,即使您不是移植者,您也应该阅读本章的大部分内容。
移植是指为与软件包维护者的二进制软件包的原始架构不同的架构构建 Debian 软件包的行为。这是一项独特且至关重要的活动。事实上,移植者完成了 Debian 软件包的大部分实际编译工作。例如,当维护者上传一个(可移植的)源代码软件包,其中包含 i386
架构的二进制文件时,它将为其他每个架构构建,总共还有 11 个构建。
移植者有一项艰巨而独特的任务,因为他们需要处理大量的软件包。理想情况下,每个源代码软件包都应该开箱即用。不幸的是,情况往往并非如此。本节包含一份“陷阱”清单,这些陷阱通常是由 Debian 维护者造成的——常见的问题经常难倒移植者,并使他们的工作变得不必要地困难。
首先也是最重要的是快速响应移植者提出的错误或问题。请以礼貌待人,对待移植者,就好像他们实际上是您软件包的共同维护者一样(在某种程度上,他们确实是)。请容忍简洁甚至不清楚的错误报告;尽力找出问题所在。
到目前为止,移植者遇到的大多数问题都是由源代码软件包中的打包错误引起的。以下是您应该检查或注意的事项清单。
确保您的 Build-Depends
和 Build-Depends-Indep
设置在 debian/control
中设置正确。验证这一点的最佳方法是使用 debootstrap
软件包创建一个 unstable
chroot 环境(请参阅 第 A.4.2 节,“debootstrap
”)。在该 chroot 环境中,安装 build-essential
软件包以及 Build-Depends
和/或 Build-Depends-Indep
中提到的任何软件包依赖项。最后,尝试在该 chroot 环境中构建您的软件包。这些步骤可以使用 pbuilder 程序自动完成,该程序由同名软件包提供(请参阅 第 A.4.3 节,“pbuilder
”)。
如果您无法设置正确的 chroot,dpkg-depcheck 可能会有所帮助(请参阅 第 A.6.7 节,“dpkg-depcheck”)。
有关设置构建依赖项的说明,请参阅 Debian 策略手册。
除非您真的要这样做,否则不要将架构设置为 all
或 any
以外的值。在太多情况下,维护者没有遵循 Debian 策略手册 中的说明。将您的架构设置为仅一个架构(例如 i386
或 amd64
)通常是不正确的。
确保您的源代码软件包正确。执行 dpkg-source -x
以确保您的源代码软件包正确解包。然后,在其中,尝试使用 dpkg-buildpackage 从头开始构建您的软件包。package
.dsc
确保您没有将 debian/files
或 debian/substvars
文件随源代码软件包一起发布。它们应该由 debian/rules
的 clean
目标删除。
确保您不依赖于本地安装或修改的配置或程序。例如,您绝不应该调用 /usr/local/bin
或类似目录中的程序。尽量不要依赖以特殊方式设置的程序。尝试在另一台机器上构建您的软件包,即使它是相同的架构。
不要依赖于您正在构建的软件包已安装(上述问题的子情况)。当然,此规则也有例外,但请注意,任何类似情况都需要手动引导,并且不能由自动化软件包构建器完成。
如果可能,不要依赖于编译器是特定版本。如果不是,那么请确保您的构建依赖项反映了限制,尽管您可能会自找麻烦,因为不同的架构有时会标准化为不同的编译器。
确保您的 debian/rules
包含单独的 binary-arch
和 binary-indep
目标,正如 Debian 策略手册所要求的那样。确保这两个目标独立工作,也就是说,您可以调用该目标而无需事先调用另一个目标。为了测试这一点,请尝试运行 dpkg-buildpackage -B。
如果软件包可以开箱即用地为要移植到的架构构建,那么您很幸运,您的工作也很轻松。本节适用于这种情况;它描述了如何构建和上传您的二进制软件包,以便将其正确安装到存档中。如果您确实必须修补软件包才能使其为其他架构编译,那么您实际上是在进行源代码 NMU,因此请查阅 第 5.11.1 节,“何时以及如何进行 NMU”。
对于移植者上传,源代码未进行任何更改。您无需触摸源代码软件包中的任何文件。这包括 debian/changelog
。
调用 dpkg-buildpackage 的方式是 dpkg-buildpackage -B -m
。当然,将 porter-email
porter-email
设置为您的电子邮件地址。这将仅使用 debian/rules
中的 binary-arch
目标,对软件包的仅架构依赖部分进行仅二进制构建。
如果您在 Debian 机器上进行移植工作,并且您需要在本地签署您的上传以使其被存档接受,您可以在您的 .changes
文件上运行 debsign 以方便地对其进行签名,或者使用 dpkg-sig 的远程签名模式。
有时,最初的移植者上传会存在问题,因为构建软件包的环境不够好(库过时或已废弃、编译器错误等)。那么您可能只需要在更新的环境中重新编译它。但是,在这种情况下,您必须增加版本号,以便旧的错误软件包可以在 Debian 存档中被替换(如果新软件包的版本号不大于当前可用的软件包的版本号,dak 会拒绝安装新软件包)。
您必须确保您的仅二进制 NMU 不会导致软件包无法卸载。当源代码软件包生成架构依赖和架构独立的软件包,这些软件包使用 dpkg 的替换变量 $(Source-Version)
生成相互依赖关系时,可能会发生这种情况。
尽管需要修改 changelog,但这些被称为仅二进制 NMU——在这种情况下,无需触发所有其他架构认为自己已过时或需要重新编译。
此类重新编译需要特殊的“魔术”版本编号,以便存档维护工具识别出,即使有一个新的 Debian 版本,也没有相应的源代码更新。如果您的版本号弄错了,存档维护者将拒绝您的上传(由于缺少相应的源代码)。
仅重新编译 NMU 的“魔术”是通过在软件包版本号后附加后缀来触发的,后缀的形式为 b
。例如,如果您重新编译的最新版本是 number
2.9-3
版本,那么您的仅二进制 NMU 应该带有 2.9-3+b1
版本。如果最新版本是 3.4+b1
(即,一个带有先前重新编译 NMU 的原生软件包),那么您的仅二进制 NMU 应该具有 3.4+b2
的版本号。[4]
与最初的移植者上传类似,调用 dpkg-buildpackage 的正确方法是 dpkg-buildpackage -B
,仅构建软件包的架构依赖部分。
进行源代码 NMU 的移植者通常遵循 第 5.11 节,“非维护者上传 (NMU)” 中找到的指南,就像非移植者一样。但是,预计移植者的源代码 NMU 的等待周期比非移植者的要短,因为移植者必须处理大量的软件包。同样,情况因他们上传到的发行版而异。这也取决于该架构是否是包含在下一个稳定版本中的候选架构;发布管理器决定并宣布哪些架构是候选架构。
如果您是为 unstable
进行 NMU 的移植者,则应遵循上述移植指南,但有两个变化。首先,可接受的等待期——从向 BTS 提交错误报告到可以进行 NMU 之间的时间——对于在 unstable
发行版上工作的移植者来说是七天。如果问题很严重并且给移植工作带来了困难,则可以由移植者组酌情缩短此期限。(请记住,这些都不是策略,只是相互同意的指南。)对于上传到 stable
或 testing
,请首先与相应的发布团队协调。
其次,进行源代码 NMU 的移植者应确保他们提交给 BTS 的错误报告的严重程度应为 serious
或更高。这确保了可以在发布时使用单个源代码软件包来编译每个受支持的 Debian 架构。为了符合许多许可证,我们为所有架构提供一个版本的二进制和源代码软件包非常重要。
移植者应尽量避免仅针对当前版本的编译环境、内核或 libc 中的错误进行临时性修复的补丁。有时,这种临时性修复是不可避免的。如果您必须针对编译器错误等进行临时性修复,请确保您正确地 #ifdef
您的工作;此外,记录您的临时性修复,以便人们知道在外部问题得到解决后将其删除。
移植者也可能有一个非官方的位置,他们可以在等待期间将他们的工作成果放在那里。这有助于其他运行该端口的人即使在等待期间也能受益于移植者的工作。当然,这些位置没有官方的祝福或地位,因此买家风险自负。
有基础设施和几个工具可以帮助自动化软件包移植。本节包含对此自动化和移植到这些工具的简要概述;有关完整信息,请参阅软件包文档或参考资料。
包含每个端口状态的网页可以在 http://www.debian.org/ports/ 找到。
Debian 的每个端口都有一个邮件列表。移植邮件列表的列表可以在 http://lists.debian.org/ports.html 找到。这些列表用于协调移植者,并将给定端口的用户与移植者联系起来。
几个移植工具的描述可以在 第 A.7 节,“移植工具” 中找到。
wanna-build
系统用作分布式客户端-服务器构建分发系统。它通常与运行 buildd
程序的构建守护进程结合使用。构建守护进程
是“从属”主机,它们联系中央 wanna-build
系统以接收需要构建的软件包列表。
wanna-build
尚未作为软件包提供;但是,所有 Debian 移植工作都在使用它进行自动化软件包构建。用于执行实际软件包构建的工具 sbuild
可以作为软件包提供,请参阅 第 A.4.4 节,“sbuild
” 中的描述。请注意,打包版本与构建守护进程上使用的版本不同,但它足够接近以重现问题。
由 wanna-build
生成的大部分对移植者通常有用的数据都可以在 http://buildd.debian.org/ 的 Web 上找到。此数据包括每晚更新的统计信息、排队信息和构建尝试的日志。
我们对这个系统感到非常自豪,因为它有如此多的用途。独立的开发组可以将该系统用于 Debian 的不同子风味,这些子风味可能真的不具有普遍意义(例如,使用 gcc 边界检查构建的 Debian 风味)。它还将使 Debian 能够快速地重新编译整个发行版。
负责 buildd 的 wanna-build 团队可以通过 debian-wb-team@lists.debian.org
联系。要确定联系谁(wanna-build 团队、发布团队)以及如何联系(邮件、BTS),请参阅 http://lists.debian.org/debian-project/2009/03/msg00096.html。
当请求 binNMU 或返还(在构建失败后重试)时,请使用 http://release.debian.org/wanna-build.txt 中描述的格式。
某些软件包在某些 Debian 支持的架构上构建和/或工作时仍然存在问题,并且根本无法移植,或在合理的时间内无法移植。一个例子是特定于 SVGA 的软件包(仅适用于 i386
和 amd64
),或使用其他并非所有架构都支持的特定于硬件的功能。
为了防止损坏的软件包被上传到存档,并浪费 buildd 时间,您需要做几件事
首先,确保您的软件包确实无法在它无法支持的架构上构建。有几种方法可以实现这一点。首选方法是在构建时进行一个小型测试套件,该套件将测试功能,并在无法工作时失败。无论如何,这是一个好主意,因为这将防止(一些)所有架构上的损坏上传,并且还允许在所需功能可用后立即构建软件包。
此外,如果您认为受支持架构的列表相当固定,您应该将 debian/control
中的 any
更改为受支持架构的列表。这样,构建也会失败,并向人类读者指示这一点,而无需实际尝试。
为了防止自动构建器不必要地尝试构建您的软件包,它必须包含在 Packages-arch-specific
中,这是 wanna-build 脚本使用的列表。当前版本可在 http://buildd.debian.org/quinn-diff/Packages-arch-specific 获得;请参阅文件顶部以了解联系谁进行更改。
请注意,仅将您的软件包添加到 Packages-arch-specific
而不使其在不受支持的架构上构建失败是不够的:移植者或任何其他尝试构建您的软件包的人可能会意外地上传它,而没有注意到它无法工作。如果过去在不受支持的架构上上传了一些二进制软件包,请通过针对 ftp.debian.org
提交错误报告来请求删除它们。
默认情况下,non-free
部分的软件包不会由自动构建器网络构建(主要是因为软件包的许可证可能不赞成这样做)。要使软件包能够被构建,您需要执行以下步骤
检查自动构建软件包在法律上是否允许且在技术上是否可行;
将 XS-Autobuild: yes
添加到 debian/control
的标头部分;
发送电子邮件至 <nonfree@release.debian.org>
并解释为什么该软件包在法律上和技术上都可以自动构建。
每个软件包都有一个或多个维护者。通常,这些人是负责处理和上传软件包新版本的人。在某些情况下,其他开发者也可以上传新版本,这很有用,例如,当他们想要修复他们不维护的软件包中的错误时,或者当维护者需要帮助来响应问题时。此类上传称为非维护者上传 (NMU)。
在进行 NMU 之前,请考虑以下问题
您的 NMU 真的修复了错误吗?不鼓励在 NMU 中修复表面问题或更改打包风格。
您是否给了维护者足够的时间?错误报告何时提交到 BTS?忙碌一两周并不罕见。错误是否严重到需要立即修复,还是可以再等几天?
您对您的更改有多大信心?请记住希波克拉底誓言:“首要的是,不要造成伤害。” 最好让软件包存在一个公开的严重错误,而不是应用一个无法正常工作的补丁,或者一个隐藏错误而不是解决错误的补丁。如果您对您所做的事情不是 100% 确定,那么向其他人寻求建议可能是一个好主意。请记住,如果您在 NMU 中破坏了某些东西,很多人会非常不高兴。
您是否至少在 BTS 中清楚地表达了您进行 NMU 的意图?尝试通过其他方式(私人电子邮件、IRC)联系维护者也是一个好主意。
如果维护者通常很活跃并且反应迅速,您是否尝试联系过他?一般来说,应该认为最好由维护者自己处理问题,并且应该给他机会审查和更正您的补丁,因为可以预期他比 NMU 者更了解潜在的问题。如果维护者有机会自行上传修复程序,通常可以更好地利用每个人的时间。
在进行 NMU 时,您必须首先确保您的 NMU 意图明确。然后,您必须将包含当前软件包和您提议的 NMU 之间差异的补丁发送到 BTS。devscripts
软件包中的 nmudiff 脚本可能会有所帮助。
在准备补丁时,您最好了解维护者可能正在使用的任何软件包特定实践。考虑到这些实践可以减轻将您的更改集成到正常软件包工作流程中的负担,从而增加集成发生的可能性。查找可能的软件包特定实践的一个好地方是 debian/README.source
。
除非您有充分的理由不这样做,否则您必须给维护者一些时间来做出反应(例如,通过上传到 DELAYED
队列)。以下是建议用于延迟的一些值
上传仅修复 7 天以上且维护者在错误报告上 7 天内没有活动且没有迹象表明正在进行修复的发布关键错误:0 天
上传仅修复 7 天以上的发布关键错误:2 天
上传仅修复发布关键错误和重要错误:5 天
其他 NMU:10 天
这些延迟只是示例。在某些情况下,例如修复安全问题或修复阻止转换的琐碎错误,希望修复后的软件包更快地到达 unstable
。
有时,发布管理器决定允许对一部分错误(例如 7 天以上的发布关键错误)使用较短的延迟进行 NMU。此外,一些维护者将自己列在 Low Threshold NMU 列表中,并接受在没有延迟的情况下上传 NMU。但即使在这些情况下,最好还是在上传之前给维护者几天时间做出反应,特别是如果补丁之前在 BTS 中不可用,或者如果您知道维护者通常很活跃。
在您上传 NMU 后,您将对您可能引入的可能问题负责。您必须密切关注软件包(在 PTS 上订阅软件包是实现此目的的好方法)。
这不是随意执行 NMU 的许可证。如果您在维护者活跃并且会在及时的方式下确认补丁的情况下进行 NMU,或者如果您忽略本文档的建议,您的上传可能会导致与维护者发生冲突。您应该始终准备好为您的任何 NMU 的智慧辩护。
与任何其他(源代码)上传一样,NMU 必须在 debian/changelog
中添加一个条目,说明此上传的更改内容。此条目的第一行必须明确提及此上传是 NMU,例如
* Non-maintainer upload.
NMU 的版本控制方式对于原生和非原生软件包有所不同。
如果软件包是原生软件包(版本号中没有 Debian 修订版),则版本必须是上次维护者上传的版本,加上 +nmu
,其中 X
X
是从 1
开始的计数器。如果上次上传也是 NMU,则应增加计数器。例如,如果当前版本是 1.5
,则 NMU 将获得版本 1.5+nmu1
。
如果软件包不是原生软件包,您应该在版本号的 Debian 修订版部分(最后一个连字符后的部分)添加一个次要版本号。这个额外的数字必须从 1
开始。例如,如果当前版本是 1.5-2
,则 NMU 将获得版本 1.5-2.1
。如果在 NMU 中打包了新的上游版本,则 Debian 修订版设置为 0
,例如 1.6-0.1
。
在这两种情况下,如果上次上传也是 NMU,则应增加计数器。例如,如果当前版本是 1.5+nmu3
(一个已经 NMU 过的原生软件包),则 NMU 将获得版本 1.5+nmu4
。
需要特殊的版本控制方案以避免中断维护者的工作,因为使用整数作为 Debian 修订版可能会与在 NMU 时已在准备中的维护者上传发生冲突,甚至与位于 ftp NEW 队列中的上传发生冲突。它还具有使存档中的软件包明显不是由官方维护者制作的优点。
如果您将软件包上传到 testing 或 stable,您有时需要“fork”版本号树。例如,安全上传就是这种情况。为此,应使用 +deb
形式的版本,其中 XY
uZ
X
和 Y
是主版本号和次版本号,Z
是从 1
开始的计数器。当发布版本号尚不清楚时(testing 常常如此,在发布周期的开始时),必须使用高于上次稳定发布版本号的最低发布版本号。例如,当 Lenny(Debian 5.0)是稳定版时,针对版本 1.5-3
的软件包的稳定版安全 NMU 将具有版本 1.5-3+deb50u1
,而针对 Squeeze 的安全 NMU 将获得版本 1.5-3+deb60u1
。在 Squeeze 发布后,针对 testing
发行版的安全上传将版本化为 +deb61uZ
,直到知道该版本是 Debian 6.1 还是 Debian 7.0(如果成为这种情况,上传将版本化为 +deb70uZ
)。
在您请求 NMU 许可后不得不等待响应效率低下,因为它会使 NMU 者在返回问题时产生上下文切换。DELAYED
队列(请参阅 第 5.6.2 节,“延迟上传”)允许进行 NMU 的开发者同时执行所有必要的任务。例如,您应该将软件包上传到 DELAYED/7
,并告知维护者他有 7 天的时间做出反应,而不是告诉维护者您将在 7 天后上传更新的软件包。在此期间,维护者可以要求您进一步延迟上传,或取消您的上传。
DELAYED
队列不应用于对维护者施加额外压力。特别是,重要的是您能够在延迟到期之前取消或延迟上传,因为维护者无法自行取消上传。
如果您对 DELAYED
进行 NMU,并且维护者在其软件包的延迟到期之前更新了其软件包,则您的上传将被拒绝,因为存档中已有一个更新的版本可用。理想情况下,维护者会注意将您提出的更改(或至少是针对他们解决的问题的解决方案)包含在该上传中。
当有人 NMU 您的软件包时,这意味着他们想帮助您使其保持良好状态。这使用户可以更快地获得修复后的软件包。您可以考虑邀请 NMU 者成为软件包的共同维护者。在软件包上收到 NMU 并不是一件坏事;这只是意味着该软件包足够有趣,可以供其他人进行处理。
要确认 NMU,请在您的下一次维护者上传中包含其更改和 changelog 条目。如果您没有通过在您的 changelog 中包含 NMU changelog 条目来确认 NMU,则错误报告将保持在 BTS 中关闭状态,但将被列为影响您的维护者版本的软件包。
NMU 的全称是 source NMU(源代码 NMU)。还有另一种类型,即 binary-only NMU(仅二进制 NMU),或 binNMU。binNMU 也是由软件包维护者以外的人上传的软件包。但是,它是一个仅二进制上传。
当库(或其他依赖项)更新时,使用它的软件包可能需要重建。由于不需要更改源代码,因此使用相同的源软件包。
BinNMU 通常由 wanna-build 在 buildds 上触发。条目被添加到 debian/changelog
中,解释了为什么需要上传,并按照 第 5.10.2.1 节 “重新编译或仅二进制 NMU” 中的描述增加了版本号。此条目不应包含在下次上传中。
Buildds 将其架构的软件包作为仅二进制上传上传到归档。严格来说,这些是 binNMU。但是,它们通常不称为 NMU,并且不会向 debian/changelog
添加条目。
NMU 是由软件包的指定维护者以外的其他人上传的软件包。还有另一种类型的上传,其中上传的软件包不是您的:QA 上传。QA 上传是孤立软件包的上传。
QA 上传非常像正常的维护者上传:它们可以修复任何问题,甚至是小问题;版本编号是正常的,并且不需要使用延迟上传。区别在于您未被列为软件包的 Maintainer
(维护者)或 Uploader
(上传者)。此外,QA 上传的 changelog 条目具有特殊的首行
* QA upload.
如果您想进行 NMU,并且似乎维护者不活跃,明智的做法是检查软件包是否已孤立(此信息显示在软件包的软件包跟踪系统页面上)。在对孤立软件包进行首次 QA 上传时,维护者应设置为 Debian QA Group <packages@qa.debian.org>
。尚未进行 QA 上传的孤立软件包仍然设置了其旧维护者。在 http://qa.debian.org/orphaned.html 上有一个它们的列表。
除了进行 QA 上传外,您还可以考虑通过让自己成为维护者来接管软件包。您不需要任何人的许可即可接管孤立软件包,您只需将自己设置为维护者并上传新版本(请参阅 第 5.9.5 节 “接管软件包”)。
有时,您修复和/或更新软件包是因为您是打包团队的成员(该团队使用邮件列表作为 Maintainer
(维护者)或 Uploader
(上传者),请参阅 第 5.12 节 “协同维护”),但您不想将自己添加到 Uploaders
,因为您不打算定期为此特定软件包做出贡献。如果它符合您团队的策略,您可以执行正常的上传,而无需直接列为 Maintainer
或 Uploader
。在这种情况下,您应该以以下行开始您的 changelog 条目
* Team upload.
协同维护是一个术语,描述了几个人分担 Debian 软件包维护职责。这种协作几乎总是一个好主意,因为它通常会带来更高的质量和更快的错误修复周转时间。强烈建议优先级为 standard
或属于基础集的软件包具有共同维护者。
通常有一个主要维护者和一个或多个共同维护者。主要维护者是其姓名列在 debian/control
文件的 Maintainer
字段中的人。共同维护者是所有其他维护者,通常列在 debian/control
文件的 Uploaders
字段中。
在其最基本的形式中,添加新的共同维护者的过程非常容易
为共同维护者设置对您从中构建软件包的源代码的访问权限。通常,这意味着您正在使用支持网络的版本控制系统,例如 CVS
或 Subversion
。Alioth(请参阅 第 4.12 节 “Debian 的 FusionForge 安装:Alioth”)提供了这些工具以及其他工具。
将共同维护者的正确维护者姓名和地址添加到 debian/control
文件第一段中的 Uploaders
字段。
Uploaders: John Buzz <jbuzz@debian.org>, Adam Rex <arex@debian.org>
使用 PTS(第 4.10 节 “软件包跟踪系统”),共同维护者应将自己订阅到相应的源软件包。
另一种形式的协同维护是团队维护,如果您维护多个具有相同开发者组的软件包,则建议使用团队维护。在这种情况下,必须谨慎管理每个软件包的 Maintainer
和 Uploaders
字段。建议在以下两种方案之间选择一种
将主要负责软件包的团队成员放在 Maintainer
字段中。在 Uploaders
中,放入邮件列表地址和负责该软件包的团队成员。
将邮件列表地址放在 Maintainer
字段中。在 Uploaders
字段中,放入负责该软件包的团队成员。在这种情况下,您必须确保邮件列表接受错误报告,而无需任何人工交互(例如,对非订阅者的审核)。
在任何情况下,自动将所有团队成员放入 Uploaders
字段都不是一个好主意。它会用人们不真正关心的软件包来弄乱开发者软件包概览列表(请参阅 第 4.11 节 “开发者软件包概览”),并产生一种良好的维护的虚假感觉。出于同样的原因,团队成员不需要仅仅因为他们上传软件包一次就将自己添加到 Uploaders
字段,他们可以进行“团队上传”(请参阅 第 5.11.7 节 “NMU 与团队上传”)。相反,仅将邮件列表地址作为 Maintainer
而没有 Uploaders
来维护软件包是一个坏主意。
软件包通常在 unstable
(不稳定版)中经过一定程度的 testing
(测试)后安装到 testing
发行版中。
它们必须在所有架构上同步,并且不得具有使其无法卸载的依赖项;它们还必须在安装到 testing
时通常没有已知的发布关键错误。这样,testing
应该始终接近成为候选发布版。请参阅下文了解详细信息。
更新 testing
发行版的脚本每天运行两次,就在安装更新的软件包之后;这些脚本称为 britney
。它们为 testing
发行版生成 Packages
文件,但它们以智能方式执行此操作;它们尝试避免任何不一致性,并且仅使用无错误的软件包。
从 unstable
包含软件包取决于以下条件
软件包必须在 unstable
中可用 2、5 或 10 天,具体取决于紧急程度(高、中或低)。请注意,紧急程度是粘性的,这意味着自上次 testing
转换以来上传的最高紧急程度将被考虑在内。在冻结期间,这些延迟可能会加倍,或者可能完全关闭 testing
转换;
它不得有新的发布关键错误(RC 错误影响 unstable
中可用的版本,但不影响 testing
中的版本);
它必须在之前在 unstable
中构建的所有架构上可用。dak ls 可能有助于检查该信息;
它不得破坏已在 testing
中可用的软件包的任何依赖项;
它所依赖的软件包必须在 testing
中可用,或者必须同时被接受到 testing
中(如果它们满足所有必要的条件,则会被接受)。
要了解软件包是否正在进入 testing
,请参阅 testing 发行版的网页上的 testing
脚本输出,或使用 grep-excuses 程序,该程序位于 devscripts
软件包中。此实用程序可以轻松地在 crontab(5) 中使用,以便随时了解您的软件包进入 testing
的进度。
update_excuses
文件并不总是给出拒绝软件包的确切原因;您可能必须通过查找包含软件包会破坏什么来自行查找原因。testing 网页提供了一些关于可能导致此类问题的常见问题的更多信息。
有时,某些软件包永远不会进入 testing
,因为相互关系集太复杂,无法通过脚本进行排序。请参阅下文了解详细信息。
一些进一步的依赖关系分析显示在 http://release.debian.org/migration/ 上——但请注意,此页面还显示了 britney 未考虑的构建依赖项。
对于 testing
迁移脚本,过时意味着:对于发布架构,unstable
中存在不同的版本(fuckedarches 中的架构除外;fuckedarches 是一个不跟进的架构列表(在 update_out.py
中),但目前,它是空的)。过时与此软件包在 testing
中拥有的架构没有任何关系。
考虑以下示例
alpha | arm | |
---|---|---|
testing | 1 | - |
unstable | 1 | 2 |
该软件包在 unstable
中的 alpha
上已过时,并且不会进入 testing
。删除软件包无济于事,该软件包在 alpha
上仍然过时,并且不会传播到 testing
。
但是,如果 ftp-master 删除了 unstable
中的软件包(此处在 arm
上)
alpha | arm | hurd-i386 | |
---|---|---|---|
testing | 1 | 1 | - |
unstable | 2 | - | 1 |
在这种情况下,该软件包在 unstable
中的所有发布架构上都是最新的(而额外的 hurd-i386
无关紧要,因为它不是发布架构)。
有时,有人提出是否可以允许尚未在所有架构上构建的软件包进入:不。绝对不行。(除非您维护 glibc 等。)
有时,删除软件包是为了允许另一个软件包进入:这仅在允许 另一个 软件包进入时发生,如果它在其他任何方面都已准备就绪。例如,假设 a
无法与新版本的 b
一起安装;然后可以删除 a
以允许 b
进入。
当然,从 testing
中删除软件包的另一个原因是:它太有错误了(并且有一个 RC 错误就足以处于这种状态)。
此外,如果软件包已从 unstable
中删除,并且 testing
中没有任何软件包再依赖它,那么它将自动被删除。
如果软件包 a
依赖于新版本的软件包 b
,反之亦然,则 britney 无法很好地处理这种情况。
这方面的一个例子是
testing | unstable | |
---|---|---|
a | 1; depends: b=1 | 2; depends: b=2 |
b | 1; depends: a=1 | 2; depends: a=2 |
软件包 a
和软件包 b
均未被考虑更新。
目前,这需要发布团队的一些手动提示。如果您的软件包之一发生这种情况,请发送邮件至 <debian-release@lists.debian.org>
与他们联系。
一般来说,testing
中软件包的状态对于从 unstable
到 testing
的下一个版本的转换没有任何意义,但有两个例外:如果软件包的 RC 错误程度降低,即使它仍然存在 RC 错误,也可能会进入。第二个例外是,如果 testing
中软件包的版本在不同的架构上不同步:那么任何架构都可能只是升级到源软件包的版本;但是,这种情况只有在软件包先前被强制通过、架构在 fuckedarches 中,或者在 testing
迁移期间,unstable
中根本没有该架构的二进制软件包时才会发生。
总而言之,这意味着:软件包在 testing
中对同一软件包的新版本产生的唯一影响是新版本可能会更容易进入。
如果您对详细信息感兴趣,这就是 britney 的工作方式
查看软件包以确定它们是否是有效的候选软件包。这给出了更新借口。未考虑软件包的最常见原因是太年轻、RC 错误和在某些架构上过时。对于 britney 的这部分,发布经理有各种大小的锤子来强制 britney 考虑软件包。(此外,基本冻结已在 britney 的这部分中编码。)(对于仅二进制更新也有类似的东西,但这在此处未描述。如果您对此感兴趣,请仔细阅读代码。)
现在,更复杂的部分发生了:Britney 尝试使用有效的候选软件包更新 testing
。为此,britney 尝试将每个有效的候选软件包添加到 testing 发行版。如果 testing
中无法安装的软件包数量没有增加,则接受该软件包。从那时起,接受的软件包被视为 testing
的一部分,以便所有后续的可安装性测试都包括此软件包。发布团队的提示在主要运行之前或之后处理,具体取决于确切的类型。
如果您想查看更多详细信息,可以在 http://ftp-master.debian.org/testing/update_output/ 上查找。
testing
发行版根据上述规则从 unstable
中获取软件包。但是,在某些情况下,有必要上传仅为 testing
构建的软件包。为此,您可能需要上传到 testing-proposed-updates
。
请记住,上传到那里的软件包不会自动处理,它们必须经过发布经理的手。因此,您最好有充分的理由在那里上传。为了了解在发布经理眼中什么是充分的理由,您应该阅读他们在 <debian-devel-announce@lists.debian.org>
上定期给出的说明。
当您可以通过 unstable
更新您的软件包时,您不应上传到 testing-proposed-updates
。如果您不能(例如,因为您在 unstable
中有更新的开发版本),您可以使用此工具,但建议您首先向发布经理请求授权。即使软件包已冻结,如果通过 unstable
上传不会引入任何新的依赖项,则仍然可以通过 unstable
进行更新。
版本号通常通过添加 testing
发行版的代号和一个运行编号来选择,例如 1.2squeeze1
用于通过 testing-proposed-updates
上传的软件包版本 1.2
的第一次上传。
请确保您没有错过上传中的任何这些项目
确保您的软件包确实需要通过 testing-proposed-updates
,而不能通过 unstable
;
确保您仅包含最少量的更改;
确保您在 changelog 中包含了适当的解释;
确保您已将 testing
或 testing-proposed-updates
写入您的目标发行版;
确保您已在 testing
中构建和测试了您的软件包,而不是在 unstable
中;
确保您的版本号高于 testing
和 testing-proposed-updates
中的版本,且低于 unstable
中的版本;
在所有平台上上传并成功构建后,请通过 <debian-release@lists.debian.org>
联系发布团队,并要求他们批准您的上传。
默认情况下,某些较高严重性的所有错误都被认为是发布关键错误;目前,这些是 critical
(严重)、grave
(灾难性)和 serious
(严重)错误。
此类错误被认为会对软件包与 Debian 的 stable
(稳定版)发行版一起发布的可能性产生影响:一般来说,如果软件包有针对其打开的发布关键错误,则它不会进入 testing
,因此不会在 stable
中发布。
unstable
错误计数是所有标记为适用于 package
/version
组合的发布关键错误,这些组合在 unstable 中可用于发布架构。testing
错误计数的定义类似。
发行版归档的结构使得它们只能包含一个版本的软件包;软件包由其名称定义。因此,当源软件包 acmefoo
与其二进制软件包 acme-foo-bin
、acme-bar-bin
、libacme-foo1
和 libacme-foo-dev
一起安装到 testing
中时,旧版本将被删除。
但是,旧版本可能提供了一个二进制软件包,其中包含库的旧 soname,例如 libacme-foo0
。删除旧的 acmefoo
将删除 libacme-foo0
,这将破坏任何依赖它的软件包。
显然,这主要影响在不同版本中提供不断变化的二进制软件包集的软件包(反过来,主要是库)。但是,它也会影响已声明 ==、<= 或 << 类型的版本依赖项的软件包。
当源软件包提供的二进制软件包集以这种方式更改时,所有依赖于旧二进制文件的软件包都必须更新为依赖于新的二进制文件。因为将这样的源软件包安装到 testing
中会破坏 testing
中依赖它的所有软件包,所以现在必须小心:所有依赖的软件包都必须更新并准备好自行安装,以便它们不会被破坏,并且一旦一切准备就绪,通常需要发布经理或助理进行手动干预。
如果您在处理像这样的复杂软件包组时遇到问题,请联系 <debian-devel@lists.debian.org>
或 <debian-release@lists.debian.org>
寻求帮助。
[3] 有关软件包所属部分的指南,请参阅 Debian 策略手册。
[4] 过去,此类 NMU 在 Debian 修订版本的第三级编号上使用,以表示其仅重新编译状态;但是,此语法与本机软件包含糊不清,并且不允许对同一软件包上的仅重新编译 NMU、源代码 NMU 和安全 NMU 进行正确排序,因此已被放弃,转而使用此新语法。