第三章 基本操作
第三章:基本操作
3.1 操作总览
Guix 的命令行工具遵循一致的子命令模式:
guix <子命令> [选项] [参数]
常用子命令速查表
| 子命令 | 功能 | 示例 |
|---|---|---|
search | 搜索包 | guix search vim |
install | 安装包 | guix install vim |
remove | 删除包 | guix remove vim |
upgrade | 升级包 | guix upgrade |
show | 查看包详情 | guix show vim |
pull | 更新通道 | guix pull |
gc | 垃圾回收 | guix gc |
shell | 创建临时环境 | guix shell python |
build | 构建包 | guix build vim |
package | 包管理(旧语法) | guix package -i vim |
3.2 搜索包
3.2.1 基本搜索
# 按名称搜索
guix search video player
# 搜索特定名称
guix search ^vim
# 输出为 Scheme 格式
guix search vim --output-format=recutils
3.2.2 查看包详情
# 查看包的完整信息
guix show vim
# 输出示例:
# name: vim
# version: 9.0.1
# outputs: out
# source: ...
# inputs: ncurses, gpm, ...
# home-page: https://www.vim.org/
# synopsis: Text editor
# description: Vim is a highly configurable text editor...
# license: vim-license
3.2.3 列出已安装的包
# 查看当前 profile 中的包
guix package --list-installed
# 输出示例:
# vim 9.0.1 out /gnu/store/...
# git 2.40.0 out /gnu/store/...
3.2.4 搜索的实际应用场景
场景:查找某个库的开发包
# 不确定开发包的名称?搜索试试
guix search openssl | grep -i dev
guix show openssl
# 查看 outputs 字段:通常包含 out 和 dev
场景:查找某个命令属于哪个包
# 使用 guix search 或 guix locate
guix search "the command" provides
# 或者使用反向查找
guix package --search-paths=prefix
3.3 安装包
3.3.1 基本安装
# 安装单个包
guix install vim
# 安装多个包
guix install git htop tree curl
# 安装特定输出(如开发头文件)
guix install openssl:dev
3.3.2 安装到特定 Profile
# 默认 profile(~/.guix-profile)
guix install vim
# 指定 profile
guix install -p ~/my-profiles/development vim python
# 为特定项目创建独立 profile
mkdir -p ~/my-profiles/project-a
guix install -p ~/my-profiles/project-a node python
3.3.3 使用 Manifest 安装
Manifest 是声明式包列表,适合管理一组相关包:
;; ~/dev-tools.scm
(specifications->manifest
'("git"
"vim"
"python"
"python-pip"
"docker-cli"
"openssh"))
# 使用 manifest 安装
guix package --manifest=~/dev-tools.scm
💡 提示:Manifest 方式优于逐个安装,因为它是声明式的,可以在多台机器间共享,也方便版本控制。
3.4 升级包
3.4.1 升级流程
Guix 的升级分为两步:
# 步骤一:更新通道(拉取最新的包定义)
guix pull
# 步骤二:升级已安装的包
guix upgrade
3.4.2 升级特定包
# 只升级特定包
guix upgrade vim git
# 升级到特定版本(通过通道指定)
# 通常需要修改通道配置或使用 time-machine
3.4.3 使用 time-machine 锁定版本
# 使用特定版本的 Guix 运行命令
guix time-machine --channels=channels.scm -- install vim
# channels.scm 中可以锁定到特定 commit
⚠️ 注意:guix pull 会下载整个通道的包定义。首次拉取可能需要较长时间,后续更新通常是增量的。
3.5 删除包
# 删除单个包
guix remove vim
# 删除多个包
guix remove vim git htop
# 删除不会立即释放空间——旧版本仍在 store 中
# 需要配合垃圾回收(GC)才能释放空间
理解删除与卸载
安装前: profile → store/abc...-vim-9.0
安装后: profile → store/def...-vim-9.1 (同时 abc 版本仍在 store 中)
删除后: profile 中无 vim 引用,但 store/abc... 和 store/def... 都还在
GC 后: 不被任何 profile 引用的 store 对象被清理
3.6 回滚(Rollback)
回滚是 Guix 最强大的特性之一——任何操作都可以撤销。
3.6.1 Profile 的 Generation 机制
每次 guix install、guix remove 或 guix upgrade 操作都会创建一个新的 generation(代):
# 查看所有 generation
guix package --list-generations
# 输出示例:
# Generation 1 May 01 2026 10:00:00
# vim 9.0.1 out
# git 2.39.0 out
#
# Generation 2 May 05 2026 14:30:00
# vim 9.0.2 out (升级)
# git 2.40.0 out (升级)
# htop 3.2.1 out (新增)
#
# Generation 3 May 10 2026 09:00:00 (current)
# vim 9.0.2 out
# htop 3.2.1 out
# git 已删除
3.6.2 执行回滚
# 回滚到上一个 generation
guix package --roll-back
# 切换到特定 generation
guix package --switch-generation=2
# 简写形式
guix package -S 2
3.6.3 删除旧 Generation
# 删除特定 generation
guix package --delete-generations=1
# 删除 30 天前的 generation
guix package --delete-generations=30d
# 删除除当前外的所有 generation
guix package --delete-generations
3.6.4 回滚的实际场景
场景:升级导致软件不可用
# 发现 vim 9.0.2 有 bug
guix package --roll-back
# 或者精确回到旧版本
guix package --switch-generation=1
# 确认恢复
guix package --list-installed
💡 提示:Guix System 的回滚同样强大。guix system roll-back 可以将整个系统回退到上一次 reconfigure 的状态。
3.7 垃圾回收(Garbage Collection)
3.7.1 为什么需要 GC?
旧版本的包、已删除包的依赖、构建过程中的临时文件都会累积在 /gnu/store 中,占用磁盘空间。垃圾回收机制清理这些不再被引用的对象。
3.7.2 基本 GC 操作
# 查看 store 占用的空间
guix gc --list-dead # 列出可回收的对象
guix gc --list-live # 列出活跃的对象
# 执行垃圾回收
guix gc --collect-garbage
guix gc -C 5G # 保留至少 5GB 空间
# 删除特定 store 路径
guix gc --delete /gnu/store/abc...-vim-9.0
3.7.3 GC 策略表
| 命令 | 说明 |
|---|---|
guix gc -C 10G | 保留至少 10GB 空间 |
guix gc -D 30d | 删除 30 天前未使用的对象 |
guix gc --delete-generations | 先删除旧 generation 再 GC |
guix gc -F 5G | 释放至少 5GB 空间 |
3.7.4 防止意外回收
# 标记某个 store 路径为 "根"(root),防止被回收
guix gc --referrers /gnu/store/abc...-vim-9.0
# 添加间接引用
guix gc --derivers /gnu/store/abc...-vim-9.0
⚠️ 注意:垃圾回收会永久删除不被引用的对象。执行前请确认没有其他 profile 或服务依赖这些对象。
3.8 Profile 管理
3.8.1 Profile 概念
Profile 是一组包的集合,表现为一个目录(含 bin/、lib/、share/ 等子目录),由指向 /gnu/store 的符号链接组成。
~/.guix-profile/
├── bin/ → /gnu/store/abc.../bin/
├── lib/ → /gnu/store/def.../lib/
├── share/ → /gnu/store/ghi.../share/
└── etc/ → /gnu/store/jkl.../etc/
3.8.2 Profile 类型
| Profile 类型 | 路径 | 用途 |
|---|---|---|
| 默认 Profile | ~/.guix-profile | 用户日常使用的包 |
| 系统 Profile | /run/current-system/profile | Guix System 系统级包 |
| 自定义 Profile | 任意路径 | 项目隔离、功能分组 |
3.8.3 创建自定义 Profile
# 创建目录
mkdir -p ~/profiles/dev
# 安装到自定义 profile
guix install -p ~/profiles/dev python node rust
# 激活自定义 profile
export PATH="$HOME/profiles/dev/bin:$PATH"
# 或者创建一个激活脚本
cat > ~/activate-dev.sh << 'EOF'
export PATH="$HOME/profiles/dev/bin:$PATH"
export GUIX_PROFILE="$HOME/profiles/dev"
source "$HOME/profiles/dev/etc/profile"
EOF
source ~/activate-dev.sh
3.8.4 Manifest 驱动的 Profile
;; ~/manifests/python-dev.scm
(specifications->manifest
'("python"
"python-pip"
"python-virtualenv"
"python-numpy"
"python-pandas"
"python-matplotlib"
"gcc-toolchain"
"pkg-config"))
# 使用 manifest 构建 profile
guix package --manifest=~/manifests/python-dev.scm -p ~/profiles/python-dev
# 更新 profile(从最新的 manifest)
guix package --manifest=~/manifests/python-dev.scm -p ~/profiles/python-dev --upgrade
3.9 使用 guix shell 创建临时环境
guix shell 是创建临时开发环境的最佳工具:
3.9.1 基本用法
# 创建包含 Python 的临时环境
guix shell python python-numpy -- python
# 创建纯净环境(不继承系统包)
guix shell --pure python python-numpy -- python
# 创建容器化环境(更强的隔离)
guix shell --container python -- python
3.9.2 对比三种模式
| 模式 | 隔离程度 | 是否继承系统包 | 网络访问 |
|---|---|---|---|
guix shell | 低 | 是 | 有 |
guix shell --pure | 中 | 否 | 有 |
guix shell --container | 高 | 否 | 可选 |
3.9.3 使用 Manifest 创建环境
;; ~/project-env.scm
(specifications->manifest
'("python"
"python-requests"
"python-flask"
"postgresql"))
# 从 manifest 创建环境
guix shell --manifest=~/project-env.scm
# 在项目目录中放置 manifest
cp ~/project-env.scm ./manifest.scm
guix shell # 自动使用当前目录的 manifest.scm
3.9.4 将环境导出为 Docker 镜像
# 从 shell 环境导出 Docker 镜像
guix shell --container --network \
--expose=$(pwd) \
python python-flask \
-- guix pack -f docker -o image.tar.gz \
python python-flask
3.10 常用操作备忘表
| 操作 | 命令 |
|---|---|
| 搜索包 | guix search <关键词> |
| 查看包详情 | guix show <包名> |
| 安装包 | guix install <包名> |
| 删除包 | guix remove <包名> |
| 列出已安装 | guix package --list-installed |
| 升级全部 | guix pull && guix upgrade |
| 回滚 | guix package --roll-back |
| 查看历史 | guix package --list-generations |
| 垃圾回收 | guix gc -C <空间> |
| 创建临时环境 | guix shell <包名> |
| 查看通道 | guix describe |
| 更新通道 | guix pull |
3.11 实战练习
练习一:搭建 Python 开发环境
# 1. 搜索 Python 包
guix search python | head -20
# 2. 查看 Python 包详情
guix show python
# 3. 创建开发环境
guix shell python python-numpy python-pandas -- python3 -c "
import numpy as np
import pandas as pd
print('NumPy:', np.__version__)
print('Pandas:', pd.__version__)
"
练习二:体验回滚
# 1. 安装一个包
guix install tree
tree --version
# 2. 删除它
guix remove tree
# 3. 确认已删除
which tree # 应该找不到了
# 4. 回滚
guix package --roll-back
# 5. 确认恢复
which tree # 又回来了
tree --version
3.12 总结
本章学习了 Guix 的日常操作:
- 搜索与查看——
guix search、guix show - 安装与删除——
guix install、guix remove - 升级与回滚——
guix upgrade、--roll-back - 垃圾回收——
guix gc释放磁盘空间 - Profile 管理——多 profile 隔离环境
- 临时环境——
guix shell快速创建开发环境
下一章我们将深入包定义的内部结构。