NixCon 2025 Trip Report 🐝

Michael Stapelberg

NixCon 2025 参会记 🐝

原文由 Michael Stapelberg 发布,订阅该博客

今年早些时候我参加了 NixOS 聚会,很喜欢那次活动。聚会结束时,主办方告诉大家今年的 NixCon 2025 将在瑞士举办,地点还是同一个地方——位于拉珀斯维尔的东瑞士应用科学大学 OST,于是我决定去看看!在这篇参会记里,我想大致聊聊我亲身感受到的这场精彩大会 :)

标题里的蜜蜂是 NixCon 的一个内部梗 ;)

周五

周五早上雨下个不停,我大约 09:30 抵达,匆匆从火车站赶到 OST 的 1 号楼,出示门票二维码,领取了参会胸牌和我提前定制的铭牌。定制铭牌上刻着名字,配有强力磁扣,可以吸在衣服上:

普通胸牌和定制铭牌

简单吃了点东西后,我前往主报告厅参加开幕式。来自 OST 的 Farhad Mehta 教授以及整个 NixCon 组委会欢迎了 450 位注册参会者,迎来了第十届 NixCon!我在现场认出了不少之前在 Nix 聚会上见过的熟面孔,不过当主持人问起谁是第一次参加 NixCon、或第一次来瑞士时,也有很多人举起了手。

在此特别感谢 Mehta 教授,正是他让这些聚会和活动得以举办!👏

如果你在拥有场地的大学、学校或其他机构工作,不妨考虑主动承办一场聚会(定期举办也好,哪怕只办一次也好)!场地向来难找,能提供空间本身就是对开源的一大贡献。

“如果 GitHub Actions 是本地优先且用 Nix 构建的,会怎样?”

当天的第一场技术分享是 Domen Kožar 带来的“如果 GitHub Actions 是本地优先且用 Nix 构建的,会怎样?”,他是 cachix.org(一个托管的 Nix 缓存服务)的创始人。分享推介的是 cloud.devenv.sh,这是一个基于 devenv 的、类似 GitHub Actions 的 Nix CI 方案。

使用这套方案,你就能解决无法在本地轻松、完整地运行 GitHub Actions 的问题(是的,大家都知道 act),而且还能用 Nix 配置来替代 YAML 配置(?)。

方案看起来不错,不过我觉得分享有点零散,讲者在幻灯片之间来回跳转。一个关键问题也没有得到回答:这个定制方案要怎么和你的 GitHub 项目集成?对我自己的项目来说,偏离 GitHub Actions 的默认配置方式似乎不太值得。当然,这只是我的个人看法。

→ 在 media.ccc.de 上观看录像(46 分钟)

“用 Rust 重写 Hydra 队列执行器”

接下来是来自德国小型软件公司 Helsinki Systems 的 Simon Hauser 带来的“用 Rust 重写 Hydra 队列执行器”。Hydra 是 NixOS 基础设施中负责调度构建的组件:当 nixpkgs 发生变化时,就是由它来执行构建,构建产物最终会出现在 cache.nixos.org 上(相当于 Debian 中的 buildd)。

Simon 解释说,现有队列执行器的瓶颈导致基础设施资源被闲置:项目明明有可用的机器,却无法充分利用。他们用设计良好的 gRPC 协议取代了原来臃肿的基于 SSH 的自动化。我感觉有一群人一起参与了这套方案的设计和评审,这对项目的健康发展来说是个好信号。

遗憾的是,分享中缺少了数据指标。如果能放几张图表,直观展示重写后的队列执行器到底提升了多少,那就更好了。

目前,新的队列执行器已经用于 Nix 社区的构建,但尚未在 NixOS 正式环境中上线。不过,应该快了!

→ 在 media.ccc.de 上观看录像(27 分钟)

“没有 hell 就拼不出 devshell”

这场分享来自 Flox 的 Zach Mitchell,Flox 是一家提供基于 Nix 的开发环境解决方案的公司。到目前为止,我一直用 nix-shellnix develop(参见Development shells with Nix: four quick examples),所以很好奇能从这场分享中学到什么。

Zach 解释说,nix-shellnix 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 并生成甘特图时序语法。听起来很酷,可惜目前好像坏了……有点可惜。

→ 在 media.ccc.de 上观看录像(45 分钟)

“Nix 二进制缓存与 AWS”

在这场炉边对谈中,Tarus Balog 分享了他如何在投身开源 20 年后加入 AWS,以及他的团队希望如何回馈社区。他们回馈的具体方式之一,就是托管 cache.nixos.org。

→ 在 media.ccc.de 上观看录像(24 分钟)

“Shopify 基于 Nix 的开发环境(再述)”

来自 Shopify 的 Josh Heinrichs 分享了他们(再次)采用 Nix 的过程,我觉得这类来自企业一线的真实落地故事非常有意思。

简单来说,Shopify 自 2016 年起就有一个 dev 命令,提供声明式配置,然后分发到 apt(Linux)或 homebrew(macOS)执行。第一次尝试迁移到 Nix 时,推进并不顺利(还有一部分人用不起来),恰逢公司整体转向云端开发,而更省事的办法就是“直接用 Ubuntu”。

几年过去,大家对云端开发环境似乎不太满意。有一天,Shopify 首席执行官 Tobias Lütke 发现了 devenv,一个基于 Nix 的方案,竟然和 Shopify 的 dev 非常相似。于是 Tobi 在自家一个服务上试用了 devenv,并开始支持使用 Nix。这一次,他们在组织内部的推广上花了更多功夫,意味着循序渐进地采纳、让所有相关方都参与进来等等。

启示在于,一个得到良好支持的具体用例就能成为采纳的驱动力。一旦你的开发环境迁移到了基于 Nix 的方案,生态中的其他部分也就更容易跟进了。

→ 在 media.ccc.de 上观看录像(19 分钟)

“我的第一个 Nix 顿悟时刻:新人的视角”

与 Shopify 的分享精神相似,来自 ASML 的 Kavisha Kumar 分享了她在看到同事用 nix-shell 获得干净开发环境后,是如何入坑 Nix 的。

Kavisha 在 ASML 花了很多时间向他人讲解为什么以及如何使用 Nix。她分享了不少用电子游戏领域来类比解释 Nix 概念的巧妙比喻。

我觉得很多人对 Nix 充满热情,却苦于不知道如何把这份热情传递给他人。Kavisha 为我们展示了一种对她行之有效的好方法。

→ 在 media.ccc.de 上观看录像(19 分钟)

闪电演讲

当天剩下的时间都是闪电演讲。

来自 Determinate Systems 的 Cole Mickens 介绍了他们在其下游发行版“Determinate Nix”中正在交付的功能(之后会合入上游):lazy trees(针对 Flake 求值的性能优化)、并行求值(将求值时间从 16 秒降至 7 秒)以及面向 Mac 的原生 Linux 构建器。接下来计划是 Flake Schemas,我还没了解过。

来自 Nix 与 DevOps 咨询公司 Numtide 的 Yvan Sraka 展示了他如何用 NixOS 为亲友管理 Linux 机器。他在 NixOS 之上维护了自己的配置层,只把系统当作底座。实际使用的大多数程序则通过 AppImage、Flatpak、envfsnix-ld 来运行。后两者是在 NixOS 这类非 FHS 系统上运行那些依赖 /usr/bin 等标准路径的 FHS 程序的解决方案。我以前听说过 nix-ld,但还没听说过 envfs。

来自 Nixcademy 的 Jacek Galowicz 演示了如何结合 systemd-sysupdate 与 systemd-repart,用 NixOS 实现 A/B 式更新。很高兴看到这项技术越来越主流,因为我自己也在 gokrazy 中成功地使用了 A/B 式更新。

周六

周六天气好了很多,所以我特意找了个能看到苏黎世湖景的座位:

湖景!

“自行车棚之争已定:官方 Nix 格式化工具”

在这场分享中,来自 Tweag 的 Silvan Mosberger(也是 NixCon 的主要组织者之一!)讲解了 .nix 文件官方格式化工具的诞生过程。

听到官方 Go 格式化工具 gofmt 被提及为灵感来源,我很开心。正如在其他语言生态中一样,统一的格式化能省去代码评审中为遵守代码风格而反复拉锯的时间。可惜的是,格式化团队并没有复制 gofmt 成功的一个关键点:gofmt 没有任何选项。正如那句著名的 Go 谚语所说:

gofmt 的风格不是任何人的最爱,但 gofmt 却是每个人的最爱!

意思是说,让所有人都使用同一种风格,远比让每个人都能表达个人风格偏好更重要。

→ 在 media.ccc.de 上观看录像(20 分钟)

“精通 NixOS 集成测试:快速、健壮的多虚拟机测试进阶技巧”

在这场长达两小时的工作坊中,来自 Nixcademy 的 Jacek Galowicz——他不仅是 Nix 讲师,还是 NixOS 集成测试驱动的维护者——向我们展示了如何用几行 Nix 和 Python 编写复杂的集成测试。

Jacek 展示了一个集成测试示例:一个由 tracker、客户端、防火墙和多网络组成的 BitTorrent 服务!nixpkgs 中包含了 1000 多个这样的集成测试,在你的笔记本上运行一个非常简单。

各种调试测试的方法看起来很酷:用 vsock 替代端口转发,以及启用调试钩子,让失败的测试挂起等待调试。

我觉得这是一次非常棒的概览,Jacek 也是一位很会调动气氛的老师。推荐大家去上他的课!

“何时不必用 Nix:外部配置与 SOPS Nix 实践”

Ryota 讲了什么时候该用 Nix、什么时候不该用 Nix。比如,你可以用 Nix 来管理 dotfiles(配置文件),也可以选择不用。最近我把越来越多的机器和配置迁移到了 Nix,对这场分享深有同感:搞清楚声明式管理和有状态管理的配置各能带来什么、以及何时哪种方式更合适,非常重要。

→ 在 media.ccc.de 上观看录像(19 分钟)

闪电演讲

当天剩下时间我都泡在闪电演讲里,其中一些是赞助商的演讲时段。我了解到(排名不分先后):

  • Cloud Hypervisor,一个基于 KVM 的 hypervisor,类似 qemu,但用 Rust 编写。
  • nixbuild.net,一个按需付费的额外构建算力租赁服务。周日我听到有人说他们公司在用 nixbuild.net,体验非常流畅。
  • NixCI,一个基于 Nix 的托管 CI 服务。所以,我们周五听到的 cloud.devenv.sh 服务就是这项服务的竞品。
  • Nix in the Wild 是 Flox 发起的一项活动,他们会做 45-60 分钟的访谈,分享 Nix 的成功故事。这或许能帮你说服组织里的人。
  • clan 是一个集群 fleet 管理解决方案。
  • NovaCustom,一家一人运营的笔记本/PC 公司。其笔记本预装 coreboot,可良好支持 NixOS。
  • ExpressVPN 正在将其内部服务器架构(TrustedServer)从 Debian 迁移到 NixOS!每周在 105 个以上国家/地区部署。
  • 德国公司 Cyberus 正在提供符合欧盟《网络弹性法案》要求的 NixOS LTS 版本。
  • David 的 styx 项目是一种更节省带宽的 NixOS 更新下载机制。该项目使用了 EROFS,这似乎是 SquashFS 镜像的一个有趣替代方案。

所有分享结束后,我们在户外合影,随后在湖边烧烤:

NixCon 2025 合影

NixCon 2025,摄影:Arik Grahl。采用 CC BY-SA 4.0 许可。

周日

会前我还不确定周日(黑客日)要不要来,但到了周日,我的想法变成了“当然要来!”,而这真是个绝佳的决定!

很多人还在现场,埋头做着自己的项目。感觉任何 Nix 问题只要发条消息就能得到解答——项目的各个领域都有专家和热心人随时帮忙。

我最终见到了几位之前只在网上有过交流的朋友,我们还聊了很多关于聚会的事。现在,我已经受邀去好几个聚会做分享了 :D

结语

这是一场非常棒的大会!组委会和所有贡献者都做得非常出色!

一如既往,拉珀斯维尔的 OST 是举办开源活动的绝佳场地。

门票销售以及议题征集/日程安排使用了开源系统 PretixPretalx,这让我为自己曾为 Pretix 做过贡献而感到自豪。

议题的选择很棒:有些非常技术硬核,有些只关注人的层面,还有很多介于两者之间。我感觉我看到的所有讲者都真正热爱自己的主题,所以整体氛围非常好!

(你可以在 media.ccc.de: NixCon 2025 上观看所有分享录像。)

在分享之外,我也有许多友好的交流和有趣的对话。能看到大家对 Nix 有如此多的兴趣和落地实践,真的很棒!

对于这样一场由志愿者驱动的大会来说,制作水准非常高。比如,环节之间播放的动听间场音乐就是专为 NixCon 创作的:“Lava” by tonstr.studio。同样,迎新礼包里还有专为 NixCon 定制的瑞士黑巧克力(见下图)。我本来不喜欢黑巧克力,但这款真的很好吃!

再次感谢所有志愿者,期待很快再来!

NixCon 2025 瑞士巧克力

本文章由 muse-spark-1.2-contributor 进行翻译

评论