可引导构建:如何以及为何
LWN.net 需要您的支持!如果没有订阅者,LWN 将根本不存在。请考虑订阅并帮助 LWN 继续发布。今年的自由和开源软件年会(Free and Open Source Software Yearly conference),更广为人知的是 "FOSSY",已经搬到了美丽(而且庞大)的加拿大温哥华不列颠哥伦比亚大学(UBC)校园,取代了过去三届的举办地点:美国俄勒冈州的波特兰。FOSSY 上有许多不同类型的演讲,从深度技术的内核主题,到法律和社区问题的讨论,再到 "FOSS 在日常生活中的应用 "的演讲。在 "工具链和其他开发工具 "环节,Timothy Sample 进行了关于可引导构建的报告,这个概念虽然不如其兄弟——可重现构建——来得广为人知,但 LWN 在两年多以前也探讨过这个话题。简而言之,可引导构建是指从一个小程序开始,该程序可以构建另一个稍大的程序,而这个稍大的程序又可以构建另一个,如此循环,直到整个现代 Linux 用户空间都是从一个小种子构建而成。最终,这将导致代码具有完全可理解的来源——这与今天的典型 Linux 用户空间是不同的。他问与会者是否听说过可引导构建以及他们是否熟悉这个概念;他似乎对大多数人知道这个术语以及大约一半的观众了解更多感到印象深刻。他表示,近十年前他开始使用 GNU Guix(他把它读作 "geeks"——让我感到惊讶)时,他就走上了可引导构建的道路。当时,如果你在使用 Guix,他说道,那你就是在为它贡献。Guix 是一个 "功能性包管理器 ",与 Nix 类似(并受到启发)。对于 Guix 和 Nix,系统中的所有软件都以 "派生图 "的形式表示,描述如何构建每个程序。为了能够构建特定程序,需要各种输入,这些输入在图中被指定。构建每个输入的方式(当然还有输入的输入等)也在图中表示。"现代软件中的节点成百上千,复杂得令人恐惧。"他举了一个 Python 程序的例子。显然,它需要 Python 才能运行,但 Python 是一个 C 程序,因此需要一个 C 编译器。这个 C 编译器是用某种语言编写的,因此还需要一个该语言的编译器。如此类推。Guix 将所有这些信息收集到图中,这是一个可以查看和探索的对象。"所以你开始思考,谁编译了我编译器的编译器,在哪里停下?"对于像 Debian 这样的系统,构建在某个人上传到仓库的 C 编译器二进制文件上就停止了。对于 Guix,最初的停止点是一个 250MB 静态链接的 GNU 用户空间程序的二进制文件。至于所有这些代码来自何处,答案并不是完全清楚的,当然这让 Guix 开发者感到不满。Sample 说道,这个 blob 可以可重现地构建,这是好事,但并没有解决整个问题。可引导构建的基本思想是创建一个可以在不依赖预构建工件的情况下构建的系统。"我们能否从零开始走到现代而无需假设这些已经为我们构建的工件的存在?"制作酸奶的经典食谱需要一些酸奶来启动这个过程,这就像我们今天通常构建 C 编译器时——我们从一个现有的 C 编译器二进制文件开始。你可能会想到用从老家带来的祖母的发酵剂制作酸面团;"我们基本上是在用来自贝尔实验室的 Dennis Ritchie 的发酵剂制作 C 编译器"。当然不仅仅是 C,对于大多数语言来说都是如此。语言能够 "自我托管 ",通过用该语言本身编写编译器和其他工具是一种自豪感。对于语言开发者来说,自然会这样做,因为显然他们的语言是最好的,但这留下了一种鸡与蛋的问题。可引导构建是努力超越这一点并 "从头开始" 构建这些工具。可重现构建使人们 "对您正在使用的二进制文件更加有信心,该二进制文件实际上在计算机上执行,确实对应于源代码"。用户可以接收一个声称来自一组源代码文件的二进制文件,但他们如何能确保它确实来自这些文件?通过可重现构建,他们可以自行创建该二进制文件,并检查以确保它与他们收到的完全相同。可引导构建正是这样做,但它们处理的是不同的失败模式。如果可重现构建验证失败,那是因为构建二进制文件的人在谎言或对其来源有误解。可引导构建可以防止 Ken Thompson 在他著名的 Tu 中所描述的那种问题。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡