一套 NixOS + Home Manager 配置,分两层:
modules/— 系统(怎么工作,选项集中在options.nix,不写死机器特定值)users/— 人(用什么软件,怎么个性化;通过 profile 系统按需组合)
首次部署只需 3 步,向导会帮你搞定一切。
git clone -b solo https://github.com/MCB-SMART-BOY/nixos-config.git
cd nixos-config
sudo nixos-generate-config # 生成 hardware-configuration.nix
./run.sh deploy # 交互式向导:自动生成 local.nix + hardware-gpu.nix + 用户模板 + 部署向导会依次询问你:
你的用户名?(默认 admin)
主机名?(默认 nixos)
时区?(默认 Asia/Shanghai)
→ 自动生成 local.nix
部署模式?(新增用户 / 仅更新)
覆盖策略?
GPU 配置?(检测拓扑,生成 hardware-gpu.nix)
→ 从 users/_template 自动生成用户目录 → 同步 → nixos-rebuild
→ 自动回写文件到本地仓库
部署完成后:
git add users/<你的用户名>/
git commit -m "初始化用户配置"local.nix 和 hardware-gpu.nix 是机器私有配置,已被 .gitignore 排除,默认不提交。新装机器会在 local.nix 固定 system.stateVersion = "26.05";已有机器升级时必须保留初装值,不要随系统版本修改。旧的 25.11 机器如果还没有显式写入该字段,应先在私有 local.nix 中补上 system.stateVersion = lib.mkForce "25.11";。
日常修改配置后重建:
sudo nixos-rebuild switch --flake path:/etc/nixos#hostnixos-config/
├── flake.nix # Flake 输入入口
├── flake/ # Flake outputs 组合(host / checks / formatter)
├── local.nix # 机器身份(gitignored,由 run.sh 生成)
├── local.nix.example # 手动部署时的参考模板
├── hardware-configuration.nix # nixos-generate-config 生成(gitignored)
├── hardware-gpu.nix # run.sh 生成的图形/GPU 策略(gitignored)
│
├── modules/ # 系统层(通用,不写死机器值)
│ ├── default.nix # 聚合 + mkDefault 默认值
│ ├── options.nix # 所有 mcb.* 选项集中声明
│ ├── users.nix # 账户创建
│ └── boot.nix / networking.nix / nix.nix / …
│
├── users/
│ ├── profiles/ # 共享 profile 模块(按需启用软件组合)
│ │ ├── base-desktop.nix # 基础桌面
│ │ ├── cli-tools.nix # CLI 工具链
│ │ ├── dev.nix # 开发工具链
│ │ ├── research.nix # 学术写作
│ │ ├── gaming.nix # 游戏
│ │ ├── china-apps.nix # 国内应用
│ │ ├── media.nix # 媒体/音乐
│ │ ├── network-tools.nix # 网络调试
│ │ ├── life.nix # 生活工具
│ │ └── theming.nix # 主题美化
│ ├── _template/ # 新用户最小模板,不是实际 Home Manager 用户
│ └── admin/ # 仓库内置真实用户,也是未写 local.nix 时的默认回退
│ ├── default.nix # 入口
│ ├── packages.nix # profile 选择(按需启用,不内联包列表)
│ ├── git.nix # Git 身份(占位值,真实身份在 gitignored local.nix)
│ ├── desktop.nix # Noctalia / 桌面应用入口
│ ├── shell.nix # Zsh / Starship / Tmux
│ ├── scripts/ # 用户脚本源文件
│ └── config/ # dotfiles(niri / helix / fastfetch …)
│
├── overlays/ # nixpkgs 覆盖层
├── pkgs/ # 自维护包(YesPlayMusic)
├── scripts/check/ # flake check 使用的质量检查脚本
├── scripts/run/ # 部署工具(deploy / add-user)
└── docs/
./run.sh add-user # 交互式选择:用户名 / 管理员 / 模板来源 / 是否重建
./run.sh add-user alice --admin # 参数模式:管理员,交互式询问 git 身份
./run.sh add-user bob # 参数模式:普通用户,默认使用 users/_template
./run.sh add-user eve --copy-from admin # 显式从 admin 复制 config/assets/scripts
./run.sh add-user ops --no-rebuild # 仅生成文件,稍后手动重建默认模板是 users/_template,包含最小 GNOME 桌面、Shell、Git 与软件入口;复制 admin 代表继承当前个人 Niri 配置,应当显式选择。
同一个 NixOS 机器可以拥有多个独立的 Home Manager 用户,每个用户有独立的软件选择、dotfiles 和 Git 身份。
local.nix: mcb.users = ["admin" "alice" "bob"]
│
┌───────────┼───────────┐
▼ ▼ ▼
users/admin/ users/alice/ users/bob/
独立 HM 独立 HM 独立 HM
完整 profile 轻量 profile 自定义 profile
每个用户目录是自包含的 Home Manager 配置:
packages.nix— 通过 profile 开关选择软件组合git.nix— 独立的 Git 身份(仓库中为占位值,真实身份在local.nix)desktop.nix— 独立的桌面环境变量与 MIME 关联config/— 独立的 dotfiles
# 单用户(solo 日常)
mcb.user = "admin"; # 只设主用户即可
# 多用户
mcb.users = ["admin" "alice"]; # 全部托管用户
mcb.adminUsers = ["admin"]; # 管理员(wheel 组)每个用户的 packages.nix 独立选择 profile:
# admin 的 packages.nix — 完整开发工作站
mcb.profiles = {
base-desktop.enable = true;
cli-tools.enable = true;
dev.enable = true;
research.enable = true;
gaming.enable = true;
china-apps.enable = true;
# ...
};
# alice 的 packages.nix — 轻量桌面
mcb.profiles = {
base-desktop.enable = true;
cli-tools.enable = true;
life.enable = true;
theming.enable = true;
};如果要管理多台 NixOS 机器(如台式机 + 笔记本),当前架构的支持方式:
台式机: nixosConfigurations.desktop ← flake 输出名
笔记本: nixosConfigurations.laptop ← flake 输出名
两台机器共享 modules/(系统层),各自拥有独立的:
- local.nix(用户名、主机名、时区)
- hardware-configuration.nix(磁盘、文件系统)
- hardware-gpu.nix(GPU 拓扑)
如需多机支持,在 flake/ 中为每台机器添加对应的 nixosConfigurations 入口。
用户软件不再内联在 packages.nix 中,而是通过 users/profiles/ 下的 profile 模块按需启用。
| Profile | 内容 | 典型场景 |
|---|---|---|
base-desktop |
终端、浏览器、文件管理、Wayland 基础 | 所有人 |
cli-tools |
git/fzf/ripgrep/bat/eza/zoxide/starship 等 | 终端用户 |
dev |
rustup/go/node/opam/cmake/gcc/编辑器/Nix LSP | 开发者 |
research |
Zotero/TeX/Typst/Obsidian/LibreOffice | 学术/写作 |
gaming |
Steam/MangoHud/Proton/Lutris/Wine | 游戏玩家 |
china-apps |
QQ/B站/动漫/代理面板/蓝牙 | 国内用户 |
media |
音乐播放/录屏直播 | 媒体创作者 |
network-tools |
抓包/诊断/性能/逆向/二进制 | 网管/安全 |
life |
日历/天气/密码/下载/备份/分区 | 日常使用 |
theming |
图标/光标/GTK 主题 | 外观定制 |
# users/<你的用户名>/packages.nix
mcb.profiles = {
base-desktop.enable = true; # 必选
cli-tools.enable = true; # 推荐
dev.enable = true; # 开发者
gaming.enable = false; # 不需要就关掉
};在 users/profiles/ 下创建新文件,参考现有 profile 的模板:
# users/profiles/my-profile.nix
{ lib, pkgs, ... }:
{
options.mcb.profiles.my-profile = lib.mkEnableOption "我的 profile";
config = lib.mkIf config.mcb.profiles.my-profile.enable {
home.packages = with pkgs; [ ... ];
};
}然后在 users/profiles/default.nix 的 imports 中注册,在用户 packages.nix 中启用。
| 场景 | 命令 | 说明 |
|---|---|---|
| 🆕 首次部署 | ./run.sh deploy |
交互式向导,自动生成 local.nix + 用户模板 + 回写 |
| 🔄 日常重建 | nixos-rebuild switch --flake path:/etc/nixos#host |
改了配置直接跑 |
| 👤 新增用户 | ./run.sh add-user |
交互式增量添加,更新 local.nix;立即重建时会先同步到目标配置目录 |
| 📦 更新依赖 | nix flake update --flake path:/etc/nixos |
更新 flake.lock |
| ✅ 配置检查 | nix flake check path:/etc/nixos |
验证配置 |
| 🔍 代码质量 | statix check / deadnix . |
Nix 静态分析与死代码检测 |
| 🗑 清理旧代 | nix-collect-garbage --delete-older-than 30d |
释放磁盘空间 |
| 想改的 | 去 |
|---|---|
| 主机名、用户名、时区 | local.nix |
| 磁盘 / initrd / 官方硬件事实 | hardware-configuration.nix |
| GPU / 图形驱动 / PRIME / 独显直连 | hardware-gpu.nix |
| 系统包组 | modules/packages.nix |
| 用户软件组合 | users/<user>/packages.nix(启用/禁用 profile) |
| 具体包列表 | users/profiles/<name>.nix |
| dotfiles | users/<user>/config/ |
| 防火墙 / DNS | modules/networking.nix |
| 内核 / sysctl | modules/boot.nix |
| Git 身份(真实值) | users/<user>/local.nix(gitignored) |
| 选项开关定义 | modules/options.nix |
| Flake 输出组合 | flake/ |
| Nix 代码质量 | statix check + deadnix . + flake checks |
modules/不写死机器值 — 用户名、主机名在local.nix,GPU busId 在hardware-gpu.nix(均 gitignored)users/只管人 — 系统包组在modules/,个人软件通过 profile 在users/<user>/packages.nixusers/_template/是模板,users/admin/是真实默认用户 — 新用户默认从_template生成;如果完全不写local.nix,默认会启用admin- GPU 使用本机私有模块 —
run.sh deploy检测拓扑并生成hardware-gpu.nix,内部仍使用 NixOS 原生hardware.graphics/hardware.nvidia.prime - 代理由应用管理 — NixOS 只为 clash-verge-rev 准备 Service Mode、TUN capability 与防火墙条件,订阅/规则/DNS/TUN 开关由 GUI 管理
- 选项集中管理 — 所有系统层
mcb.*选项声明在modules/options.nix;用户层选项(mcb.git.*、mcb.desktopEntries.*)在各自的用户模块中自包含 - Flake 只做组合 —
flake.nix只声明 inputs,outputs 逻辑拆到flake/ - 脚本只做编排 — 日常操作直接走 NixOS 原生命令,
run.sh只管首次部署和用户管理 - Profile 按需组合 — 用户软件通过
users/profiles/下的模块按需启用,避免包列表重复 - 身份安全 — 仓库中的
git.nix使用占位值,真实 Git 身份写在 gitignored 的users/<user>/local.nix