感受评价
- 配置式系统的感受
- 配置式独树一帜!经过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 工具链的人」;这台机器实际是「一个把模块边界和运行时边界都划得很清楚、但刻意不追新工具的人」。两者都算高阶,但方向不同:前者是横向铺开工具面,后者是纵向把边界钉死。