GNU Guix 烹饪书:2024年函数式包管理实用指南
《GNU Guix 烹饪书》为GNU系统的函数式包管理工具Guix提供全面教程与实用示例,涵盖Scheme编程基础、高级系统配置、打包工作流、容器管理及可复现研究环境等主题。
Introduction
《GNU Guix 烹饪书》是针对 GNU 系统设计的函数式包管理工具 GNU Guix 的教程与详细示例合集。本文档面向希望超越基础命令、探索 Guix 强大可编程功能的用户。它是对官方 GNU Guix 参考手册的补充,后者提供了关于系统架构、API 和核心概念的详尽说明。
本手册是全球自由软件社区的成果,提供简体中文、法语、德语、韩语、西班牙语、意大利语、巴西葡萄牙语、俄语、斯洛伐克语、瑞典语和泰米尔语等多种语言版本。欢迎通过 Weblate 为本文档贡献更多语言的翻译。
Core Concepts and Structure
本书的结构旨在引导用户从基础知识进阶到高级系统操作。其章节按逻辑组织,以循序渐进地构建用户能力。
1. Scheme Tutorials
GNU Guix 使用 Scheme 语言一种 Lisp 方言,是 GNU Guix 的实现语言,用于编写包定义和系统配置。实现,掌握该语言是解锁其高级功能的关键。用户可以编程式地生成包定义、修改它们、构建软件以及部署整个操作系统。本节提供了必要的 Scheme 基础,表明用户无需成为专家级程序员即可有效利用 Guix 的功能。
1.1 A Scheme Crash Course
本教程介绍了 Guix 所使用的 Guile Scheme 实现。开头说明了如何使用 guile 或 guix shell guile -- guile 启动一个读取-求值-输出循环(REPL)。
Key Syntax Elements:
表达式与 S-表达式:Scheme 语法基于表达式树(S-表达式)。它们可以是字面量(数字、字符串)或由复合元素和字面量组成的带括号列表。布尔值由 #true (#t) 和 #false (#f) 表示。
函数调用:对带括号表达式的求值将第一项视为函数,其余项视为参数。函数返回最后一个被求值的表达式。
过程(匿名函数):使用 lambda 项创建。它们是一等值,与数字或字符串地位相同。
变量定义:define 关键字将值与一个全局名称绑定。
过程定义简写:存在一种用于定义命名函数的简洁语法。
列表:使用 list 过程创建。
教程提供了具体的 REPL 示例来说明每个概念,例如求值字面量、嵌套函数调用、定义和应用过程以及创建列表。
2. Packaging
本章节是贡献者的核心指南,详细说明了如何为 Guix 生态系统创建和管理软件包。它从一个完整的教程开始,并扩展到具体的工作流程和高级技巧。
2.1 Packaging Tutorial
一个 "Hello World" 软件包:最简单的包定义示例。
设置:涵盖不同的开发环境:使用本地文件、通过渠道工作以及直接检出代码进行开发。
扩展示例:深入探讨一个真实的包定义,涵盖:
用于获取源代码的 git-fetch 方法。
使用代码片段进行补丁。
指定构建输入和输出。
构建系统参数和代码暂存。
实用函数和模块组织。
其他构建系统:超越标准 GNU 构建系统的指南。
可编程和自动化的包定义:以编程方式生成包的技术,包括使用递归导入器、自动更新和继承。
获取帮助与参考资料:指向社区支持资源。
2.2 Packaging Workflows
打包 Rust Crate:处理 Rust 软件包的专门指南,包括常见工作流程、Cargo 工作空间以及将 Rust 库集成到其他构建系统中。
(以下部分对烹饪书的其余章节进行高层概述。)
3. System Configuration
本章探讨如何配置基于 Guix 构建的操作系统发行版——Guix System。它包含以下实用方案:
自动登录、内核定制和系统镜像 API。
集成安全密钥(Yubikey)用于双因素认证和 KeePassXC。
设置服务:动态 DNS、WireGuard VPN、自定义窗口管理器(StumpWM)、会话锁。
在云服务器(Linode, Kimsufi)上部署。
高级设置:绑定挂载、通过 Tor 获取替代品、带 Lua 的 NGINX、支持蓝牙音频的音乐服务器。
4. Containers
Guix 提供轻量级、可复现的容器。本节涵盖:
Guix 容器:用于隔离用户空间环境。
Guix 系统容器基于 GNU Guix 的轻量级容器技术,提供隔离的运行环境。:用于隔离运行完整的系统服务(例如数据库容器),包括网络配置。
5. Virtual Machines
使用 Guix 创建虚拟机和配置网络的方案,重点包括:
QEMU:设置网络桥接并排查 Docker 引起的冲突。
libvirt:配置路由网络和基于 NAT 的自定义网络。
6. Advanced Package Management
重点介绍 profile(配置文件) 这一强大概念,即独立的软件包集合。它解释了:
使用清单用于声明一组软件包集合的配置文件,支持可复现的软件环境管理。(manifest)声明配置文件内容。
对于实现可复现性和管理多个环境(开发、默认、特定项目)的好处。
7. Software Development
将 Guix 集成到软件开发工作流程的指南,从简单构建逐步推进到持续集成:
使用 Guix 构建软件。
将你的代码仓库视为 Guix 渠道以进行依赖管理。
- Creating package variants.
创建软件包变体。 - Setting up CI for builds.
为构建设置持续集成。
8. Environment Management
将 Guix 与 direnv 集成,实现按项目目录自动设置环境。
9. Using Guix for Reproducible Research
利用 Guix 的可复现性确保科学研究能够被复现的方法:
设置并记录精确的软件环境。
归档源代码并在出版物中引用该环境。
10. Installing Guix on a Cluster
在高性能计算环境中部署 Guix 的指南,涵盖主节点设置、计算节点配置、网络访问、磁盘使用和安全考量。
11. Guix System Management
特定的管理任务,例如为 Cuirass 持续集成服务升级 PostgreSQL。
Conclusion and Further Resources
《GNU Guix 烹饪书》是一份活文档,由其社区不断丰富。它弥合了理论理解与实际应用之间的差距,使用户能够充分利用函数式系统管理的声明性和可复现特性。对于权威和详细的规范,始终鼓励读者查阅主要的 GNU Guix 参考手册。
[本书还包括致谢、GNU 自由文档许可证和一个概念索引。]
版权与免责声明:本文仅用于信息分享与交流,不构成任何形式的法律、投资、医疗或其他专业建议,也不构成对任何结果的承诺或保证。
文中提及的商标、品牌、Logo、产品名称及相关图片/素材,其权利归各自合法权利人所有。本站内容可能基于公开资料整理,亦可能使用 AI 辅助生成或润色;我们尽力确保准确与合规,但不保证完整性、时效性与适用性,请读者自行甄别并以官方信息为准。
若本文内容或素材涉嫌侵权、隐私不当或存在错误,请相关权利人/当事人联系本站,我们将及时核实并采取删除、修正或下架等处理措施。也请勿在评论或联系信息中提交身份证号、手机号、住址等个人敏感信息。



