核验范围:2026 年 10 月查询的 nixpkgs
nixos-unstable模块与上游文档。分组列表、包数和服务默认值会随 revision 改变;部署时应以项目锁定的 nixpkgs 和 Home Manager 源码为准。本文没有构建、激活或桌面运行测试。
问题#
GNOME 的设置(主题、壁纸、外设、夜灯…)存在哪?rebuild 后会丢吗?怎么把它变成声明式、可重现?
存储机制:dconf#
GNOME 的配置是 dconf——一个 key-value 数据库,物理文件在 ~/.config/dconf/user(二进制)。命令行工具 dconf 和 gsettings 访问它。
dconf dump /导出用户数据库里显式保存的键值;它不等于所有有效设置,也不保证每个值都与 schema 默认不同dconf read /path/to/key读单个- GNOME 设置界面改的就是这个数据库
关键特性:它是运行时状态,不在 /nix/store,rebuild 保留但不进 git。
三层优先级#
一个 GSettings key 的值由三层决定(从低到高):
1. schema 默认值(包自带的 XML schema)
2. GSettings override(NixOS 生成的"系统默认",如壁纸、favorite-apps)
3. 用户 dconf 数据库值 ← 优先级最高含义 NixOS 的
extraGSettingsOverrides设的是第 2 层默认值——新机器 rebuild 后自动得到这些设置,但当前用户 dconf 里已有的值优先,不会被拉回。所以它是"持久化默认"而非"强制锁定"。
NixOS 侧的两个声明式接口#
services.desktopManager.gnome.extraGSettingsOverrides(NixOS 层,宽松默认)
services.desktopManager.gnome.extraGSettingsOverridePackages = [
pkgs.gsettings-desktop-schemas
pkgs.gnome-settings-daemon
];
services.desktopManager.gnome.extraGSettingsOverrides = ''
[org.gnome.desktop.interface]
show-battery-percentage=true
clock-show-weekday=true
[org.gnome.settings-daemon.plugins.color]
night-light-enabled=true
night-light-schedule-from=22.0
'';home-manager dconf.settings(home 层,activation 写回)
# home/theme.nix 的用法
dconf.settings = {
"org/gnome/desktop/interface" = {
color-scheme = "prefer-dark";
gtk-theme = "adw-gtk3-dark";
};
};两者的差别很关键
extraGSettingsOverrides:默认值,用户后续手动改不会被覆盖(宽松)- home-manager
dconf.settings:每次 Home Manager activation 时写入所声明的键,会把用户手动改的拉回声明值(激活时写回)可把需要 activation 写回的主题交给 Home Manager,把可由用户调整的默认偏好交给 extraGSettingsOverrides。Home Manager 写回不是持续锁定;用户之后仍可修改,下一次 activation 再重新应用。真正限制用户修改需使用 dconf 的系统 profile/locks 机制。
持久化方法论#
把用户手动改的设置变成声明式:
dconf dump / > user-settings.ini # 导出用户数据库显式保存的值- 筛选用户主动改的(主题/外设/行为偏好)
- 区分应用状态与稳定偏好:窗口尺寸通常不迁移;键盘布局、快捷键或应用网格布局是否迁移由使用目标决定,不应一律剔除
- 判断是否已有其他声明在管(如主题归 theme.nix)——不重复
- 用 gsettings 查对应 schema ID、键名与类型,把 dconf 路径分组转换成 schema 分组后写入
extraGSettingsOverrides(宽松默认);补上提供 schema 的 packages
优先级判断
- 外观/交互偏好 → extraGSettingsOverrides(默认,可重现)
- 希望每次 activation 写回 → Home Manager dconf.settings
- 真正限制用户修改 → dconf system profile/locks
- 应用内部状态 → 根据迁移目标判断,避免把频繁变化的运行状态全量塞入声明
关联#
- GNOME 声明式管理 — GNOME 模块层面
- NixOS 声明层与运行时层 — dconf 就是典型的运行时层
导出格式与生效检查#
dconf dump / 的 section 形如 [org/gnome/desktop/interface],是数据库路径;GSettings override 则使用 [org.gnome.desktop.interface],是 schema ID。一般 schema 可能采用不同路径或 relocatable schema,不能机械把所有斜杠替换成点。用 gsettings list-schemas、gsettings list-keys、gsettings describe 和 gsettings range 查明对应关系。
新默认被已有用户值遮盖时,可先备份,再用 gsettings reset <SCHEMA_ID> <KEY> 清除特定键的用户值。不要为让一个主题生效而重置整棵 dconf 数据库。构建完成后还需 activation/重新登录及 gsettings get 核对实际有效值。
参考与延伸
- Nixpkgs GNOME 模块 ↗
- Nixpkgs GNOME 文档 ↗
- GLib GSettings 与 vendor overrides ↗
- Home Manager dconf 模块 ↗
- GNOME dconf 默认值管理 ↗
根据技术笔记重新整理,示例使用通用名称。