NixOS 工作电脑运维方案

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 updatesudo nixos-rebuild switch --flake .先更新 flake.lock,再构建切换
仅更新 nixpkgsnix flake lock --update-input nixpkgs → rebuild不更新其他 inputs
查看 generationsnixos-rebuild list-generations列出所有可回滚版本
回滚sudo nixos-rebuild switch --rollback回退到上一个 generation
回滚到指定代sudo nix-env --profile /nix/var/nix/profiles/system --switch-generation NN = 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 → 导入私钥

七、推荐的社区资源