安装路径与桌面选型

安装路径

配置式 native:

nixos.iso 安装 -> disko 硬盘分区 -> 硬件配置.nix -> 系统应用.nix -> nixos-install / rebuild --flake /mnt/etc/nixos#hostname 初始安装

桌面选型(多屏、多窗口场景)

对比项KDE Plasma / GNOMEHyprlandniri
窗口模型浮动/堆叠,手动拖拽动态平铺,网格分割滚动平铺,横向延伸
多屏调度原生支持完善,无平铺逻辑工作区绑定显示器,焦点可跨屏跳转每屏独立滚动带,无跨屏跳转
大量窗口场景窗口增多后需手动整理窗口增多后尺寸被压缩窗口向右排列,尺寸不变
配置稳定性极稳定,维护量低配置语言迁移与 API 变动较频繁KDL 单一配置,格式稳定
NixOS 集成官方模块,开箱即用社区 flake 较多但分散sodiboo/niri-flake 原生支持
维护成本低中高,需定期调整配置低,构建时校验
适用场景通用办公与娱乐熟悉生态、可接受调整成本多屏、大量窗口、长期高负载
NixOS 图形桌面生态
│
├─ L1 · 用户选择的图形体验
│  │  入口原则:用户先选“我想要什么样的桌面”,再向下追溯实现
│  │
│  ├─ 1A. 完整桌面环境(开箱即用)
│  │  ├─ KDE Plasma 6
│  │  │  └─ Shell/桌面框架:Plasma → 窗口管理与合成:KWin
│  │  ├─ GNOME
│  │  │  └─ Shell:GNOME Shell → 窗口管理与合成:Mutter
│  │  ├─ XFCE ────────────── 窗口管理器:xfwm4(可替换)
│  │  ├─ Cinnamon
│  │  ├─ MATE
│  │  ├─ Budgie
│  │  ├─ LXQt
│  │  ├─ Deepin
│  │  ├─ Pantheon
│  │  ├─ COSMIC(桌面本体;登录组件见 L3)
│  │  ├─ Lumina
│  │  ├─ CDE
│  │  └─ Lomiri
│  │     └─ 注:Plasma 5 归入历史/兼容分支,不作主线
│  │
│  ├─ 1B. 极简 / 高度定制桌面方案(自行组合)
│  │  ├─ Wayland 原生合成器
│  │  │  ├─ Hyprland(动态平铺)
│  │  │  ├─ Niri(可滚动平铺)
│  │  │  ├─ Sway(i3 兼容平铺)
│  │  │  │  └─ SwayFX(Sway 衍生,特效增强)
│  │  │  ├─ River(动态布局)
│  │  │  ├─ Wayfire(3D 特效)
│  │  │  ├─ labwc(Openbox 风格堆叠)
│  │  │  ├─ MangoWC
│  │  │  └─ DWL(dwm 的 Wayland 移植)
│  │  │
│  │  ├─ X11 窗口管理器
│  │  │  ├─ i3、bspwm、awesome、xmonad、dwm
│  │  │  ├─ Openbox、Fluxbox、IceWM、Window Maker、AfterStep
│  │  │  ├─ herbstluftwm、spectrwm、cwm、evilwm、berry、2bwm、wmii
│  │  │  ├─ clfswm、yeahwm
│  │  │  └─ EXWM(Emacs 作为 WM)
│  │  │
│  │  └─ 跨协议窗口管理器
│  │     └─ Qtile(Python 配置,支持 X11 / Wayland,按会话选择协议)
│  │
│  └─ 1C. 自定义方案需自行组合的外围组件
│     ├─ 状态栏/面板:Waybar、Polybar
│     ├─ 启动器:fuzzel、wofi、rofi
│     ├─ 通知:mako、dunst
│     ├─ 锁屏/空闲管理、壁纸、剪贴板/截图
│     └─ 门户服务与桌面设置工具
│
├─ L2 · 桌面会话与核心实现
│  │  说明:L1 产品向下展开后的核心组件层,与 L1 存在交叉引用
│  │
│  ├─ 桌面 Shell / 桌面框架
│  │  ├─ Plasma Shell(KDE)
│  │  ├─ GNOME Shell
│  │  └─ 各 DE 自带的面板/会话组件
│  │
│  ├─ 窗口管理器 / 合成器
│  │  ├─ 合成器兼显示服务器(Wayland 会话)
│  │  │  ├─ KWin(Wayland 模式)
│  │  │  ├─ Mutter(Wayland 模式)
│  │  │  ├─ Hyprland、Niri、Sway、River、Wayfire、labwc 等
│  │  │  └─ 注:Wayland 下合成器通常同时承担显示服务器职责
│  │  └─ 传统 X11 窗口管理器(与 X Server 分离)
│  │     └─ i3、bspwm、Openbox、xfwm4 等
│  │
│  └─ 会话辅助服务
│     ├─ D-Bus、XDG Desktop Portal、Polkit
│     ├─ PipeWire(音频/屏幕共享)
│     └─ 输入法、电源管理、剪贴板管理
│
├─ L3 · 图形会话基础设施
│  │  说明:独立于具体桌面产品,多对多关联
│  │
│  ├─ 登录与会话选择(显示管理器 / Greeter)
│  │  ├─ GDM
│  │  ├─ SDDM
│  │  ├─ LightDM
│  │  ├─ greetd
│  │  ├─ Ly
│  │  ├─ emptty
│  │  ├─ lemurs
│  │  └─ cosmic-greeter(COSMIC 相关登录组件)
│  │
│  ├─ 显示协议 / 显示服务器
│  │  ├─ Wayland 协议
│  │  │  ├─ 由各 Wayland 合成器实现
│  │  │  └─ Xwayland:Wayland 会话中兼容 X11 应用
│  │  └─ X11 / Xorg
│  │     ├─ X Server
│  │     └─ 独立窗口管理器(见 L2)
│  │
│  └─ 基础设施服务
│     ├─ D-Bus、Polkit、XDG Portal
│     ├─ PipeWire、WirePlumber
│     └─ 电源/登录/会话管理(logind 等)
│
└─ L4 · 图形栈与 NixOS 实现
   │
   ├─ GPU 与内核驱动(Mesa、nvidia、amdgpu 等)
   ├─ 图形 API:OpenGL / Vulkan / EGL
   ├─ Nixpkgs 软件包
   ├─ NixOS Modules:services.desktopManager.*、programs.*、services.displayManager.*
   ├─ systemd 服务与会话启动
   └─ Home Manager 用户级配置

配置树

nixos-config/
├── flake.nix                          # 入口:定义所有 machine,切换方案
├── flake.lock
├── lib/                               # 纯 Nix 辅助函数(如自定义的 mkSystem, mkHome 构建器)
│   └── default.nix
├── hardware/                          # ---------- 硬件层 ----------
│   ├── laptop-A.nix
│   ├── server-B.nix
│   └── pad-C.nix
├── system/                            # ---------- 系统层 ----------
│   ├── kernel.nix                     # 内核:版本、模块、参数
│   ├── setting/                       # 设置
│   │   ├── nix.nix                    #   nix.settings、GC、flakes
│   │   ├── locale.nix                 #   时区、locale、键盘布局
│   │   ├── users.nix                  #   用户组、系统用户
│   │   └── state.nix                  #   system.stateVersion
│   ├── desktop/                       # 桌面环境
│   │   ├── kde.nix
│   │   ├── gnome.nix
│   │   └── hyprland.nix
│   ├── components/                    # 系统组件
│   │   ├── network.nix                #   NetworkManager、DNS
│   │   ├── input-method.nix           #   fcitx5 / ibus
│   │   ├── audio.nix                  #   PipeWire / PulseAudio
│   │   ├── fonts.nix                  #   字体、字体渲染
│   │   └── power.nix                  #   TLP、upower、电池
│   ├── packages/                      # 系统级应用
│   │   ├── docker.nix                 #   docker
│   │   └── xxxx.nix                   #   其它
│   ├── services/                      # 系统服务
│   │   ├── sshd.nix                   #   SSH 服务
│   │   ├── docker.nix                 #   Docker 引擎(不碰容器)
│   │   ├── firewall.nix               #   防火墙
│   │   └── cron.nix                   #   定时任务
│   ├── container/                     # 容器
│   │   ├── vc-mysql.nix               #   virtualisation.oci-containers 实例:数据库
│   │   ├── vc-foregejo.nix            #   virtualisation.oci-containers 实例:仓库
│   │   └── dk-nginx.nix               #   docker 实例:Nginx
├── home/                              # ---------- 用户层 ----------
│   └── userA/
│       ├── packages/                  # 安装工具
│       │   ├── browsers.nix           #   chrome
│       │   ├── editors.nix            #   vscode, notepad++
│       │   ├── terminals.nix          #   alacritty, kitty, wezterm
│       │   └── tools.nix              #   其他工具
│       └── setting/                   # 设置
│           └── shell.nix              #   bash/zsh/fish、别名
├── overlays/                          # 补丁
│   └── default.nix
└── machines/                          # 机器层:完整方案组装
    ├── laptop-A/
    │   └── default.nix
    ├── server-B/
    │   └── default.nix
    └── pad-C/
        └── default.nix

flake.nix 示例

{
  description = "Highly modular NixOS configuration";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";

    # 引入 home-manager
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, home-manager, ... }@inputs: {
    nixosConfigurations = {

      # 桌面工作站:Hermes
      hermes = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        # 将 inputs 传递给所有子模块,方便后续调用
        specialArgs = { inherit inputs; };
        modules = [
          ./machines/hermes/default.nix
        ];
      };

      # 无头服务器:Machine-A
      machine-a = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        specialArgs = { inherit inputs; };
        modules = [
          ./machines/machine-a/default.nix
        ];
      };

    };
  };
}