资讯详情

Nix 1.11 发布说明深度解读:确定性构建验证、Nix 表达式预取与沙箱命名统一

📅 2026/9/21 12:01:52 | 华诺云谱 👁 阅读
Nix 1.11 发布说明深度解读:确定性构建验证、Nix 表达式预取与沙箱命名统一
Nix 1.11 发布说明深度解读确定性构建验证、Nix 表达式预取与沙箱命名统一【免费下载链接】nixNix, the purely functional package manager项目地址: https://gitcode.com/gh_mirrors/ni/nix导读本文基于 Nix 官方发布说明 rl-1.11.md系统解读 Nix 1.112016-01-19 发布带来的核心能力nix-prefetch-url支持直接从 Nix 表达式预取源码并打印哈希、fetchurl内置函数支持 NAR 下载与解包、SHA-512 哈希全面支持以及以--option build-repeat、--check、-K组合为核心的构建确定性验证工作流。文中所有实现细节均结合当前仓库源码进行佐证读者读完后既能理解这些历史特性背后的设计动机也能掌握它们在今日 Nix 中的实际用法与底层原理。说明这是一个以修复 bug 为主的次要版本primarily a bug fix release但其中引入的多个新特性——尤其是构建确定性检查机制与chroot到sandbox的术语统一——深刻影响了后续 Nix 的迭代方向至今仍可在当前仓库源码中看到其印记。一、nix-prefetch-url从 Nix 表达式直接预取源码1.1 核心新能力1.11 之前nix-prefetch-url只能接受一个裸 URL。新版本允许它直接解析当前目录下的 Nix 表达式取出某个属性所对应的下载源并完成预取$ nix-prefetch-url -A hello.src这条命令会求值当前目录 Nix 表达式中的hello.src属性找到其中的fetchurl调用下载其指定的文件并把结果文件的密码学哈希打印到 stdout。它与nix-build -A hello.src的关键区别在于nix-prefetch-url不校验哈希不要求表达式里预先填写正确的哈希因此非常适合在更新 Nix 表达式时用来重新计算哈希值——先跑一次拿到新哈希再回填到表达式里。1.2 支持解包类函数fetchFromGitHub场景-A模式不仅能处理fetchurl也能处理那些下载后需要解包的取源函数如 Nixpkgs 中的fetchFromGitHub因为它会读取表达式中的outputHashMode属性来判断是否属于recursive递归/解包模式$ nix-prefetch-url --unpack https://github.com/NixOS/patchelf/archive/0.8.tar.gz也可以从 Nix 表达式出发$ nix-prefetch-url -A nix-repl.src1.3 源码级实现prefetch.cc当前仓库中nix-prefetch-url的实现位于 src/nix/prefetch.cc。其核心逻辑prefetchFileprefetch.cc完成下载 → 可选解包 → 加入 store → 返回哈希的完整链路下载阶段通过FileTransferRequest将 URL 内容写入临时文件req.decompress false保持原始字节以便精确计算哈希解包阶段当--unpack生效时调用unpackTarfile解包到临时目录若解包结果只有一个顶层文件/目录则取其本身否则取整个解包目录入店阶段调用store-addToStoreSlow根据是否解包/可执行选择NixArchiveNAR或Flat内容寻址方式哈希模式默认 SHA-256HashAlgorithm::SHA256可用--type指定其他算法。参数解析在main_nix_prefetch_urlprefetch.cc中完成-A/--attr模式会通过evalFile求值指定或默认当前目录的 Nix 表达式沿属性路径定位目标属性findAlongAttrPath读取urls属性并取第一个 URL这正是fetchurl为配合本命令而暴露的属性见下文读取outputHashMode若为recursive则自动开启解包模式读取name属性作为 store 路径名。有意思的是prefetchFile还被复用于新式命令nix store prefetch-fileprefetch.cc并支持--json输出 store 路径与 SRI 格式哈希——可见 1.11 的设计在新命令体系中被完整继承。1.4 配套设施fetchurl.nix中的urls属性为了让nix-prefetch-url -A能够工作内置取源表达式 src/libexpr/fetchurl.nix 专门暴露了urls [ url ]属性fetchurl.nix注释即写着 To make nix-prefetch-url work.。该表达式还通过outputHashMode if unpack || executable then recursive else flatfetchurl.nix把是否需要解包这一信息暴露给预取逻辑形成表达式与命令之间的契约。二、内置fetchurl支持 NAR 下载与解包简化 stdenv 引导1.11 中内置函数nix/fetchurl.nix现在支持下载并解包 NARNix Archive。这带来的直接收益是Nixpkgs 的 stdenv 引导bootstrap过程不再需要多次独立下载例如 Linux 上的单独 busybox 二进制、Darwin 上的 curl/mkdir/sh/bzip2 等所有这些文件可以被合并进单个 NAR并可选地使用xz压缩。从当前仓库的实现看src/libexpr/fetchurl.nix 中的builder builtin:fetchurlfetchurl.nix将下载工作委托给 Nix 内置的 fetchurl builderunpack参数控制是否解包executable参数控制是否保留可执行位两者任一为真时outputHashMode即为recursiveNAR 模式与nix-prefetch-url --unpack的语义完全一致。同时preferLocalBuild truefetchurl.nix保证取源不进入远程构建调度。这一改动从架构上统一了单文件下载与压缩归档下载两条路径使引导链更短、更不易受外部资源点故障影响。三、SHA-512 哈希支持1.11 起Nix 支持使用SHA-512校验固定输出派生fixed-output derivation并支持在builtins.hashString中使用builtins.hashString sha512 hello仓库证据builtins.hashString的实现在 src/libexpr/primops.cc通过RegisterPrimOp注册为__hashString按用户传入的算法字符串解析出HashAlgorithm后计算。固定输出派生侧src/libexpr/fetchurl.nix 也增加了sha512参数并在未显式指定hash时优先回退使用 sha512 → sha1 → md5 → sha256 的优先级链。哈希算法枚举在HashAlgorithm中统一管理这意味着用户既可以在builtins.hashString里、也可以在取源表达式的sha512参数里使用 SHA-512。四、构建确定性验证--option build-repeat、--check与-K4.1build-repeat构建 N1 次并强制比对新标志--option build-repeat N会让每次构建实际执行 N1 次。如果任何两轮构建的输出不一致该构建即被判定失败、输出路径不会注册为有效not registered as valid。其典型用途是验证构建的确定性build determinism。与此前已有的--check选项相比区别在于--check只是重复一次此前已成功的构建且一旦发现不确定性结果仍会被注册进数据库而build-repeat从源头阻止不确定性产物进入数据库——这对 Hydra 至关重要可确保非确定性构建不会进入二进制缓存对外发布。用法示例$ nix-build --option build-repeat 3即对每个派生执行 4 次构建并比对。4.2--check-K保留对照输出以便 diff当--check或build-repeat检测到两次运行结果不一致并且同时给出了-K--keep-failed时另一轮运行的输出会以store-path-check后缀的形式保留下来方便用diffoscope等工具深入调查不确定性来源。发布说明中的经典示例$ nix-build pkgs/stdenv/linux -A stage1.pkgs.zlib --check -K error: derivation ‘/nix/store/l54i8wlw2265…-zlib-1.2.8.drv’ may not be deterministic: output ‘/nix/store/11a27shh6n2i…-zlib-1.2.8’ differs from ‘/nix/store/11a27shh6n2i…-zlib-1.2.8-check’ $ diffoscope /nix/store/11a27shh6n2i…-zlib-1.2.8 /nix/store/11a27shh6n2i…-zlib-1.2.8-check … ├── lib/libz.a │ ├── metadata │ │ -1,15 1,15 │ │ -rw-r--r-- 30001/30000 3096 Jan 12 15:20 2016 adler32.o … │ │ rw-r--r-- 30001/30000 3096 Jan 12 15:28 2016 adler32.o上例中两份归档内adler32.o的时间戳元数据15:20 vs 15:28被 diffoscope 精准定位——这正是构建非确定性的典型来源之一构建时间被写入了产物。对照输出以-check后缀命名与原始输出路径一一对应极大降低了排查成本。4.3 当前仓库中的实现印记虽然 1.11 距今已久构建检查逻辑在演化后仍有清晰脉络可循构建模式bmCheck贯穿 src/libstore/build/derivation-building-goal.cc如buildMode bmCheck ? checking outputs of %s : ...derivation-building-goal.cc表示重复验证已有输出这一 1.11 引入的语义沿用至今bmCheck分支下验证逻辑在 src/libstore/build/derivation-builder-impl.cc 中实现并检查settings.keepFailed对应-K以决定是否保留失败输出需要特别说明的是build-repeat时代久远src/libstore/legacy-ssh-store.cc 中留有注释 buildRepeat hasnt worked for ages anyway说明该机制在后来的 store 接口演进中逐渐退居次要位置而--check路径则持续维护至今。读者在实践确定性问题排查时应以当前版本nix-build --check/nix-store --check的实际行为为准。五、其他改进5.1 改进的 FreeBSD 支持1.11 修复了若干 FreeBSD 平台问题。当前仓库中仍保留着完整的 FreeBSD 支持代码如 misc/freebsd/nix-daemon.in、scripts/install-freebsd-multi-user.sh以及 src/libstore/freebsd 与 src/libutil/freebsd 平台目录印证 FreeBSD 是 Nix 持续支持的官方平台。5.2nix-env -qa --xml --meta输出许可证信息nix-env -qa --xml --meta现在会在 XML 输出中打印软件包的许可证license信息。这为包管理审计、许可证合规扫描提供了机器可读的通道。5.3 二进制缓存并发连接数150 → 25二进制缓存替换器binary cache substituter使用的最大并行 TCP 连接数从 150 降到 25。官方发布说明给出两个理由一是避免激怒某些存在缺陷的 NAT 路由器broken NAT routers二是同时改善了整体性能表现。5.4 chroot 全面更名为 sandbox所有包含 chroot 的字符串被重命名为 sandbox。部分 Nix 选项随之改名旧名字仍然作为低优先级别名被接受。这一术语统一在后续版本中完全定型可从当前仓库的设置定义中直接看到别名痕迹src/libstore/include/nix/store/local-settings.hh 中sandboxMode设置项带有{build-use-chroot, build-use-sandbox}两个旧别名即 1.11 前后选项名的直接对应关系旧build-use-chroot在更早版本中还写作build-use-chroot的布尔开关新build-use-sandbox→ 最终定型为sandbox同一设置项还说明了沙箱语义Linux 上默认启用smEnabled构建在私有 PID、mount、network、IPC 与 UTS 命名空间中进行仅固定输出派生保留网络访问macOS 也受支持但需要以 root 配合 build users 使用local-settings.hh。配套的sandbox-paths选项旧别名build-chroot-dirs等支持targetsource语法将宿主路径挂载进沙箱甚至可以用?后缀容忍源路径不存在local-settings.hh。六、版本贡献者本版本汇集了社区大量贡献官方致谢名单包括Anders Claesson、Anthony Cowley、Bjørn Forsman、Brian McKenna、Danny Wilson、davidak、Eelco Dolstra、Fabian Schmitthenner、FrankHB、Ilya Novoselov、janus、Jim Garrison、John Ericson、Jude Taylor、Ludovic Courtès、Manuel Jacob、Mathnerd314、Pascal Wittmann、Peter Simons、Philip Potter、Preston Bennes、Rommel M. Martinez、Sander van der Burg、Shea Levy、Tim Cuthbertson、Tuomas Tynkkynen、Utku Demir 与 Vladimír Čunát。结语Nix 1.11 虽然自我定位为 bug 修复版本但其引入的从 Nix 表达式预取并打印哈希NAR 化引导下载SHA-512 支持以及重复构建强制比对 -check对照产物的组合拳为可复现构建实践奠定了坚实基础chroot → sandbox的术语统一则让 Nix 的隔离模型在文档与代码层面走向一致。读者若想深入探索可以继续阅读 src/nix/prefetch.cc、src/libexpr/fetchurl.nix 与 src/libstore/build 目录下的构建目标源码并结合当前 Nix 的nix store prefetch-file命令src/nix/prefetch.cc体验这套机制的现代形态。【免费下载链接】nixNix, the purely functional package manager项目地址: https://gitcode.com/gh_mirrors/ni/nix创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。