GNU Guix:用 Scheme 代码重新定义操作系统
"你的整个操作系统,应该像一段可版本控制的代码一样被管理。"
一、Guix 是什么?
GNU Guix 是 GNU 项目旗下的一个函数式包管理器和声明式操作系统构建工具。它诞生于 2012 年,由 Ludovic Courtès 发起,最初作为 Nix 包管理器的 Guile Scheme 版本出现,但很快发展出自己的独立身份和哲学。
Guix 包含两个层面:
-
Guix 包管理器 —— 可以安装在任意 GNU/Linux 发行版上,作为额外的包管理工具使用
-
Guix System(曾用名 GuixSD) —— 一个完整的、独立的 GNU/Linux 发行版,完全由 Guix 构建和管理
2026 年 1 月,Guix 发布了 1.5.0 版本,这是时隔三年后的重大更新,包含 71,338 次提交、12,525 个新软件包和 29,932 个包更新,由 744 名贡献者共同完成。
二、核心哲学:函数式包管理
Guix 的核心理念来自函数式编程。在 Guix 的世界里,一个软件包的构建被看作一个纯函数:给定相同的输入(源代码、依赖、编译器、环境变量),永远产生相同的输出。
2.1 不可变的 /gnu/store
所有软件包都安装在
/gnu/store 目录下,每个包的路径包含其所有依赖的哈希值:plain
/gnu/store/abc123...-gcc-15.2.0
/gnu/store/def456...-emacs-30.2
/gnu/store/ghi789...-hello-2.12.1
这意味着:
-
同一软件的不同版本可以和平共存,不会互相冲突
-
升级不会破坏现有环境,因为旧版本仍然存在
-
回滚只需切换符号链接,原子级操作
2.2 事务性操作
所有包管理操作都是事务性的:
-
要么全部成功,要么全部失败
-
升级过程中系统不会处于"半更新"的不稳定状态
-
如果升级后出现问题,可以立即回滚到之前的状态
2.3 可重复构建(Reproducible Builds)
Guix 追求逐位精确的可重复构建(bit-for-bit reproducibility)。无论何时、在何处执行相同的构建指令,都会得到完全相同的二进制结果。这对于科学研究、安全审计和持续集成至关重要。
三、Guile Scheme:用 Lisp 管理你的系统
3.1 为什么选择 Scheme?
Guix 最大的技术特色是使用 Guile Scheme(GNU 的 Scheme 实现)作为配置语言,而非 Nix 的专用领域语言(DSL)。
Guix 开发者认为,使用一门通用编程语言而非专用语言有诸多优势:
-
完整的语言特性:Guile 提供编译器、调试器、REPL(交互式解释器)、Unicode 支持、丰富的库
-
可扩展性:可以在包定义中嵌入任意逻辑,不限于 DSL 的表达能力
-
嵌入式领域特定语言(EDSL):在 Scheme 之上构建包定义和系统配置的 DSL
-
统一性:包组合和构建脚本都用同一门语言编写,而 Nix 通常用 Nix 语言组合包、用 Bash 写构建脚本
3.2 包定义示例
一个 Guix 包定义看起来像这样:
scheme
(define-public hello
(package
(name "hello")
(version "2.12.1")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/hello/hello-"
version ".tar.gz"))
(sha256
(base32
"0xw6zx..."))))
(build-system gnu-build-system)
(synopsis "GNU Hello")
(description "A program to print a friendly greeting.")
(home-page "https://www.gnu.org/software/hello/")
(license gpl3+)))
3.3 系统配置即代码
Guix System 的整个操作系统配置也是一个 Scheme 表达式:
scheme
(operating-system
(host-name "my-machine")
(timezone "Asia/Shanghai")
(locale "zh_CN.utf8")
(bootloader (bootloader-configuration
(bootloader grub-efi-bootloader)
(targets '("/boot/efi"))))
(file-systems (cons (file-system
(device (file-system-label "my-root"))
(mount-point "/")
(type "ext4"))
%base-file-systems))
(users (cons (user-account
(name "alice")
(group "users")
(home-directory "/home/alice")
(shell (file-append bash "/bin/bash")))
%base-user-accounts))
(services (cons (service gnome-desktop-service-type)
%base-services)))
运行
guix system reconfigure config.scm,Guix 就会根据这个声明生成完整的操作系统。四、Guix System:一个完整的发行版
4.1 技术栈
表格
| 组件 | 选择 | 说明 |
|---|---|---|
| 内核 | Linux-libre | 移除所有非自由固件的 Linux 内核 |
| 初始化系统 | GNU Shepherd | Guile 编写的服务管理器 |
| C 库 | glibc | GNU C 库 |
| 包管理器 | Guix | 函数式包管理 |
| 构建工具 | Guix build daemon | 隔离沙箱构建 |
| 桌面环境 | GNOME / KDE Plasma / Xfce | 声明式服务配置 |
4.2 GNU Shepherd:Guile 编写的 init 系统
Guix System 不使用 systemd,而是使用 GNU Shepherd(前身为 GNU dmd)作为初始化系统和服务管理器。
Shepherd 的特点:
-
用 Guile Scheme 编写,与 Guix 天然集成
-
支持依赖关系,可以定义服务之间的启动顺序
-
支持套接字激活(inetd 和 systemd 风格)
-
非特权用户也可以使用,管理个人守护进程
-
并行启动服务,提升启动速度
在 Guix System 1.5.0 中,Shepherd 升级到 1.0 版本,新增定时服务、kexec 重启、系统日志和日志轮转服务。
4.3 无状态设计
Guix System 追求无状态配置:
-
所有系统配置都通过
operating-system声明定义 -
包只安装在
/usr(通过符号链接到/gnu/store),用户不直接修改 -
/etc中的配置文件由 Guix 自动生成 -
整个系统可以从一个配置文件完全重建
五、Guix vs Nix:两条函数式道路
Guix 和 Nix 经常被比较,因为它们共享相同的底层理念,但在实现上有显著差异:
表格
| 特性 | Nix / NixOS | Guix / Guix System |
|---|---|---|
| 配置语言 | Nix 表达式语言(专用 DSL) | Guile Scheme(通用 Lisp) |
| 核心实现 | C++、Perl | Guile Scheme、部分 C++ |
| 哲学 | 实用主义,广泛采用 | 严格自由软件,用户赋权 |
| 非自由软件 | 允许(allowUnfree 选项) |
官方仓库禁止(有 Nonguix 社区渠道) |
| 包数量 | ~80,000+ | ~20,000+(精选) |
| 可重复性 | 高(Nix Flakes 改进) | 极高(逐位精确,可审计引导) |
| 安全模型 | 可覆盖的沙箱 | 更严格的沙箱,默认非特权守护进程 |
| 引导过程 | 从二进制种子构建 | 可审计引导(逐步减少信任链) |
| 治理 | NixOS 基金会,社区驱动 | GNU 项目 |
关键差异
1. 可审计引导(Bootstrappable Builds)
Guix 的一个独特成就是实现了几乎完全从源码自举构建。Guix 能够用极小的可信二进制种子(bootstrap binary)构建出整个系统,包括编译器本身。2024 年,Ekaitz Zárraga 在 FOSDEM 上报告了将这一支持扩展到 RISC-V 架构的进展。
2. 嫁接(Grafting)安全更新
Guix 拥有 NixOS 缺乏的嫁接功能:当某个基础库(如 OpenSSL)出现安全漏洞时,Guix 可以将修复后的新版本"嫁接"到依赖它的软件包上,而无需重新编译整个依赖树。这大大加快了安全更新的部署速度。
3. 用户环境粒度
Guix 在用户环境管理上提供更细粒度的控制,特别适合多用户系统。每个用户可以拥有完全独立的软件环境,互不干扰。
六、Guix 的生态系统
6.1 Guix Home
Guix Home 是 Guix System 的延伸,允许用户用同样的声明式方式管理个人环境:
-
点文件(dotfiles)管理
-
用户级服务(用 Shepherd)
-
个人软件包配置
-
环境变量和 Shell 配置
scheme
(home-environment
(packages (list emacs git htop))
(services (list (service home-bash-service-type)
(service home-shepherd-service-type))))
6.2 容器与虚拟机
Guix 可以轻松创建隔离环境:
-
guix shell—— 临时开发环境 -
guix environment—— 持久化环境 -
guix system vm—— 从配置文件生成虚拟机 -
guix system container—— 创建系统容器
所有环境都是纯的(pure)或增强的(augmented),确保可重复性。
6.3 远程部署
Guix 支持声明式远程部署:
scheme
(operating-system
(host-name "remote-server")
;; ...
(services (list (service nginx-service-type
(nginx-configuration
(server-blocks
(list (nginx-server-block
(listen '("80"))
(server-name '("example.com"))
(root "/var/www"))))))))
运行
guix deploy,Guix 会自动将配置应用到远程机器。七、最新发展(2026 年)
7.1 Guix 1.5.0 亮点
2026 年 1 月发布的 1.5.0 版本带来了重大更新:
-
KDE Plasma 6.5 正式可用,新增
plasma-desktop-service-type -
GNOME 46,默认使用 Wayland
-
GNU Shepherd 1.0,支持定时服务、kexec 重启
-
40+ 新系统服务:Forgejo Runner、RabbitMQ、iwd、dhcpcd 等
-
GCC 15.2.0、Emacs 30.2、LLVM 21.1.8、Linux-libre 6.17.12
-
迁移到 Codeberg,采用 Pull Request 工作流
-
年度发布周期确立
7.2 社区与治理
Guix 采用共识决策流程(Consensus Decision Making),重大变更通过 Guix Consensus Documents(GCDs)进行讨论和投票。项目还启动了筹款活动以支持基础设施。
八、适用场景
适合谁?
-
开发者:需要精确控制依赖、多项目环境隔离
-
系统管理员:需要可重复、可版本控制的服务器配置
-
研究人员:需要可重复的实验环境
-
自由软件倡导者:严格的自由软件政策
-
Lisp/Scheme 爱好者:用熟悉的语言管理整个系统
学习曲线
Guix 的学习曲线主要来自:
-
Scheme/Lisp 语法:括号、前缀表达式、函数式思维
-
函数式包管理理念:与传统包管理器(apt、pacman)截然不同的范式
-
声明式配置思维:从"我做了什么"转变为"我想要什么"
但 Guix 的 REPL 和 Emacs 集成(通过 Geiser)提供了强大的交互式开发体验,可以实时验证配置。
九、与其他系统的对比
| 系统 | 内核 | 包管理 | 配置语言 | 初始化系统 | 哲学 |
|---|---|---|---|---|---|
| Guix System | Linux-libre | Guix(函数式) | Guile Scheme | GNU Shepherd | 严格自由软件 |
| NixOS | Linux | Nix(函数式) | Nix 语言 | systemd | 实用主义 |
| HyperbolaBSD | OpenBSD 硬分叉 | hyperman | - | runit | 完全自由软件 |
| Chimera Linux | Linux | APK | - | Dinit | 非 GNU Linux |
| GNOME OS | Linux | Flatpak | - | systemd | GNOME 参考平台 |
| KDE Linux | Linux | Flatpak/Snap | - | systemd | KDE 参考平台 |
| Redox OS | 自研微内核 | pkg | Rust | - | 内存安全 |
十、结语
GNU Guix 代表了操作系统管理的一种激进但优雅的范式:
你的操作系统不应该是一堆手动安装的软件和配置文件,而应该是一段可版本控制、可审计、可回滚的代码。
Guix 用 Scheme 的优雅和函数式编程的严谨,将这一愿景变为现实。它不是最简单的选择,但对于那些愿意拥抱 Lisp 世界和声明式思维的用户来说,Guix 提供了一种前所未有的系统控制力和可预测性。
正如 Guix 的标语所说:"GNU Guix: 功能包管理"——这里的"功能"(functional)既是函数式编程的含义,也暗示了系统的每一个功能都被精确地定义和管理。
相关资源
-
社区:IRC #guix on Libera.Chat
发表回复