nixos当主力机的半个月感受

感受评价

  • 配置式系统的感受
    • 配置式独树一帜!经过ubuntu,mint,alpine,oraclelinux后,仍对nixos念念不忘,直到对AI充满信心果断投身
    • nix编写,没有语法提示,纯盲写模式,试错成本很高,但在ai时代这不是问题,拥抱配置式
    • rebuild启动记录,可以随意切换不同时间点的记录进入系统,新手不容易折腾进死胡同
    • 硬件,多屏菊花链的显示底层参数,可以让ai分析搞定nix配置,而win需要通过amd管理软件设置
    • 软件,可以在系统运行时手动安装,也可以nix配置搭配脚本,rebuild后完成很复杂的持久化,高度可控,任意插拔
  • linux性能
    • 合盖睡眠cpu不会转,第二天开盖还活着,电量只掉10%,幸福啊
    • 有意外的睡眠和唤醒问题,直接让ai排查,增加配置定义或联动脚本
    • 电源管理策略不同电源模式设定
    • 启动速度快,重启快,占用内存少,cpu安静多了,可能和大部分应用都不会臃肿有关吧
  • plasma桌面
    • linux桌面可选丰富,最终选择了plasma,对它的多屏窗口管理比较中意:GNOME、KDE Plasma、Cinnamon、Mate、XFCE、Budgie、Deepin、Pantheon、CDE、COSMIC、LXQT、Lumina、Lomiri……
    • 窗口快捷键自定义:左右上下半屏,快速居中75%,横跨所有屏幕,移到别的屏幕,移到别的虚拟桌面,如果窗口操作的快捷键功能里没有你需要的,直接告诉ai,给你开发一个持久化配置组件,高度可定制
  • 日常基本功能
    • 中文输入法有rime+薄荷拼音,之前用过的配置可以直接复用
    • 可以借助ai开发出很多便捷的脚本工具,交互便捷性自由,非常简洁环保
  • 工作环境
    • uv的python环境软链硬链指向,高度复用节省硬盘,比miniconda爽多了
    • kvm win虚拟机,可以借助ai完成性能优化和不同的硬件模拟.xml启动,开发了kvm脚本,可以快速管理
    • 让ai给dolphin文件管理器开发两个按钮,可以在当前位置打开指定py环境的终端,jupter lab
    • 让ai给dolphin发了一个类似sudo的按钮,当操作需要root权限目录时可以点击临时授权

AI蒸馏分析

  • Nix 技术领域构成全图

    图例:★★ 深度实践(自建机制层)  ★ 已在用  ☆ 局部使用  · 未涉及
    
    ┌─ L0 语言与构建 ─────────────────────────────────────────────┐
    │  Nix 表达式 / derivation / nixpkgs 包集合                  ★  │
    │  overlay、override(改包而不 fork 整个 nixpkgs)            ☆  │
    │  flake(输入锁定 + 可复现的入口)                           ·  │
    └──────────────────────────────────────────────────────────────┘
    ┌─ L1 系统声明:模块系统 ─────────────────────────────────────┐
    │  单文件模块 + 主配置逐行开关(一行 = 一个功能)            ★★ │
    │  模块自带 options(对外暴露参数,本模块自管)              ★  │
    │  mkIf / mkDefault / mkForce / mkAfter 的组合语义           ★  │
    │  自定义构建期脚本(runCommand / writeShellScript)          ★  │
    │  home-manager(用户级声明)                                 ·  │
    └──────────────────────────────────────────────────────────────┘
    ┌─ L2 引导与内核 ─────────────────────────────────────────────┐
    │  引导器选型 / 菜单条目 / 世代命名池                         ★★ │
    │  裸 switch 拦截(强制给世代写描述)                         ★★ │
    │  内核参数 / initrd 可用模块清单                             ★  │
    │  内核与驱动版本钉死(不用浮动别名)                         ★  │
    └──────────────────────────────────────────────────────────────┘
    ┌─ L3 硬件适配 ───────────────────────────────────────────────┐
    │  固件 / 微码 / 专有驱动使能                                 ★  │
    │  显示链路:MST 色深约束 / 固定 EDID / 唤醒后重刷            ★★ │
    │  外置显卡:驱动钉版 / 输出拓扑 / 直通模式准备               ★  │
    │  无线、指纹、电源与合盖策略                                 ★  │
    │  声明式分区(disko)                                        ·  │
    └──────────────────────────────────────────────────────────────┘
    ┌─ L4 服务与运行时 ───────────────────────────────────────────┐
    │  systemd 单元(系统级 + 用户级)                            ★★ │
    │  运行时规则表 + 开机重放(nix 只留服务开关)                ★★ │
    │  虚拟化 / 容器 / 网络 / 防火墙                              ★  │
    │  密钥管理(sops / agenix 一类)                             ·  │
    └──────────────────────────────────────────────────────────────┘
    ┌─ L5 桌面与会话 ─────────────────────────────────────────────┐
    │  显示管理器 / 桌面栈 / 输入法                                ★  │
    │  会话级组件定制:显示配置守护、窗口规则、自动挂载策略        ★★ │
    └──────────────────────────────────────────────────────────────┘
    ┌─ L6 状态与版本治理 ─────────────────────────────────────────┐
    │  世代回滚(任意时间点可回)                                 ★  │
    │  git 分支模型 + 里程碑 tag + 一次任务一次提交               ★★ │
    │  声明式与运行时的边界划分(把会变的状态移出世代)          ★★★│
    │  多机部署(deploy-rs / nixos-anywhere)                      ·  │
    └──────────────────────────────────────────────────────────────┘
  • 本机实施定位

一句话:不是 flake 生态派,而是「channel 钉修订 + 深度单文件模块 + 运行时边界治理」这一路。强项不在追逐新工具,而在把每一层的边界划清楚。

层定位判据
L0 语言与构建基础够用只用 nixpkgs 与少量 overlay;不引入 flake 的输入锁定机制,改用「把 nixpkgs 钉到具体修订」达到同样的可复现目标
L1 模块系统最深之一103 个自包含单文件 + 59 行显式开关 + 7 处自声明 options;「一个功能一个文件、注释即停用」是硬约定
L2 引导与内核深自建世代命名池与「裸 switch 必须带描述」的守卫;内核与驱动都写死具体版本
L3 硬件适配最深显示链路、外置显卡、无线、指纹、电源策略都有独立模块,且都记录了判据与实测值
L4 服务与运行时深防火墙走「表驱动 + 开机重放」,nix 侧只留服务开关;用户级单元自己声明
L5 桌面会话深不止换主题:显示配置守护、窗口规则路由、自动挂载策略都被收进声明层
L6 状态与版本治理最有特色见下方三条实例
未涉及的层明确留白flake / home-manager / 密钥管理 / 声明式分区 / 多机部署 —— 都是「知道但不做」,不是「不知道」
  • 最有特色的一点:把「会变的状态」从世代里剥离

常规 NixOS 实践倾向把一切都塞进配置。这里的取舍相反:声明式只管「机制」,频繁变化的值留在运行时。三个已落地的实例:

场景nix 声明的部分(不变)留在运行时的部分(会变)
显卡直通 / 宿主切换能力前提 + 一个启动期应用服务每张卡的期望模式(一个状态文件);切换不产生新世代
睡眠源 / 唤醒源清单重放服务 + 校验逻辑清单本身(单一数据源,开机重放为运行时状态)
显示布局守护两个监听单元 + 校验/恢复脚本「正确布局」基准(两份,锁屏与熄屏各一份)

代价与收益:代价是系统实际状态不再能只从配置文件推出(要多看一处状态文件);收益是高频操作不会污染版本基线。这是刻意的取舍,不是疏漏。

  • 一句话总结

外部模型描述的是「一个用遍现代 Nix 工具链的人」;这台机器实际是「一个把模块边界和运行时边界都划得很清楚、但刻意不追新工具的人」。两者都算高阶,但方向不同:前者是横向铺开工具面,后者是纵向把边界钉死。