GNU Guix:用 Scheme 代码重新定义操作系统

GNU Guix:用 Scheme 代码重新定义操作系统

"你的整个操作系统,应该像一段可版本控制的代码一样被管理。"

一、Guix 是什么?

GNU Guix 是 GNU 项目旗下的一个函数式包管理器声明式操作系统构建工具。它诞生于 2012 年,由 Ludovic Courtès 发起,最初作为 Nix 包管理器的 Guile Scheme 版本出现,但很快发展出自己的独立身份和哲学。
Guix 包含两个层面:
  1. Guix 包管理器 —— 可以安装在任意 GNU/Linux 发行版上,作为额外的包管理工具使用
  2. 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)既是函数式编程的含义,也暗示了系统的每一个功能都被精确地定义和管理。

相关资源

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注