迈向尼克斯的内容解决模型

2021-05-07 12:08:36

这是我的第一篇关于NIX内容 - 可寻址性的帖子 - 一段期待已久的功能,希望即将推出!在这篇文章中,我将向您展示此功能如何改善NixInfrasture。我会回到另一个帖子中来解释对NIX的内容可寻址的技术挑战。

nix具有一个精彩的处理包模型。因为每次派生都存储在(aka)下的uniquename下,同一库的多个版本可以在SameSystem上共存而不存在:每个版本的图书馆都有一个DistintName,达到尼克斯被关注到。

更重要的是,如果openssl在nixpkgs升级,nix会知道依赖于openssl(即,几乎所有内容)必须berebuilt的所有分页,如果只是以新的opensslversion的名称点。这样,nix安装将永远不会为一个版本的openssl提供包,但是违反an的动态链接:作为用户,这意味着您永远不会有一个undefinedsymbol错误。欢呼!

NIX如何实现这一壮举?这个想法是,从其所有输入中派生的包的名称(即,依赖性的完整列表以及包描述)。因此,如果从openssl从中获取git标记,则名称更改,如果OpenSSL更改,那么OpenSSL inciss依赖关系的任何程序包的名称更改。

然而,这可能是非常悲观的:甚至更具变化,无法暗示有意义,可以意味着大规模重建和下载。 ASA略微极端示例,此合并Request OnnixPKGS对openSSL的构建方式进行了微小的更改。它无法评估openssl,但需要重建疯狂的包装件。因为,就nix而言,所有这些包都存在着名的名称,因此是不同的包。但实际上,他们不是。

尽管如此,重建的成本必须由nixinfrastructure出生:Hydra构建所有包填充缓存,并且必须存储所有新建的软件包。它的时间和金钱(CPU电源和存储空间)成本。

默认情况下,大多数发行版不会在其依赖关系发生变化时重建包,并具有(更少于自动化)进程来检测需要重建反向依赖性的更改。例如,Debian试图自动检测ABI更改,并且Fedora具有一个更多手动进程.But nix没有。

问题是“破坏变革”的概念是一个非常模糊的。我们遵循Debian并考虑只有ABI变化突破吗?此标准仅适用于共享库,只有Debian政策确认,只适用于“良好-Behaved“Program.So如果我们遵循此标准,则仍需要手动策策,这恰恰是NIX尝试避免的内容。

非常愉快地,有一个标准来避免许多无用的重建而不牺牲正确性:检测包装中的更改(或其依赖项之一)产生完全相同的输出。这可能看起来像一个边缘案例,但是上面的openssl示例(和许多其他人)表明它是一个实际应用程序。另一个例子,Go依赖于Perl的测试,因此Perl的升级需要重建NixPkgs的所有Go软件包,尽管它很可能不会改变输出去推导。

但是,对于nix认识到包不是一个新的包,那么,不变,openssl或go packages必须具有同一个nameas旧版本。因此,包的名称不得从其输入的输入中掌控,而是应该从编译包的内容中掌控。这被称为Content寻址。

内容解决是如何确定当您和ACOLLEAGUE在世界型GIT结账时的另一边,您实际上拥有树中的ExcorSame内容。 git提交是满意的内容,因此名称7cc16bb8cd38ff5806e40b32978ae64d54023ce0指的是那个精确的文章。

内容解决存储的又一个例子是IPF。在IPFS中,StorageFiles可以存储在任意数量的计算机中,甚至从计算机移动到计算机。内容派生名称用作Givean内在名称到文件的方式,无论存储在哪里。

事实上,即使是我们正在讨论的特定用例 - 当重建依赖性没有改变时,我们在此处讨论重新编译 - 在诸如Bazel等各种构建系统中找到了途径。在构建系统中,这种重新编译是有时被称为早期截止优化 - 将构建系统成为LACALE案例实施例。

因此,我们需要做的就是将NIX商店从一个输入addressedModel移动到内容寻址的模型,如许多工具所使用的,我们将能够通过重建许多较少的软件包来节省大量的存储空间和cpuusage 。 NixPKGS贡献者将改善他们的CI时间。它也可以允许为二进制CacheOver IPFS提供服务。

好吧,像电脑的许多东西一样,这实际上比听起来更难(这解释了为什么尽管在原来的纸上近15年前讨论了,但是除了近15年前尚未完成的原因),但我们现在相信有办法前进...更多 在后来的帖子中。 NIX的内容寻址商店将有助于减少疯狂载荷必须维持。 虽然内容 - 寻址是分布式系统和构建系统(NIX均为Hix的常见技术),但到达在NIX中集成内容寻址的程度是很长的旅程。 在未来的帖子中,我会解释为什么它如此努力,我们终于终于担任内容解决的尼克斯的可行设计。