这基本上是一个“学术”问题--试图更好地理解配置系统的内部结构。
我理解dconf系统是 gnome3 中的新配置系统,它取代了(已弃用的)配置文件;这很明显Gconf、Dconf、Gsettings 以及它们之间的关系。
在我看来,这些程序gsettings
和dconf-editor
其中只是两种不同的方法来访问相同的dconf数据库证实
什么是 dconf,它的作用是什么,如何使用它?
编辑:我发现有人注意到某些模式名称的大小写存在差异,请参见此处 ---dconf 模式名称区分大小写吗?; 但似乎差异并不仅限于此。在其中一个答案中有一个不匹配的例子,但我没有找到对为什么。
gsettings
但最近我发现从和可访问的键dconf-editor
并不相同。例如, 的设置vino
位于dconf-editor
下org.gnome.desktop.remote-access
(见下面的屏幕截图),而 gsettings 中的设置位于 下 org.gnome.Vino
。有文档可以解释这种差异吗?
在设定:
(0)samsung-romano:~/tmp/try% gsettings list-recursively org.gnome.Vino
org.gnome.Vino alternative-port uint16 5900
org.gnome.Vino authentication-methods ['none']
org.gnome.Vino disable-background false
[...]
和:
(0)samsung-romano:~/tmp/try% gsettings list-recursively org.gnome.desktop.remote-access
No such schema 'org.gnome.desktop.remote-access'
但在dconf-编辑器:
答案1
dconf-editor
用于schema path
显示设置数据树。与在 GVariant 数据库中存储数据的结构相同。gsettings
(来自 glib-2.0)用于schema id
显示/获取设置数据。与使用 GSetttings API 的任何其他应用程序一样。应用程序开发人员可以根据自己的喜好设置这两者。(对规范命名有一些限制)。因此
path
可能有所不同,id
但大多数应用程序开发人员更喜欢使用相同的单词系列/组合。有些不保留相同的大写字母。示例Gnome 的跟踪器项目<schema id="org.freedesktop.Tracker.Miner" path="/org/freedesktop/tracker/miner/" />
除此之外,一些替代应用程序共享属于 Gnome 桌面的相同设置。例如:
input-sources
第一的,应用程序不应该干扰
dconf
引言dconf项目页面:
dconf
是一个低级配置系统。其主要目的是为尚未拥有配置存储系统的平台上的 GSettings 提供后端。数据存储在哪里?(参考:https://wiki.gnome.org/Projects/dconf/SystemAdministrators)
配置文件是配置数据库的列表。Gnome 和 Unity 似乎使用相同的配置文件。
$ cat /etc/dconf/profile/gdm user-db:user system-db:gdm
user-db:user
:配置文件中的第一个数据库是读写的rw
,它在用户的主目录中创建。$ file ~/.config/dconf/user /home/sneetsher/.config/dconf/user: GVariant Database file, version 0
system-db:gdm
: 只读$ file /etc/dconf/db/gdm /etc/dconf/db/gdm: GVariant Database file, version 0
dconf
除了 GVariant 数据库之外,还可以从db.d/*
文件夹中绑定文本样式存储。示例(注意文件路径,因此它是 的一部分system-db:gdm
):$ cat /etc/dconf/db/gdm.d/00-upstream-settings # This file is part of the GDM packaging and should not be changed. # # Instead create your own file next to it with a higher numbered prefix, # and run # # dconf update # [org/gnome/desktop/a11y/keyboard] enable=true [org/gnome/desktop/background] show-desktop-icons=false ...
架构文件:
schema id
&之间的关系schema path
(*.gschema.xml
)我的 Quickly 应用程序的 data/glib-2.0 文件夹中的架构 XML 文件是什么?经过特伦特展示了在 Quickly 应用程序中使用 GSettings API 的一个很好的示例,以及他根据经验得出的结论。
回到 Vino。每个使用 GSsettings 的应用程序都应定义其架构,并应将其存储/安装在
/usr/share/glib-2.0/schemas/
(这是一个 glib 目录) 中:$ dpkg -L vino | grep -i glib-2.0 /usr/share/glib-2.0 /usr/share/glib-2.0/schemas /usr/share/glib-2.0/schemas/org.gnome.Vino.enums.xml /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml $ more /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml <schemalist> <schema id='org.gnome.Vino' path='/org/gnome/desktop/remote-access/'> <key name='enabled' type='b'> <summary>Enable remote access to the desktop</summary> <description> If true, allows remote access to the desktop via the RFB protocol. Users on remote machines may then connect to the desktop using a VNC viewer. </description> <default>false</default> </key> <key name='prompt-enabled' type='b'> <summary>Prompt the user before completing a connection</summary> <description> If true, remote users accessing the desktop are not allowed access until the user on the host machine approves the connection. Recommended especially when access is not password protected. </description> <default>true</default> </key> ...
如果您注意到,架构是用 和 定义的
id
。path
架构文件名跟在id
值后面。<schema id='org.gnome.Vino' path='/org/gnome/desktop/remote-access/'>
*.enums.xml
文件用于自定义枚举声明,用作*.gschema.xml
相同的新数据类型schema id
。$ cat /usr/share/glib-2.0/schemas/org.gnome.Vino.enums.xml <!-- Generated data (by glib-mkenums) --> <schemalist> <enum id='org.gnome.Vino.VinoIconVisibility'> <value nick='never' value='0'/> <value nick='always' value='1'/> <value nick='client' value='2'/> </enum> </schemalist> <!-- Generated data ends here --> $ gsettings range org.gnome.Vino icon-visibility enum 'never' 'always' 'client' $ gsettings get org.gnome.Vino icon-visibility 'client'
编译架构(参考:使用 dconf 和 gnome-tweak-tool)
作为安装过程的一部分(它有一个 dpkg 触发器),架构是使用
glib-compile-schemas
工具(来自 glib)进行编译的sudo glib-compile-schemas /usr/share/glib-2.0/schemas
*.gschema.xml
将被编译为二进制文件/usr/share/glib-2.0/schemas/gschemas.compiled
供应商覆盖文件(
*.gschema.override
)除了架构文件之外,还
glib-compile-schemas
可以读取供应商覆盖文件,这些是可以覆盖架构中键的默认值的关键文件(参考:man glib-compile-schemas
)。它们包含 Ubuntu 发行版为覆盖上游架构默认值而进行的更改。$ ls /usr/share/glib-2.0/schemas/*.gschema.override /usr/share/glib-2.0/schemas/10_compiz-gnome.gschema.override /usr/share/glib-2.0/schemas/10_desktop-base.gschema.override /usr/share/glib-2.0/schemas/10_evolution-common.gschema.override /usr/share/glib-2.0/schemas/10_gnome-settings-daemon.gschema.override /usr/share/glib-2.0/schemas/10_gnome-shell.gschema.override /usr/share/glib-2.0/schemas/10_gnome-system-log.gschema.override /usr/share/glib-2.0/schemas/10_gsettings-desktop-schemas.gschema.override /usr/share/glib-2.0/schemas/10_libgtk-3-common.gschema.override /usr/share/glib-2.0/schemas/10_ubuntu-settings.gschema.override /usr/share/glib-2.0/schemas/20_ubuntu-gnome-default-settings.gschema.override $ cat /usr/share/glib-2.0/schemas/10_gnome-settings-daemon.gschema.override [org.gnome.desktop.wm.keybindings] switch-input-source=['<Super>space'] switch-input-source-backward=['<Shift><Super>space']
覆盖文件使用示例,请参阅如何定制 Ubuntu Live CD?(5.定制2:背景和主题)。
锁定文件
目前,dconf 仅支持每个键锁定,不支持子路径锁定。用户定义的值仍将存储在 中,
user-db
但不会对应用程序产生影响。dconf/gsettings 将返回这些锁定键的默认值。锁定文件存储在 中db.d/locks/
。示例:$ cat /etc/dconf/db/gdm.d/locks/00-upstream-settings-locks /org/gnome/desktop/a11y/keyboard/enable /org/gnome/desktop/background/show-desktop-icons /org/gnome/desktop/lockdown/disable-application-handlers /org/gnome/desktop/lockdown/disable-command-line /org/gnome/desktop/lockdown/disable-lock-screen /org/gnome/desktop/lockdown/disable-log-out /org/gnome/desktop/lockdown/disable-printing /org/gnome/desktop/lockdown/disable-print-setup /org/gnome/desktop/lockdown/disable-save-to-disk /org/gnome/desktop/lockdown/disable-user-switching ...
修改锁后,需要运行以下命令才能生效:
sudo dconf update
一个很好的展示:dconf 设置:默认和锁定
更改全局设置
gsettings
/的默认设置dconf-editor
是编辑user-db
。要更改system-db
,请编写新的覆盖文件并重新编译架构。我无法让它工作:
sudo su gdm -c 'gsettings ...'
这里也没有其他答案设置默认/全局 Gnome 偏好设置(Gnome 3),可能那是一个旧版本。