NixOS 个人工作电脑运维方案
一、为什么选 NixOS 做工作电脑
- 声明式配置:整个系统(包/服务/用户/内核参数)在
configuration.nix + flake.nix 中声明,重装/换机只需复制配置文件
- 原子升级/回滚:
nixos-rebuild switch 生成新 generation,出问题秒级回滚到上一个 generation
- 无依赖地狱:每个包有独立 /nix/store hash,不会出现 libc 版本冲突
- 可复现:flake.lock 锁定所有输入版本,同一份配置 + flake.lock = 完全相同的系统
- 开发环境即代码:devshell / devenv / nix-shell 按项目隔离环境,不影响系统包
二、方案架构
flake.nix(入口,定义 inputs + outputs)
├── hosts/
│ ├── framework.nix # 笔记本硬件配置(Framework / ThinkPad / 台式机...)
│ └── common.nix # 通用配置(Shell/编辑器/…)
├── modules/
│ ├── desktop/ # 桌面环境(GNOME / Hyprland / KDE...)
│ ├── dev/ # 开发工具(VSCode / Docker / 编程语言...)
│ ├── security/ # 安全配置(SSH / 防火墙 / 全盘加密...)
│ └── apps/ # 日常软件(浏览器/输入法/媒体...)
├── home/ # Home Manager 用户级配置
│ ├── common.nix # 通用 user 配置
│ └── at.nix # 你的用户专属配置
├── secrets/ # sops-nix / agenix 加密机密
├── flake.lock # 版本锁定
└── flake.nix
三、核心组件
3.1 Flake — 现代 NixOS 标配
# flake.nix 骨架
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
home-manager = {
url = "github:nix-community/home-manager/release-24.11";
inputs.nixpkgs.follows = "nixpkgs";
};
nixos-hardware.url = "github:NixOS/nixos-hardware";
sops-nix.url = "github:Mic92/sops-nix";
};
outputs = { nixpkgs, home-manager, ... }: {
nixosConfigurations.framework = nixpkgs.lib.nixosSystem {
modules = [
./hosts/framework.nix
home-manager.nixosModules.home-manager
];
};
};
}
3.2 Home Manager — 用户环境管理
- 管理 ~/.config 下所有 dotfile(zsh/fish/git/neovim/kitty)
- 声明式安装用户级包(不污染系统 profile)
- 支持 systemd user units(用户级定时器/服务)
- 切换命令:
home-manager switch(用户级)/ nixos-rebuild switch(系统级,连带 home-manager 一起)
3.3 机密管理(sops-nix / agenix)
- SSH 私钥、WiFi 密码、API token 不进公开配置
sops-nix:用 age/Sops 加密 secret 文件,flake 中按 host 解密
- 推荐:私钥在安装时手动导入,不写入配置
四、日常运维
| 操作 | 命令 | 说明 |
| 更新系统 | nix flake update → sudo nixos-rebuild switch --flake . | 先更新 flake.lock,再构建切换 |
| 仅更新 nixpkgs | nix flake lock --update-input nixpkgs → rebuild | 不更新其他 inputs |
| 查看 generations | nixos-rebuild list-generations | 列出所有可回滚版本 |
| 回滚 | sudo nixos-rebuild switch --rollback | 回退到上一个 generation |
| 回滚到指定代 | sudo nix-env --profile /nix/var/nix/profiles/system --switch-generation N | N = generation 编号 |
| 垃圾收集 | sudo nix-collect-garbage -d | 删除未引用的 store 路径,-d 删旧 generations |
| 查看磁盘占用 | sudo nix du /nix/store | 按路径显示 /nix/store 大小 |
| 搜索包 | nix search nixpkgs <name> | 在线搜索可用包 |
| 临时运行 | nix shell nixpkgs#<pkg> | 不安装,只在当前 shell 可用 |
| 修复损坏路径 | sudo nix-store --verify --check-contents | 检查 store 完整性 |
五、按需场景定制
5.1 中国用户加速
- 使用国内 mirror:
nix.settings.substituters = [ "https://mirrors.tuna.tsinghua.edu.cn/nix-channels/store" "https://cache.nixos.org" ]
- nixos-cn 社区二进制缓存
5.2 开发环境隔离
- devenv.sh:声明式 dev shell(语言 + 工具 + 服务 + 脚本),按项目独立
- nix-shell / nix develop:临时进入特定环境
- direnv + nix-direnv:cd 进项目目录自动加载环境
5.3 桌面环境选择
- GNOME:最成熟的开箱即用,NixOS 上游支持最佳
- Hyprland:Wayland 平铺 WM,性能极好、可定制强,但需要习惯纯键盘操作
- KDE Plasma 6:功能全面,Wayland 支持接近完成
六、最佳实践 & 注意事项
Do's ✅
- flake + home-manager 组合,配置文件全版本管理(git)
- 按功能拆分模块(desktop/dev/security/apps),不要全塞一个文件
- 定期
nix flake update + rebuild,避免 accumulation of updates(一次更新太多易出事)
- 大更新前
nixos-rebuild dry-build 预览变更
- 保留最后 3-5 个 generations:
boot.loader.systemd-boot.configurationLimit = 5
- nixpkgs 用稳定分支(24.11),个人包用 unstable overlay 或 flake inputs 引入
Don'ts ❌
- 不要在系统里手动
pip install / npm install -g — 会破坏声明式预期
- 不要改
/nix/store 里的文件 — store 是只读的,改了也没用(下次构建恢复)
- 不要在 flake.nix 里写敏感信息 — 用 sops-nix 或环境变量文件
- 不要同时用两个包管理方式(如既在
environment.systemPackages 装 git 又在 home-manager 装)— 选一个统一方式
日常维护节奏
- 每周:
nix flake update + rebuild,检查是否有 breaking changes
- 每月:
nix-collect-garbage -d 清理磁盘,保留近期 3 generations
- 大版本升级(如 24.11 → 25.05):先 dry-build,检查 changelog 中不兼容变更
- 换机/重装:复制 flake repo →
nixos-install --flake .#hostname → 导入私钥
七、推荐的社区资源