我想知道 Canonical(和/或 Debian)是否提供任何形式的保证,即 main 和 Universe 存储库中的所有包总是要么自己从源代码构建,要么由它们验证(在确定性或签名的可重现构建的情况下),而不是仅仅包括由其他人编译的二进制文件(这意味着您也必须信任他们,不要在他们的编译过程中做一些阴暗或不清楚的事情,或者在适用的情况下使用除私钥之外的任何公共源代码库之外的东西进行签名)。
Debian 和 Ubuntu 对此有何政策?他们有关于此事的任何官方页面或声明吗?我希望他们至少在主要方面这样做,但是宇宙呢?当我从宇宙安装某些东西时,我在“信任”谁(提供他们声称已编译的内容)?只是 Canonical/Debian 还是作者自己?
相关:(我在可重现的构建中发现的一些信息,大部分是旧的)
main 和 Universe 中的包是从源代码构建在启动板构建场中的。您无需要求对此进行验证,因为您可以自己找到它。
例如,在撰写本文时,
bind
上传到 Ubuntu 20.04 LTS (Focal) 的最新版本是 1:9.16.1-0ubuntu2.5。您可以通过焦点更改公共邮件列表看到这一点。特别是这篇文章链接到启动板,您可以在其中查看源文件和构建,并为每个支持的架构构建日志。例如,该软件包版本的 amd64 构建可在此处找到,其中构建日志位于此处。您可以对每个 Ubuntu 版本中的每个软件包重复此过程。
虽然我提到了 main 和 Universe,但受限和 multiverse 包也是如此,它们也构建在启动板上。但是它们可能包含非自由组件,因此不能保证“从源代码”构建,但每个都有一个源代码包,即使它包含一些二进制组件。
从 Debian 的角度来看:所有软件包都构建在我们的专用服务器(buildd's)上。未在 buildd 上构建的包不允许进入测试并进入稳定版本。此外,自 2018 年左右构建的每个包都包含一个 .buildinfo 文件:虽然这不能保证可重现的构建,但它确实启用了它们。Bullseye 中的所有软件包都有这个文件,这要感谢 Debian 开发人员最近为触发很少更新的软件包(例如字体软件包)的重建所做的努力。
总的来说,Debian 的人是可重现构建的忠实拥护者,许多推动它们的人都是该项目的一部分。构建可重复性的工具被集成到基础设施中:例如,包通常会使用标准化的时间戳构建,并且很快就会使用标准化的位置构建。
简单的答案是 Ubuntu 中的包总是基于归档中的源包的 Ubuntu 自动构建器构建的。Debian 直到最近才允许个人维护者构建的二进制包进入测试并最终稳定,这不再被允许,因为测试迁移重新开放为靶心周期,但 Debian 开发人员仍然被允许并且在某些情况下需要将二进制包上传到不稳定。Ubuntu 在引入外部二进制文件方面要严格得多。
然而,简单的答案留下了一些空白。
首先,没有技术措施可以保证源包中使用的材料实际上是源代码。确实不可能,因为 Debian 社区对术语“源代码”的理解比传统定义更类似于 GPL 定义,因此更多地取决于文件的创建和维护方式,而不是文件的格式。
其次,Debian 二进制包的内容不仅取决于源包,还取决于它所内置的环境。该环境是通过安装二进制包形成的。
这给我们带来了一些程序需要自己构建的问题。gcc、glibc、binutils、make 等需要 gcc、glibc、binutils、make 等。 rust 需要 rust。自由帕斯卡需要自由帕斯卡。golang 通常是用 golang 构建的(它声称也可以用 gccgo 构建,但是当我尝试过时,它实际上并没有工作)。
大多数情况下,这是通过使用以前的版本来构建下一个版本来解决的,但有时会出现问题,并且无法以正常方式构建这些包中的一个,因为包的现有版本在一个或更多架构。
有时维护人员会通过将引导二进制文件作为源包的一部分来解决这个问题。其他时候,存档中的包将使用手动构建的二进制包重新引导。在 debian 中,这通常由开发人员完成,只需将二进制包上传到存档,然后上传源代码以强制对自动构建器进行重建。在 Ubuntu 中,我不确定具体的程序是什么,但我知道只有相对少数人有权这样做。