GNU Guix 函数式包管理教程 / 第二章 安装与配置
第二章:安装与配置
2.1 安装方式概览
Guix 提供两种主要使用方式:
| 方式 | 说明 | 适合人群 |
|---|---|---|
| Guix 包管理器 | 在现有 Linux 发行版上安装 Guix | 想体验 Guix 包管理的用户 |
| Guix System | 完整的 GNU/Linux 操作系统 | 追求完整声明式系统管理的用户 |
本章将介绍这两种方式的安装步骤,以及 Guix Home 和通道配置。
2.2 在现有发行版上安装 Guix
2.2.1 系统要求
| 要求 | 最低 | 推荐 |
|---|---|---|
| 架构 | x86_64、i686、aarch64、armv7 | x86_64 |
| 磁盘空间 | 5 GB(基础安装) | 20 GB+(含多个 generation) |
| 内存 | 1 GB | 4 GB+ |
| 网络 | 安装时需要 | 持续需要用于下载包 |
2.2.2 官方安装脚本
# 1. 下载安装脚本
wget https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh
chmod +x guix-install.sh
# 2. 以 root 身份运行安装脚本
sudo ./guix-install.sh
# 3. 验证安装
guix --version
安装脚本会自动完成以下操作:
- 创建
/gnu/store目录结构 - 创建
guixbuild用户组 - 下载并安装 Guix 二进制
- 设置 systemd 服务或启动脚本
- 配置 Guix 守护进程(daemon)
2.2.3 安装后配置
配置二进制替代(Binary Substitution):
安装完成后,Guix 默认会从 ci.guix.gnu.org 下载预编译的二进制包,但需要导入授权密钥:
# 导入构建服务器的签名密钥
sudo guix archive --authorize \
< ~root/.config/guix/current/share/guix/ci.guix.gnu.org.pub
# 也导入备用服务器的密钥(可选)
wget https://ci.guix.gnu.org/nars/snix/store/...
设置 PATH 环境变量:
# 添加到 ~/.bashrc 或 ~/.zshrc
export PATH="$HOME/.guix-profile/bin:$PATH"
export PATH="/var/guix/profiles/per-user/$USER/current/bin:$PATH"
配置 GUIX_LOCPATH(locale 支持):
# 如果遇到 locale 警告
export GUIX_LOCPATH="$HOME/.guix-profile/lib/locale"
2.2.4 各发行版特殊注意事项
| 发行版 | 注意事项 |
|---|---|
| Ubuntu/Debian | 需要安装 gpg、wget;可能存在 AppArmor 限制 |
| Fedora | SELinux 可能阻止 Guix daemon;需要配置策略 |
| Arch Linux | AUR 中有 guix-bin 包可供安装 |
| NixOS | 可以通过 Nix 安装 Guix,但两者共存需注意路径冲突 |
⚠️ 注意:Guix daemon 需要 root 权限运行。在某些安全强化的系统上,可能需要额外配置。
2.3 安装 Guix System
Guix System 是一个完整的 GNU/Linux 发行版,支持图形安装和手动安装。
2.3.1 下载安装镜像
# 从官方镜像下载
# https://ftp.gnu.org/gnu/guix/
# 或使用国内镜像
# 验证镜像签名
guix download https://ftp.gnu.org/gnu/guix/guix-system-install-1.4.0.x86_64-linux.iso.xz
# 解压
xz -d guix-system-install-*.iso.xz
2.3.2 制作启动 U 盘
# 使用 dd 命令写入 U 盘(注意替换 sdX)
sudo dd if=guix-system-install-*.iso of=/dev/sdX bs=4M status=progress
sync
2.3.3 安装过程
Guix System 的安装过程基于文本界面:
步骤 1:启动并连接网络
# 安装程序启动后,先配置网络
ifconfig eth0 up
dhclient eth0
# 测试网络
ping -c 3 gnu.org
步骤 2:分区
# 查看磁盘
lsblk
# 使用 cfdisk 分区(示例)
cfdisk /dev/sda
# 推荐分区方案:
# /dev/sda1 512MB EFI 分区(如需 UEFI)
# /dev/sda2 剩余 根分区(ext4)
# 格式化
mkfs.ext4 /dev/sda2
mkfs.fat -F 32 /dev/sda1 # 如有 EFI
# 挂载
mount /dev/sda2 /mnt
mkdir -p /mnt/boot/efi
mount /dev/sda1 /mnt/boot/efi
步骤 3:创建系统配置文件
# 生成初始配置
herd start cow-store /mnt
guix system init /etc/configuration/desktop.scm /mnt
或者手动编写配置:
;; /mnt/etc/config.scm
(use-modules (gnu)
(gnu system nss))
(use-service-modules desktop networking)
(use-package-modules certs gnome)
(operating-system
(host-name "my-guix")
(timezone "Asia/Shanghai")
(locale "zh_CN.utf8")
(keyboard-layout (keyboard-layout "cn"))
(bootloader (bootloader-configuration
(bootloader grub-efi-bootloader)
(targets '("/boot/efi"))
(keyboard-layout keyboard-layout)))
(file-systems (append
(list (file-system
(device "/dev/sda2")
(mount-point "/")
(type "ext4"))
(file-system
(device "/dev/sda1")
(mount-point "/boot/efi")
(type "vfat")))
%base-file-systems))
(users (cons* (user-account
(name "user")
(comment "Default User")
(group "users")
(home-directory "/home/user")
(supplementary-groups '("wheel" "netdev"
"audio" "video")))
%base-user-accounts))
(packages (append (list
nss-certs ; TLS 证书
gvfs) ; 文件管理器支持
%base-packages))
(services (append (list
(service gnome-desktop-service-type))
%desktop-services)))
步骤 4:执行安装
# 初始化系统
guix system init /mnt/etc/config.scm /mnt
这一步可能需要较长时间(下载大量包),如果网络条件好会通过二进制替代加速。
步骤 5:重启
reboot
2.3.4 安装后首次启动
首次进入 Guix System 后:
# 更新系统(拉取最新包定义)
sudo guix pull
# 升级系统
sudo guix system reconfigure /etc/config.scm
2.4 Guix Home
Guix Home 是用户级环境管理器,可以声明式管理用户的 dotfiles、Shell 配置、守护进程等。
2.4.1 安装 Guix Home
# 在 Guix System 上,Guix Home 随系统提供
# 在其他发行版上安装 Guix 后,同样可用
# 创建初始配置
guix home import /tmp/home-configuration.scm
2.4.2 示例配置
;; ~/.config/guix/home-configuration.scm
(use-modules (gnu home)
(gnu home services)
(gnu home services shells)
(gnu home services gnupg)
(gnu packages)
(gnu packages version-control)
(gnu packages shells))
(home-environment
;; 用户软件包
(packages (list git
openssh
htop
tree))
;; 用户服务
(services
(list
;; Bash 配置
(service home-bash-service-type
(home-bash-configuration
(aliases '(("ll" . "ls -alh")
("gs" . "git status")
("gd" . "git diff")))
(bashrc (list (plain-file "bashrc" "
# 自定义 Bash 配置
export EDITOR=vim
export VISUAL=vim
"))))
;; GPG Agent
(service home-gpg-agent-service-type
(home-gpg-agent-configuration
(pinentry-program
(file-append pinentry "/bin/pinentry"))
(ssh-support? #t))))))
2.4.3 部署 Guix Home
# 应用配置
guix home reconfigure ~/.config/guix/home-configuration.scm
# 查看当前 generation
guix home generations
# 回滚到上一个版本
guix home roll-back
2.5 通道(Channels)配置
通道是 Guix 获取包定义的来源。默认使用官方通道 https://git.savannah.gnu.org/git/guix.git。
2.5.1 查看当前通道
# 列出已配置的通道
guix describe
# 输出示例:
# Generation 5 May 10 2026 10:00:00 (current)
# guix 1.4.0 abc1234
# repository URL: https://git.savannah.gnu.org/git/guix.git
# branch: master
# commit: abc1234...
2.5.2 添加第三方通道
创建通道配置文件:
# 编辑 ~/.config/guix/channels.scm
mkdir -p ~/.config/guix
;; ~/.config/guix/channels.scm
(list
;; 官方通道(默认已包含)
(channel
(name 'guix)
(url "https://git.savannah.gnu.org/git/guix.git")
(introduction
(make-channel-introduction
"9edb3f66fd807b096b48283debdcddccfea34bad"
(openpgp-fingerprint
"BBB0 2DFC 2F96 32BA 8D95 4B6C 9218 5D7B E7AA 3A24"))))
;; Nonguix 通道(包含非自由软件)
(channel
(name 'nonguix)
(url "https://gitlab.com/nonguix/nonguix")
(introduction
(make-channel-introduction
"897c1a470da759236cc11798f4e0a5f7d4d59fbc"
(openpgp-fingerprint
"2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5")))))
2.5.3 拉取通道更新
# 更新通道(等同于 git pull 所有通道)
guix pull
# 使用指定通道配置文件
guix pull --channels=~/.config/guix/channels.scm
2.5.4 版本锁定
为了确保团队成员使用完全相同的包版本,可以锁定通道:
# 导出当前通道状态
guix describe --format=channels > ~/.config/guix/channels.scm
# 其他机器使用此文件拉取完全相同的版本
guix pull --channels=~/.config/guix/channels.scm
导出的锁定文件格式如下:
(list (channel
(name 'guix)
(url "https://git.savannah.gnu.org/git/guix.git")
(commit "abc1234...")
(introduction
(make-channel-introduction
"9edb3f66fd807b096b48283debdcddccfea34bad"
(openpgp-fingerprint
"BBB0 2DFC 2F96 32BA 8D95 4B6C 9218 5D7B E7AA 3A24")))))
2.6 Guix 守护进程(Daemon)
Guix 守护进程(guix-daemon)是整个系统的核心,负责执行所有构建操作。
2.6.1 守护进程状态
# 查看守护进程状态(systemd)
sudo systemctl status guix-daemon
# 启动守护进程
sudo systemctl start guix-daemon
# 开机自启
sudo systemctl enable guix-daemon
2.6.2 守护进程配置
# 查看守护进程命令行参数
cat /etc/systemd/system/guix-daemon.service
# 常用参数:
# --build-users-group=guixbuild 构建用户组
# --max-jobs=4 最大并行构建数
# --cache-directory=/var/guix/cache 缓存目录
2.6.3 调整构建用户数量
# 默认创建了 10 个构建用户(guixbuild-01 到 guixbuild-10)
# 如需更多并行构建:
sudo groupadd -r guixbuild
for i in $(seq 1 20); do
sudo useradd -g guixbuild -G guixbuild \
-d /var/empty -s /sbin/nologin \
-c "Guix build user $i" \
--system guixbuild-$(printf "%02d" $i)
done
2.7 故障排除
常见问题清单
| 问题 | 原因 | 解决方案 |
|---|---|---|
guix: command not found | PATH 未配置 | 添加 Guix bin 目录到 PATH |
permission denied on /gnu/store | 守护进程未运行 | 启动 guix-daemon |
| 下载速度极慢 | 二进制替代服务器在国外 | 配置代理或镜像 |
hash mismatch 错误 | 源码包已更新 | guix pull 更新通道 |
| locale 警告 | GUIX_LOCPATH 未设置 | 设置环境变量 |
网络代理配置
# 如果需要通过代理访问网络
sudo systemctl edit guix-daemon
# 添加环境变量
[Service]
Environment="http_proxy=http://proxy:8080"
Environment="https_proxy=http://proxy:8080"
或者直接设置用户代理:
export http_proxy=http://proxy:8080
export https_proxy=http://proxy:8080
2.8 总结
本章涵盖了 Guix 的各种安装方式:
- 包管理器模式——在现有发行版上安装 Guix,适合入门体验
- Guix System——完整声明式操作系统,适合深度使用
- Guix Home——用户环境管理,声明式管理 dotfiles
- 通道配置——管理包来源,支持版本锁定
下一章我们将学习 Guix 的日常操作命令。