开发者生态
morning
可引导构建:如何以及为何
2026-08-28
1 阅读
约5分钟阅读
signa11
字号:
这篇文章由 LWN 订阅者为您带来 LWN.net 的订阅者使这篇文章以及与之相关的所有内容成为可能。如果您欣赏我们的内容,请购买订阅并制作下一组文章。作者:Jake Edge,2026 年 8 月 17 日 FOSSY 今年的自由开源软件年度会议(更广为人知的名称为“FOSSY”)从前三届的举办地美国俄勒冈州波特兰北移至加拿大温哥华美丽(且巨大)的不列颠哥伦比亚大学 (UBC) 校园。 FOSSY 举办了许多不同类型的讲座,从深度技术性的内核主题,到法律和社区问题的讲座,再到“日常生活中的 FOSS”讲座。在“工具链和其他开发工具”轨道中,Timothy Sample 做了一个关于 bootstrappable builds 的演示,虽然 LWN 在两年多前确实关注过这个主题,但它的知名度比它的表兄弟 reproducible builds 稍低一些。简而言之,可引导构建是从一个小程序开始,该程序可以构建另一个稍大的程序,该程序可以构建另一个程序,依此类推,直到从一个小种子构建整个现代 Linux 用户空间。最终,它产生的代码具有完全可理解的来源——与当今典型的 Linux 用户空间不同。他首先询问与会者是否听说过可引导构建以及他们是否普遍熟悉这个想法;令他印象深刻的是,大多数人都知道这个词,而且大约一半的观众知道的还不止这些。他说,大约十年前,当他开始使用 GNU Guix(他将其发音为“极客”——令我惊讶)时,他就踏上了可引导构建的道路。那时,如果你使用 Guix,你就是在为它做出贡献,”他笑着说。 Guix 是一个“功能包管理器”,与 Nix 类似(并受其启发)。对于 Guix 和 Nix 来说,系统中的所有软件都以“推导图”表示,它描述了如何构建每个程序。为了能够构建特定程序,需要各种输入,这些输入在图中指定。构建每个输入(当然还有输入的输入等)的方式也在图中表示。 “现代软件有成百上千个节点,复杂得可怕。”他举了一个Python程序的例子。显然,它需要Python才能运行,但Python是C程序,因此需要C编译器。该 C 编译器是用某种语言编写的,因此需要该语言的编译器。等等。 Guix 将所有这些收集到图表中,这是一个可以查看和探索的对象。 “所以你开始想知道谁编译了我的编译器的编译器,它在哪里停止?”对于像 Debian 这样的系统,它停止在某人上传到存储库的 C 编译器二进制文件上。对于 Guix,最初的停止点是 GNU 用户空间程序的 250MB 静态链接 blob。当然,所有这些代码从何而来的答案并不完全清楚,这令 Guix 开发人员感到不满意。 Sample 说,这个 blob 可以重复构建,这很好,但并不能解决整个问题。可引导可引导构建背后的基本思想是创建一个可以在不依赖预构建工件的情况下构建的系统。 “我们能否从零走向现代,而不必假设这些已经为我们构建的工件的存在?”酸奶的经典配方需要一些酸奶来启动这个过程,这就像我们今天通常构建 C 编译器的方式一样——我们从现有的 C 编译器二进制文件开始。您可能会考虑用祖母从祖国带来的发酵剂制作酵母面包; “我们基本上是用贝尔实验室的 Dennis Ritchie 的启动器来制作 C 编译器”。当然,不仅仅是 C,大多数语言都是如此。通过用语言本身编写编译器和其他工具来“自我托管”,这是语言的一个值得骄傲的地方。语言开发人员这样做是很自然的,因为显然他们的语言是最好的,但它留下了一些先有鸡还是先有蛋的问题。可引导构建是一种超越这一点并“从头开始”构建这些工具的努力。可重复的构建使人们“更有信心您正在使用的二进制文件(实际上在计算机上执行)与源代码相对应”。用户可以收到声称来自一组源代码文件的二进制文件,但他们如何确定它确实来自?通过可重复的构建,他们可以自己创建二进制文件并检查以确保它与他们所提供的内容逐位相同。可引导构建执行完全相同的操作,但它们处理不同的故障模式。如果可重现的构建无法验证,那是因为构建二进制文件的人在撒谎
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱