OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 077

管理 GSettings 默认值与 dconf 状态

分清 schema 默认、vendor override 和用户数据库,选择合适的声明接口。

所在专题NixOS 上的 GNOME 声明式桌面 ↗
约 7 分钟阅读开始阅读

核验范围: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   # 导出用户数据库显式保存的值
  1. 筛选用户主动改的(主题/外设/行为偏好)
  2. 区分应用状态与稳定偏好:窗口尺寸通常不迁移;键盘布局、快捷键或应用网格布局是否迁移由使用目标决定,不应一律剔除
  3. 判断是否已有其他声明在管(如主题归 theme.nix)——不重复
  4. 用 gsettings 查对应 schema ID、键名与类型,把 dconf 路径分组转换成 schema 分组后写入 extraGSettingsOverrides(宽松默认);补上提供 schema 的 packages

优先级判断

  • 外观/交互偏好 → extraGSettingsOverrides(默认,可重现)
  • 希望每次 activation 写回 → Home Manager dconf.settings
  • 真正限制用户修改 → dconf system profile/locks
  • 应用内部状态 → 根据迁移目标判断,避免把频繁变化的运行状态全量塞入声明

关联#

导出格式与生效检查#

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 核对实际有效值。

参考与延伸

  1. Nixpkgs GNOME 模块 ↗
  2. Nixpkgs GNOME 文档 ↗
  3. GLib GSettings 与 vendor overrides ↗
  4. Home Manager dconf 模块 ↗
  5. GNOME dconf 默认值管理 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

NixOS 上的 GNOME 声明式桌面

  1. 01GNOME 的声明式桌面管理
  2. 02GNOME 模块选项参考
  3. 03管理 GSettings 默认值与 dconf 状态
  4. 04从设置 diff 到声明与扩展
  5. 05用 Specialisation 构建 GNOME 变体
  6. 06Wayland 会话中的 kmscon 与 uwsm
CONTINUE READING / 下一篇从设置 diff 到声明与扩展

导出差异、核对 schema 键和类型,再声明软件包与扩展启用列表。