Skip to content

MCB-SMART-BOY/nixos-config

Repository files navigation

NixOS 配置 —— 两层架构,清晰边界

一套 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.nixhardware-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#host

目录

nixos-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

单用户 vs 多用户

# 单用户(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 入口。


软件管理:Profile 系统

用户软件不再内联在 packages.nix 中,而是通过 users/profiles/ 下的 profile 模块按需启用。

可用的 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 主题 外观定制

启用/禁用 profile

# users/<你的用户名>/packages.nix
mcb.profiles = {
  base-desktop.enable = true;    # 必选
  cli-tools.enable = true;       # 推荐
  dev.enable = true;             # 开发者
  gaming.enable = false;         # 不需要就关掉
};

添加新 profile

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.niximports 中注册,在用户 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

设计原则

  1. modules/ 不写死机器值 — 用户名、主机名在 local.nix,GPU busId 在 hardware-gpu.nix(均 gitignored)
  2. users/ 只管人 — 系统包组在 modules/,个人软件通过 profile 在 users/<user>/packages.nix
  3. users/_template/ 是模板,users/admin/ 是真实默认用户 — 新用户默认从 _template 生成;如果完全不写 local.nix,默认会启用 admin
  4. GPU 使用本机私有模块run.sh deploy 检测拓扑并生成 hardware-gpu.nix,内部仍使用 NixOS 原生 hardware.graphics / hardware.nvidia.prime
  5. 代理由应用管理 — NixOS 只为 clash-verge-rev 准备 Service Mode、TUN capability 与防火墙条件,订阅/规则/DNS/TUN 开关由 GUI 管理
  6. 选项集中管理 — 所有系统层 mcb.* 选项声明在 modules/options.nix;用户层选项(mcb.git.*mcb.desktopEntries.*)在各自的用户模块中自包含
  7. Flake 只做组合flake.nix 只声明 inputs,outputs 逻辑拆到 flake/
  8. 脚本只做编排 — 日常操作直接走 NixOS 原生命令,run.sh 只管首次部署和用户管理
  9. Profile 按需组合 — 用户软件通过 users/profiles/ 下的模块按需启用,避免包列表重复
  10. 身份安全 — 仓库中的 git.nix 使用占位值,真实 Git 身份写在 gitignored 的 users/<user>/local.nix

About

I have experienced nixos for a long time and the design of using configuration.nix really shocked me , thus I upload my nix document of configuration , glad to hear some comment.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors