NixCon 2025 Trip Report 🐝

Michael Stapelberg

NixCon 2025 參會紀行 🐝

原文由 Michael Stapelberg 發布,訂閱此部落格

我很喜歡今年稍早的 NixOS 聚會,聚會尾聲時主辦方跟大家預告了今年的 NixCon 2025,地點就在瑞士,而且跟那場聚會同一個地方——位於 Rapperswil 的東瑞士應用科技大學(OST),所以我就決定要去了!在這篇參會紀行裡,我想大概分享一下我對這場超棒大會的體驗 :)

標題裡的蜜蜂是 NixCon 的內部哏 ;)

星期五

雨天的星期五早上,我大約 09:30 抵達,一路從車站匆匆趕到 OST 的 1 號館,出示票券的 QR code 領取識別證,還有我事先預訂的客製化名牌。客製化的名牌上會刻上你的名字,並附有強力磁扣,可以直接吸在衣服上:

一般名牌與客製化名牌

隨便吃了點東西後,我就前往主講廳參加開幕式。來自 OST 的 Prof. Dr. Farhad Mehta 與整個 NixCon 籌辦團隊,一起歡迎 450 位報名參加第十屆 NixCon 的與會者!我在現場認出了不少在 Nix 聚會上見過的熟面孔,不過當主持人問到誰是第一次參加 NixCon、或是第一次來瑞士時,還是有很多人舉手。

我想特別感謝 Mehta 教授,讓這些聚會與活動得以實現!👏

如果你在大學、學校或其他有場地資源的單位工作,不妨考慮提供場地來舉辦聚會(無論是定期舉辦,或甚至只辦一次也好)!場地向來不好找,能提供空間本身就是對開源的一大貢獻。

“What if GitHub Actions were local-first and built using Nix?”

當天的第一場技術演講是 Domen Kožar 帶來的 “What if GitHub Actions were local-first and built using Nix?”。他是 cachix.org 背後的開發者,cachix.org 是一個託管式的 Nix 快取服務。這場演講主推的是 cloud.devenv.sh,這是一個以 devenv 為基礎、用 Nix 打造的 CI 解決方案(類似 GitHub Actions)。

採用這個方案,就能解決 GitHub Actions 不容易/無法完整在本地端執行的問題(是的,大家都知道 act),而且你可以用 Nix 設定檔來寫,而不是 YAML(姑且這麼說?)。

這個方案看起來不錯,不過我覺得演講有點鬆散,因為講者在投影片之間跳來跳去。有一個關鍵問題沒有得到解答:要怎麼把這個客製化方案整合進你現有的 GitHub 專案?對我來說,為了自己的專案而偏離 GitHub Actions 預設的設定方式,似乎不太值得。當然,每個人的情況不同。

→ 在 media.ccc.de 觀看錄影(46 分鐘)

“Rewriting the Hydra Queue Runner in Rust”

接下來是 Simon Hauser 帶來的 “Rewriting the Hydra Queue Runner in Rust”,他來自德國的小型軟體公司 Helsinki SystemsHydra 是 NixOS 基礎設施中負責排程建置的元件:當 nixpkgs 有更動時,就是由它來執行建置,建置結果最終會出現在 cache.nixos.org 上(在 Debian 裡對應的東西是 buildd)。

Simon 解釋說,現有 queue runner 的瓶頸導致基礎設施被閒置:專案明明有可用的機器,卻無法充分利用。他說明了團隊如何把原本老舊、基於 SSH 的自動化流程,替換成設計良好的 gRPC 協定。我感覺這個設計是由一群人共同開發與審查的,這對一個健康的專案來說是非常好的跡象。

比較可惜的是,演講中少了數據指標。如果能看到幾張圖表來說明重寫後的 queue runner 到底好上多少,就更棒了。

目前,新的 queue runner 已經用在 Nix Community 的建置上,但還沒正式上線到 NixOS 本身。不過應該快了!

→ 在 media.ccc.de 觀看錄影(27 分鐘)

“You can’t spell “devshell” without “hell””

這場演講由來自 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 分鐘)

“The Nix Binary Cache and AWS”

在這場爐邊對談中,Tarus Balog 分享了他如何在投入開源 20 年後加入 AWS,以及他的團隊想如何回饋社群。其中一個具體的做法,就是由他們來託管 cache.nixos.org。

→ 在 media.ccc.de 觀看錄影(24 分鐘)

“Nix-based development environments at Shopify (reprise)”

來自 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 分鐘)

“My first Nix Aha!: A Newcomer’s Perspective”

延續 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(一項用於 Flakes 求值的效能最佳化)、平行求值(將求值時間從 16 秒降到 7 秒),以及在 mac 上原生支援 Linux builder。接下來則是 Flake Schemas,這部分我還沒研究過。

來自 Nix 與 DevOps 顧問公司 Numtide 的 Yvan Sraka,展示了他如何用 NixOS 幫親朋好友管理 Linux 機器。他在 NixOS 之上自建了一層設定,只把系統當作基底。大部分實際的應用程式則是透過 AppImage、Flatpaks、envfsnix-ld 來使用。後兩者是用來在像 NixOS 這種非 FHS 系統上執行依賴 FHS 的程式(也就是那些預期 /usr/bin 等標準路徑存在的程式)的解法。nix-ld 我之前就聽過,但 envfs 倒是第一次聽到。

來自 Nixcademy 的 Jacek Galowicz 展示了如何利用 systemd-sysupdate 與 systemd-repart,在 NixOS 與 systemd 上實作 A/B 式更新。很高興看到這項技術越來越普及,因為我在 gokrazy 中也成功地使用了 A/B 式更新。

星期六

星期六的天氣好多了,所以我特地找了個能看到蘇黎世湖景的位子:

湖景!

“The bikes have been shed: The official Nix formatter”

在這場演講中,來自 Tweag 的 Silvan Mosberger(同時也是 NixCon 的主要籌辦人之一!)說明了 .nix 檔案的官方格式化工具是如何誕生的。

聽到官方 Go 格式化工具 gofmt 被當作靈感來源,我感到很開心。就像在其他語言生態系一樣,導入統一的格式化可以省去程式碼審查時為了 coding style 來回爭論的時間。不過,可惜的是,格式化工具的開發者沒有複製 gofmt 成功的一個關鍵要素:gofmt 沒有任何選項。就像那句著名的 Go 諺語所說:

Gofmt 的風格沒有人最喜歡,但 gofmt 卻是大家的最愛!

意思是說,比起讓每個人都能表達自己的風格偏好,讓大家都使用同一種風格更為重要。

→ 在 media.ccc.de 觀看錄影(20 分鐘)

“Mastering NixOS Integration Tests: Advanced Techniques for Fast and Robust Multi-VM Tests”

在這場長達兩小時的工作坊中,來自 Nixcademy 的 Jacek Galowicz——他不只是 Nix 講師,同時也是 NixOS 整合測試驅動程式的維護者——向我們展示如何用幾行 Nix 和 Python 就寫出複雜的整合測試。

Jacek 展示了一個整合測試範例:一個包含 tracker、客戶端、防火牆與多個網路的 BitTorrent 服務!nixpkgs 裡包含了超過 1000 個這類整合測試,而且在你的筆電上執行一個非常容易。

各種除錯測試的方法看起來相當酷:改用 vsock 而不是 port forwarding,以及啟用 debug hook,讓失敗的測試停住等待除錯。

我覺得這是一場很棒的總覽,而且 Jacek 是個很能帶動氣氛的講師。我會推薦去報名他的課程!

“When Not to Nix: Working with External Config and SOPS Nix”

Ryota 談的是何時該用 Nix、何時不該用 Nix。舉例來說,你可以用 Nix 來管理你的 dotfiles(設定檔),也可以選擇不要。最近我把越來越多機器與設定遷移到 Nix 上,聽完這場演講我深有同感:了解宣告式與有狀態管理的設定各能帶來什麼好處、以及何時哪種方式更合適,是很重要的。

→ 在 media.ccc.de 觀看錄影(19 分鐘)

閃電講

這天剩下的時間我都待在閃電講,有些時段是贊助場次。我學到了不少東西,條列如下(無特定順序):

  • 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 大合照

NixCon 2025 攝影:Arik Grahl。以 CC BY-SA 4.0 授權釋出。

星期日

大會開始前,我還不確定星期天(Hack day)要不要特地出席,但到了星期天,我心裡想的是「當然要去!」,而這真是個很棒的決定!

還有很多人留下來,各自忙著自己的專案。感覺任何關於 Nix 的問題,只要傳個訊息就能得到解答——來自專案各個領域的專家與熱心幫手都在現場。

我還見到了幾位之前只在線上互動過的朋友,我們也聊了很多關於聚會的事。現在,我已經受邀要去好幾個聚會演講了 :D

結語

這真的是一場很棒的大會!籌辦團隊與所有貢獻者都做得非常出色!

一如既往,位於 Rapperswil 的 OST 是舉辦開源活動的絕佳場地。

售票與議程投稿/排程都是使用開源系統 PretixPretalx 完成的,這讓曾為 Pretix 貢獻過的我感到很驕傲。

議程的選題很棒:有些非常技術性,有些只談人的面向,更多則介於兩者之間。我感覺我看到的每一位講者都真心在乎自己的主題,所以整體氛圍非常好!

(你可以在 media.ccc.de: NixCon 2025 觀看所有演講錄影。)

除了演講之外,我也有許多友善的互動與有趣的對話。能看到大家對 Nix 有這麼多興趣與實際採用,真的很棒!

以這樣一個由志工主導的活動來說,大會的製作品質非常高。舉例來說,場間播放的超酷休息音樂就是為 NixCon 特別創作的:“Lava” by tonstr.studio。同樣地,迎賓袋裡還有為 NixCon 特製的瑞士黑巧克力(見下圖)。我平常根本不愛吃黑巧克力,但這個真的很好吃!

再次感謝所有幫忙的人,期待很快再回來!

NixCon 2025 瑞士巧克力

本文章由 muse-spark-1.2-contributor 進行翻譯

留言