NixCon 2025 参会记 🐝
我很喜欢今年早些时候的 NixOS 聚会,聚会结束时他们向大家介绍了 NixCon 2025——今年将在瑞士举办,而且就在同一个地点:Rapperswil 的OST 应用科学大学,于是我决定去参加!在这篇参会记里,我想给大家一个大致的印象,讲讲我在这场精彩大会上的体验 :)
标题里的蜜蜂是 NixCon 的一个内部梗 ;)
周五
我在一个下雨的周五早上大约 09:30 到达,于是匆匆从火车站赶往 OST 一号楼,出示门票二维码,领取会议胸牌和我预先订购的定制姓名牌。定制款姓名牌上刻有你的名字,并配有一块强力磁铁,可以吸附在衣服上:

随便吃了点东西后,我前往主报告厅参加开幕式。来自 OST 的 Prof. Dr. Farhad Mehta(法尔哈德·梅塔教授)以及整个 NixCon 组织团队,欢迎了 450 名注册参会者来到第十届 NixCon!我认出了许多在 Nix 聚会上见过的熟悉面孔,但当主持人问谁是第一次参加 NixCon、或者第一次来瑞士时,很多人举起了手。
我要特别感谢 Mehta 教授促成这样的聚会和活动!👏
如果你在大学、学校或其他拥有场地的机构工作,可以考虑主动承办一次聚会(定期举办,哪怕只办一次也好)!场地总是很难找,所以提供场地是对开源的一大贡献。
“如果 GitHub Actions 是本地优先的,并且用 Nix 构建呢?”
当天第一场技术演讲是 Domen Kožar(多门·科扎尔)带来的“如果 GitHub Actions 是本地优先的,并且用 Nix 构建呢?”,他是 cachix.org 背后的人,这是一个托管的 Nix 缓存服务。这场演讲介绍了 cloud.devenv.sh,一个基于 Nix 的 CI 解决方案(类似 GitHub Actions),使用了 devenv。
使用这个方案,你可以解决无法轻松/完整地在本地运行 GitHub Actions 的问题(是的,我们都知道 act),并且还能(?)用 Nix 配置代替 YAML 配置。
这个方案看起来不错,但我觉得演讲有点缺乏条理,因为演讲者在幻灯片之间跳来跳去。有一个关键问题没有得到回答:如何把这个自定义方案集成到你的 GitHub 项目中?对我来说,偏离 GitHub Actions 默认配置方式对我的项目来说并不值得。各人感受可能不同。
“用 Rust 重写 Hydra 队列运行器”
接下来是来自德国小型软件公司 Helsinki Systems 的 Simon Hauser(西蒙·豪泽)带来的“用 Rust 重写 Hydra 队列运行器”。Hydra 是 NixOS 基础设施中负责调度构建的组件:当 nixpkgs 发生变化时,正是这个组件运行构建,其结果最终出现在 cache.nixos.org 上(Debian 中的对应物是 buildd)。
Simon 解释说,当前队列运行器中的瓶颈导致基础设施闲置:项目有一些机器却无法充分利用。他概述了他们如何用一个设计良好的 gRPC 协议取代陈旧的基于 SSH 的自动化机制。我的印象是,有一群人参与了这个设计的开发和评审,这对一个健康的项目来说是好迹象。
遗憾的是,演讲中缺少性能指标。如果能看到几张图表来说明重写后的队列运行器到底好了多少,那就太棒了。
目前,新的队列运行器已经用于 Nix Community 构建,但尚未在生产环境中用于 NixOS 本身。希望很快就能实现!
““devshell”里少不了“hell””
这场演讲由来自 Flox(一个基于 Nix 的开发环境解决方案)的 Zach Mitchell(扎克·米切尔)主讲。到目前为止,我用的是 nix-shell 或 nix develop(参见《Development shells with Nix: four quick examples》),所以我很好奇能从这场演讲中学到什么。
Zach 解释说,nix-shell 和 nix develop 最初都是为了调试 Nix 软件包构建而编写的,而不是为了提供通用的开发环境。对用户而言,这表现为无法使用你喜欢的 shell——nix develop 只支持 Bash。你可能会读到 nix develop -c exec <shell> 这种用法,但那是错的,因为这样 shell 的 RC 文件会在 Nix 设置之后运行,可能会破坏部分设置。
我学到的一个有趣的知识点是,Nix 垃圾回收器会扫描 /proc,以避免删除仍被正在运行的进程需要的 Nix store 路径。
Zach 提到了 https://github.com/zmitchell/proctrace,这是一个基于 bpftrace 的分析器,跟踪 fork/exec 并生成时间线的 gantt 图语法。听起来很酷,但不幸的是它现在坏掉了……?真可惜。
“Nix 二进制缓存与 AWS”
在这场炉边谈话中,Tarus Balog(塔鲁斯·巴洛格)分享了他如何在从事开源 20 年之后加入 AWS,以及他的团队希望如何回馈社区。其中一个具体方式就是托管 cache.nixos.org。
“Shopify 基于 Nix 的开发环境(重演)”
来自 Shopify 的 Josh Heinrichs(乔什·海因里希斯)分享了他们如何(再次!)采用 Nix,我认为这种真实世界的企业采用故事非常有趣。
概括地说,Shopify 有一个 dev 命令(自 2016 年起),提供声明式配置,然后分发给 apt(Linux)或 homebrew(macOS)。第一次迁移到 Nix 的尝试没有站稳脚跟(有些人还无法使用它),随后公司整体转向云端开发,当时更简单的方案是“直接用 ubuntu 就行”。
几年过去,大家显然对云端开发环境不太满意。有一天,Shopify CEO Tobias Lütke(托比亚斯·吕特克)发现了 devenv,这是一个基于 Nix 的方案,与 Shopify 的 dev 惊人地相似。于是 Tobi 把 devenv 用于他们的一个服务,并开始支持使用 Nix。这一次,他们在组织内部的成功推广上投入了更多时间,包括渐进式采用、让所有利益相关者参与进来等等。
结论是:一个具体的、支持良好的用例可以成为采用的驱动力。一旦你的开发环境建立在基于 Nix 的方案上,就可以更容易地采用生态系统的其他部分。
“我的第一个 Nix Aha! 时刻:新人的视角”
与 Shopify 那场演讲精神相似,来自 ASML 的 Kavisha Kumar(卡维莎·库马尔)分享了她如何因为看到同事用 nix-shell 获得干净的开发环境而入门 Nix。
Kavisha 在 ASML 花了大量时间向他人讲解为什么以及如何使用 Nix。她分享了许多巧妙的比喻,通过电子游戏领域来解释 Nix 概念。
我觉得很多人对 Nix 充满热情,但难以把这种热情传达给他人。Kavisha 向我们展示了一种对她行之有效的好方法。
闪电演讲
当天剩下的时间被闪电演讲填满了。
来自 Determinate Systems 的 Cole Mickens(科尔·米肯斯)介绍了他们目前在下游发行版“Determinate Nix”中提供的特性(这些特性将被上游合并):lazy trees(一种加速 Flakes 求值的性能优化)、并行求值(将求值时间从 16 秒降到 7 秒)以及面向 mac 的原生 Linux builder。接下来是 Flake Schemas,我还没读过相关内容。
来自 Nix 与 DevOps 咨询公司 Numtide 的 Yvan Sraka(伊万·斯拉卡)展示了他如何用 NixOS 为朋友和家人管理 Linux 机器。他在 NixOS 之上构建了自己的配置层,只把系统当作基础。大多数实际程序通过 AppImage、Flatpak、envfs 和 nix-ld 来使用。后两者是在 NixOS 这类非 FHS 系统上运行基于 FHS 的程序(那些期望存在 /usr/bin 和其他标准路径的程序)的解决方案。我以前听说过 nix-ld,但没听说过 envfs。
来自 Nixcademy 的 Jacek Galowicz(雅采克·加洛维茨)展示了如何用 systemd-sysupdate 和 systemd-repart 在 NixOS 和 systemd 上实现 A/B 式更新。很高兴看到这种技术越来越主流,我自己也在 gokrazy 中成功地使用了 A/B 式更新。
周六
周六天气好多了,所以我特意选了一个能看到苏黎世湖景色的座位:

“自行车棚已经盖好了:官方 Nix 格式化工具”
在这场演讲中,来自 Tweag 的 Silvan Mosberger(西尔万·莫斯伯格)(也是 NixCon 的主要组织者之一!)讲解了 .nix 文件的官方格式化工具是如何诞生的。
听到 Go 官方格式化工具 gofmt 被提及为灵感来源,我很高兴。就像其他语言生态一样,引入统一的格式化消除了代码评审中关于编码风格的耗时来回讨论。遗憾的是,格式化工具的开发者们没有复制 gofmt 成功的一个关键方面:gofmt 没有任何选项。正如那句著名的 Go 谚语所说:
Gofmt 的风格不是任何人的最爱,但 gofmt 却是每个人的最爱!
意思是,比起每个人都能表达自己的风格偏好,更重要的是所有人都使用同一种风格。
“精通 NixOS 集成测试:快速且健壮的多虚拟机测试的高级技巧”
在这个两小时的工作坊里,来自 Nixcademy 的 Jacek Galowicz——他不仅是 Nix 讲师,还恰好是 NixOS 集成测试驱动程序的维护者——向我们展示了如何用几行 Nix 和 Python 编写复杂的集成测试。
Jacek 展示了一个集成测试示例:一个 Bittorrent 服务,由 tracker、客户端、防火墙和多个网络组成!Nixpkgs 包含超过 1000 个这样的集成测试,在你的笔记本上运行其中一个很容易。
各种调试测试的方法看起来相当酷:用 vsock 代替端口转发,以及启用一个调试钩子,让失败的测试挂起等待调试。
我觉得这是一次很棒的概览,Jacek 也是一位很有感染力的讲师。我推荐你去报他的课!
“何时不该用 Nix:处理外部配置与 SOPS Nix”
Ryota 谈到了什么时候该用 Nix、什么时候不该用。例如,你可以用 Nix 管理你的 dotfiles(配置文件),也可以决定不用。最近我把越来越多的机器和配置迁移到了 Nix,发现自己很认同这场演讲的观点:重要的是理解声明式或状态式管理配置分别能带来什么,以及什么时候哪种方法更好。
闪电演讲
当天剩下的时间我在听闪电演讲,其中一些是赞助商演讲时段。以下是我了解到的内容(不分先后):
- Cloud Hypervisor,一个类似 qemu 的基于 KVM 的 Hypervisor(虚拟机监控程序),但用 Rust 编写。
- nixbuild.net,一项按需付费的服务,可以租用额外的构建能力。周日我听有人说他们的公司在用 nixbuild.net,体验非常顺畅。
- NixCI,一个基于 Nix 的托管 CI。也就是说,我们周五听到的 cloud.devenv.sh 服务是它的竞争对手。
- Nix in the Wild 是 Flox 的一项工作,他们会进行 45–60 分钟的访谈,讲述 Nix 的成功案例。这或许能帮你说服组织里的人。
- clan 是一个机群管理解决方案。
- NovaCustom,一家一人经营的笔记本/PC 公司。笔记本搭载 coreboot,且兼容 NixOS。
- ExpressVPN 正在把他们的内部服务器架构(TrustedServer)从 Debian 迁移到 NixOS!每周部署到 105+ 个国家。
- Cyberus,一家德国公司,提供符合欧盟《网络弹性法案》义务的 NixOS LTS 发行版。
- David 的 styx 项目是一种带宽效率更高的 NixOS 更新下载机制。它使用了 EROFS,看起来像是 SquashFS 镜像的一个有趣替代品。
所有演讲结束后,我们在室外集合拍了一张合影,然后去湖边烧烤:

NixCon 2025,摄影:Arik Grahl。依据 CC BY-SA 4.0 许可授权。
周日
大会开始前,我不确定周日(Hack day)是否值得露面,但到了周日,我心想“当然要去!”,事实证明这是个绝佳的决定!
很多人还在现场做自己的项目。感觉任何 Nix 问题都只差一条聊天消息就能得到答案——项目的各个角落都有专家和乐于助人的双手。
我最后见到了几位此前只在网上交流过的人,我们还聊了很多关于聚会的话题。现在,我已经受邀去多个聚会上做演讲了 :D
结语
这是一场精彩的会议!组织团队和所有贡献者都做得非常出色!
一如既往,Rapperswil 的 OST 是举办开源活动的绝佳场地。
售票和演讲提交/排期都是用 Pretix 和 Pretalx 这两个开源系统完成的,这让我为自己曾为 Pretix 做出贡献而感到自豪。
演讲的选择非常好:有些非常深入技术细节,有些只关注人文层面,还有很多介于两者之间。我感觉所有我看到的演讲者都真心关心自己的主题,所以整体氛围非常好!
(你可以在 media.ccc.de: NixCon 2025 观看演讲录像。)
除了演讲之外,我还进行了许多友好的互动和有趣的交谈。人们对 Nix 有浓厚的兴趣和广泛的采用,看到这一点真好!
对于这样一个志愿者驱动的活动来说,大会的制作水准非常高。例如,演讲之间那些听起来非常酷的休息音乐是专门为 NixCon 创作的:tonstr.studio 的“Lava”。同样,欢迎礼包里装有为 NixCon 特制的瑞士黑巧克力(见下图)。我本来连黑巧克力都不喜欢,但这一款真的很好吃!
再次感谢所有帮助者,期待很快再回来!

随机一篇博客