2026 年远程 Mac Runner 上跑 Nix Flake,关键常在三处:flake.lock 钉死输入substituter 顺序与 trusted-public-keys 一致max-jobs / cores 与磁盘水位对齐共享出口。下文给可复制 nix.conflock 更新与回滚命令,以及本机命中 / 远程缓存 / 自建缓存对比表。延伸阅读 构建池磁盘 FAQGHCR 拉取矩阵博客列表首页免登录。

输入锁、跨境拉取与 2026 Runner 现实

Flake 用 lock 里的精确提交换可复现 CI,但冷构建仍会密集拉 narinfo / NAR。跨境下若 substituters 未按 RTT 排序,或 max-jobs 与多 Job 对撞,易出现 TLS 超时、回源编译与 /nix 快速触顶。

排障优先级(从高到低)
  • lock 漂移:合并了 flake.nix 却未同步提交 flake.lock,或反之。
  • 公钥与缓存主机不匹配:日志出现 ignoring untrusted substituter,实际走了全量本地构建。
  • 并行度与带宽对撞:多 Job × 高 max-jobs 放大 nar 下载并发。
  • 磁盘硬阈值未接:store 写满后表现为神秘失败或守护进程报错。

建议每次只调一维:先确认 substituter 命中与签名,再动 max-jobs,最后才考虑改输入版本。

对比表:本机二进制缓存 vs 远程 substituter vs 自建缓存

这里的「本机」指同一 Runner 上已存在于 Nix Store 的路径命中,无需出网;远程与自建则涉及信任边界与合规审计

形态 典型收益 主要风险 / 代价 与 nix.conf 的关系
本机 store 命中(上一轮构建残留) 零出网、最低延迟 多租户隔离不当会泄露闭包;缓存键错误会「误命中」旧 drv 不写入 substituters;靠 同一 lock 与干净或受控的 store
远程 substituter(cache.nixos.org 等) 大量预编译路径,显著缩短冷启动 跨境带宽与 SNI 抖动;官方未覆盖的私有 overlay 仍回源编译 substituters 前列 + 对应 trusted-public-keys
自建二进制缓存(S3/MinIO + nix-serve / Harmonia 等) 可走内网或专线;可镜像组织常用闭包 密钥轮换、索引一致性、首包冷拉成本 追加 HTTPS 端点与组织签名公钥;必要时经反向代理做鉴权

可复制的 nix.conf(substituters、公钥、max-jobs、cores)

写入守护进程读取的 nix.conf(多用户常见 /etc/nix/nix.conf)。substituters 从左到右优先。下方 https://nix-cache.example.internalYOUR_ORG_CACHE_KEY... 为占位,替换为团队缓存 URL 与配对公钥。

# /etc/nix/nix.conf — 远程 Mac CI 保守起点(2026 场景可再按监控调参) substituters = https://cache.nixos.org https://nix-cache.example.internal trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGsppcDbrj= YOUR_ORG_CACHE_KEY_NAME:BASE64_PART_HERE== max-jobs = 2 cores = 0 experimental-features = nix-command flakes # 说明:cores=0 表示由 Nix 自动探测可用 CPU; # 共享 Runner 更激进时可改为 max-jobs = 1 以降低与其它 Job 争抢。

临时覆盖可用 NIX_CONFIG 注入 extra-substituters;长期建议写入镜像或配置管理。

Flake lockfile:更新、单输入升级与回滚命令

合并前用与 CI 同 major 的 Nix更新锁,把解析失败拦在 PR。回滚优先 git checkout,其次备份文件。

# 全量按 flake.nix 重新解析并写 lock nix flake lock # 仅升级某一输入(示例:nixpkgs) nix flake lock --update-input nixpkgs # 构建前快速自检(不触发大规模构建时可配合 --no-link 等策略,按项目裁剪) nix flake show nix flake metadata # 回滚 A) Git 仓库内 git checkout HEAD~1 -- flake.lock # 回滚 B) 流水线内保留上一份 lock 副本 cp flake.lock flake.lock.bak nix flake lock --update-input nixpkgs # 若失败或结果不可接受: mv flake.lock.bak flake.lock

lockfile 变更流程可对照 Rust lockfile 矩阵 的单点变更习惯。

失败重试与磁盘水位参数清单

出网拉取外层用带抖动的 2/4/8 秒阶梯,避免多 Runner 同相对齐。磁盘在构建前自检:预警后跑 nix-store --gc,硬阈值直接 fail fast。

参数 保守起点(共享出口 / 多 Job) 说明
TLS / 连接重置 / 5xx 重试间隔(秒) 2 → 4 → 8(最多 3~4 次,±20% 抖动) 连续失败先降 max-jobs 再拉长间隔
磁盘预警(可用空间低于) 18 GiB:触发 nix-store --gc 或告警 大闭包项目可上调预警线,但需监控趋势
磁盘硬阈值(低于则禁止新构建) 12 GiB:失败 fast,避免半写入 store 与构建池 FAQ 中的「触顶」排障衔接
max-jobs(共享 Runner) 1~2 独占整机且带宽充足再评估上调

检索要点(meta title / description)

编辑与投放用短文案
  • Title 要点:含「2026」「远程 Mac」「Nix Flake」「substituter」「nix.conf」「决策矩阵」等检索词,总长约 28~35 个汉字以避免截断。
  • Description 要点:一句点出「lock 更新/回滚 + 三类缓存对比 + max-jobs/磁盘阈值 + 重试阶梯」,并暗示教程可复制。

页面 <head> 中已写入对应 titledescription,并与 BlogPosting、Breadcrumb、HowTo、FAQPage JSON-LD 对齐。

FAQ

日志提示 ignoring untrusted substituter?

为每个 HTTPS 缓存主机配置匹配的 trusted-public-keys;不要随意信任来源不明的公钥。临时调试可用特权命令,但不要把调试配置长期留在共享 Runner。

更新 flake.lock 后 CI 变慢?

新版本可能触发大量回源编译;用 nix path-info -r 一类命令对比闭包体积变化,并检查是否误删了可用的 substituter 或镜像路由。

总结

2026 年要在远程 macOS 上把 Nix CI 跑得可回归:先钉死 flake.lock,再让 nix.conf 的 substituter 顺序与公钥、max-jobs / cores 与出口能力一致,最后把重试阶梯与磁盘 18/12 GiB 水位写进 Runbook。需要可长期驻留的 Apple Silicon 环境做验证,可前往 购买页帮助中心(均免登录),或从 首页了解节点与网络选项。

要点:lock 与 flake.nix 同步提交;substituters × trusted-public-keys 成对校验;共享机低 max-jobs;出网失败2/4/8 秒抖动重试;磁盘18/12 GiB两档阈值。

Nix × 远程 Mac

要在常驻 macOS 上复现 Flake 与 substituter 全链路?

首页购买页帮助中心 免登录;继续阅读 技术博客构建池磁盘 FAQGHCR 拉取矩阵

Apple Silicon
SSH 访问
弹性租期
支持渠道