NixCon 2025 遊記 🐝
我很喜歡今年稍早的 NixOS 聚會,在聚會尾聲他們向大家介紹了今年將在瑞士舉辦的 NixCon 2025,地點就在同一個地方——位於拉珀斯維爾的 University Of Applied Sciences OST,所以我決定前往!在這篇遊記中,我想跟大家分享我對這場精彩大會的粗略體驗 :)
標題裡的蜜蜂是 NixCon 的內部笑話 ;)
星期五
我在一個下雨的星期五早上約 09:30 抵達,也就是說我從火車站匆匆趕往 OST 的 1 號館,出示票券的 QR Code 並領取大會識別證和我事先預訂的客製化名牌。客製化名牌上刻有你的名字,並附有強力磁鐵可固定在衣服上:

簡單吃了點東西後,我前往主講堂參加開幕式。來自 OST 的 Prof. Dr. Farhad Mehta(法哈德·梅塔教授)以及整個 NixCon 籌備團隊歡迎了 450 位已報名的與會者來到第 10 屆 NixCon!我在現場認出了許多在 Nix 聚會見過的熟面孔,不過當主持人詢問有多少人是第一次參加 NixCon,或是第一次來瑞士時,還是有很多人舉手。
我要特別感謝梅塔教授讓這樣的聚會與活動得以實現!👏
如果你在擁有場地的大學、學校或其他機構工作,請考慮提供場地來舉辦聚會(無論是定期舉辦,或僅僅一次也好)!場地總是很難找,因此提供空間就是對開源的一大貢獻。
「如果 GitHub Actions 以本地優先並用 Nix 打造會怎樣?」
當天第一場技術演講是 Domen Kožar(多門·科扎爾)帶來的「如果 GitHub Actions 以本地優先並用 Nix 打造會怎樣?」,他是 cachix.org 背後的推手,而 cachix.org 是一個代管的 Nix 快取服務。這場演講介紹了 cloud.devenv.sh,這是一個使用 devenv、基於 Nix 的 CI 解決方案(類似 GitHub Actions)。
透過這個解決方案,你能解決無法輕易/完整地在本機執行 GitHub Actions 的問題(是的,大家都知道 act),而且你可以用撰寫 Nix 設定檔來取代 YAML 設定檔(?)。
這個解決方案看起來不錯,但我覺得演講有點缺乏結構,因為講者在投影片之間跳來跳去。有一個關鍵問題沒有得到解答:你要如何將這個客製化解決方案整合到你的 GitHub 專案中?對我而言,為了我的專案而偏離設定 GitHub Actions 的預設方式似乎不太值得。當然因人而異(YMMV)。
「用 Rust 重寫 Hydra Queue Runner」
接下來是 Simon Hauser(西蒙·豪瑟)帶來的「用 Rust 重寫 Hydra Queue Runner」,他來自德國小型軟體公司 Helsinki Systems。Hydra 是 NixOS 基礎設施中負責排程建置的元件:當 nixpkgs 有變動時,就是由這個元件執行建置,其結果最終會出現在 cache.nixos.org 上(在 Debian 中對應的是 buildd)。
西蒙解釋說,現有 queue runner 的瓶頸導致基礎設施被閒置:專案明明有可用的機器,卻無法充分利用。他說明了他們如何以設計良好的 gRPC 協定取代老舊、粗糙的 SSH 自動化流程。我感覺有一群人參與了這個設計的開發與審查,這對專案的健康發展是個很好的跡象。
可惜這場演講缺少了一樣東西:數據指標。如果能看到幾張圖表來說明重寫後的 queue runner 究竟好上多少就太好了。
目前,新的 queue runner 已經用於 Nix Community 的建置,但尚未正式用於 NixOS 本身。不過,希望很快就會上線!
「沒有 “hell” 就拼不出 “devshell”」
這場演講由 Zach Mitchell(札克·米契爾)主講,他來自 Flox,而 Flox 是一個基於 Nix 的開發環境解決方案。到目前為止,我都是使用 nix-shell 或 nix develop(參見 用 Nix 打造開發環境:四個快速範例),所以我很好奇這場演講能讓我學到什麼。
札克·米契爾解釋說,nix-shell 和 nix develop 最初都是為了除錯 Nix 套件建置而寫的,並非為了提供通用開發環境。對使用者而言,這表現為無法使用自己慣用的 shell——nix develop 只支援 Bash。你可能會看到有人提到 nix develop -c exec <shell>,但那是錯誤的作法,因為那樣 shell 的 RC 檔會在 Nix 設定完成之後才執行,可能會破壞部分設定。
我學到一件有趣的事:Nix 的垃圾回收器會掃描 /proc,以避免刪除仍被執行中行程所需的 Nix store 路徑。
札克·米契爾提到了 https://github.com/zmitchell/proctrace,這是一個基於 bpftrace 的分析工具,會追蹤 forks/execs 並產生時序的甘特圖語法。聽起來很酷,但可惜目前似乎壞掉了……?真可惜。
「Nix Binary Cache 與 AWS」
在這場爐邊對談中,Tarus Balog(塔魯斯·巴洛格)分享了他如何在投入開源 20 年後加入 AWS,以及他的團隊如何想要回饋社群。其中一個具體作法就是代管 cache.nixos.org。
「在 Shopify 以 Nix 打造開發環境(再現)」
Josh Heinrichs(喬許·海因里希斯)來自 Shopify,他分享了他們如何(再次!)導入 Nix,我覺得這類來自真實企業的導入故事非常有趣。
簡言之,Shopify 自 2016 年起就有一個 dev 指令,提供宣告式設定,然後分派給 apt(Linux)或 homebrew(macOS)。在第一次嘗試轉向 Nix 時,這項努力未能達到穩定狀態(有些人還無法使用),接著公司全面轉向雲端開發,而當時更簡單的解決方案是「直接用 ubuntu」就好。
幾年後,大家顯然對雲端開發環境不太滿意,某天 Shopify 執行長 Tobias Lütke(托比亞斯·呂特克)發現了 devenv,這是一個以 Nix 為基礎、與 Shopify 的 dev 極為相似的解決方案。於是托比為其中一項服務採用了 devenv,並開始支持使用 Nix。這一次,他們花了更多時間在組織內成功推行,意指採取漸進式導入、讓所有利害關係人都能參與等等。
心得是,一個特定且獲得良好支援的使用情境就能成為導入的驅動力。而一旦你的開發環境採用了以 Nix 為基礎的解決方案,就能更容易地導入生態系的其他部分。
「我的第一個 Nix 頓悟時刻!:新手視角」
與 Shopify 的演講精神相似,來自 ASML 的 Kavisha Kumar(卡維莎·庫瑪)分享了她在看到同事使用 nix-shell 取得乾淨的開發環境後,如何開始接觸 Nix。
卡維莎·庫瑪在 ASML 花了很多時間教導他人為何以及如何使用 Nix。她分享了許多巧妙的比喻,透過電玩遊戲的主題來解釋 Nix 的概念。
我覺得很多人對 Nix 感到興奮,卻難以把這份興奮傳達給他人。卡維莎·庫瑪為我們展示了一個對她有效的好方法。
閃電講
當天剩下的時間都是閃電講。
Cole Mickens(柯爾·米肯斯)來自 Determinate Systems,他說明了他們目前在其下游發行版「Determinate Nix」中提供了哪些功能(這些功能未來會上游化):lazy trees(一種用於評估 Flakes 的效能最佳化)、parallel evaluation(將評估時間從 16 秒縮短至 7 秒)以及適用於 Mac 的原生 Linux 建置器。接下來則是 Flake Schemas,這部分我還沒研究過。
Yvan Sraka(伊凡·斯拉卡)來自 Nix 與 DevOps 顧問公司 Numtide,他展示了如何用 NixOS 為親友管理 Linux 機器。他在 NixOS 之上建立了自己的設定層,僅將系統本身作為基底。大部分實際的程式都是透過 AppImage、Flatpaks、envfs 和 nix-ld 來使用。後兩者是用來在像 NixOS 這類非 FHS 系統上執行基於 FHS 的程式(也就是那些預期 /usr/bin 等標準路徑存在的程式)的解決方案。我之前聽過 nix-ld,但沒聽過 envfs。
Jacek Galowicz(亞采克·加沃維奇)來自 Nixcademy,他展示了如何使用 systemd-sysupdate 與 systemd-repart 在 NixOS 與 systemd 上實作 A/B 式更新。很高興看到這項技術越來越普及,因為我在 gokrazy 中也成功地使用 A/B 式更新。
星期六
星期六的天氣好多了,所以我特地找了個能看到蘇黎世湖景的座位:

「車棚已經蓋好:官方 Nix 格式化工具」
在這場演講中,Silvan Mosberger(西爾萬·莫斯貝格)來自 Tweag(同時也是 NixCon 主要籌辦人之一!)說明了 .nix 檔案的官方格式化工具是如何誕生的。
聽到官方 Go 格式化工具 gofmt 被提及為靈感來源,我感到很開心。正如在其他語言生態系中一樣,引入統一的格式化可以消除程式碼審查中為了遵守程式碼風格而耗時來回討論的情況。可惜的是,格式化團隊並沒有複製 gofmt 成功的一個關鍵要素:gofmt 沒有任何選項。如同那句著名的 Go 諺語所說:
Gofmt 的風格不是任何人的最愛,但 gofmt 卻是每個人的最愛!
「精通 NixOS 整合測試:快速且穩健的多虛擬機測試進階技巧」
在這場兩小時的工作坊中,來自 Nixcademy 的亞采克·加沃維奇——他不僅是一位 Nix 講師,同時也是 NixOS 整合測試驅動程式的維護者——向我們展示如何用幾行 Nix 與 Python 撰寫複雜的整合測試。
亞采克·加沃維奇展示了一個整合測試範例:一個由 tracker、客戶端、防火牆與多個網路組成的 BitTorrent 服務!nixpkgs 中包含了超過 1000 個這類整合測試,而且在你的筆電上執行其中一個非常容易。
各種除錯測試的方法看起來相當酷:使用 vsock 而非連接埠轉發,以及啟用除錯掛鉤,讓失敗的測試停住等待除錯。
我覺得這是一場很棒的總覽,而且亞采克·加沃維奇是一位很會帶動氣氛的老師。我會推薦大家報名他的課程!
「何時不該用 Nix:處理外部設定與 SOPS Nix」
Ryota(良太)談論了何時該用 Nix、何時不該用。例如,你可以用 Nix 來管理你的 dotfiles(設定檔),也可以選擇不用。最近我已將越來越多機器與設定遷移到 Nix,因此我對這場演講深有同感:重要的是要了解透過宣告式或狀態式管理的設定能獲得什麼,以及何時哪種方式更好。
閃電講
當天剩下的時間我都在聽閃電講,其中一些是贊助演講時段。我學到了以下這些,排名不分先後:
- 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 是一套機隊管理解決方案。
- 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
結論
這是一場非常棒的大會!籌備團隊與所有貢獻者都做得非常出色!
一如既往,位於拉珀斯維爾的 OST 是舉辦開源活動的絕佳場地。
票務銷售與演講投稿/排程是使用開源系統 Pretix 與 Pretalx 完成的,這讓曾為 Pretix 貢獻過的我感到很驕傲。
演講的選題非常棒:有些非常技術性,有些只聚焦於人文面向,還有許多介於兩者之間。我感覺我看到的所有講者都真心關心自己的主題,因此整體氛圍非常好!
(你可以在 media.ccc.de: NixCon 2025 上觀看演講錄影。)
除了演講之外,我也有許多友善的互動與有趣的對話。大家對 Nix 有很高的興趣與採用度,很高興看到這一點!
以這樣一場由志工主導的活動來說,大會的製作品質非常高。舉例來說,演講之間播放的、聽起來超酷的休息音樂是特別為 NixCon 創作的:“Lava” by tonstr.studio。同樣地,迎賓袋中還有一塊特別為 NixCon 製作的瑞士黑巧克力(見下圖)。我本來不太喜歡黑巧克力,但這塊非常美味!
再次感謝所有幫手,期待很快再回來!

隨機一篇部落格