dconf-editor和gsettings不应该访问同一数据库吗?


34

这是一个基本的“学术性”问题---试图更好地了解配置系统的内部情况。

我知道dconf系统是gnome3中的新配置系统,它已经替换了(不建议使用的)gconf;从Gconf,Dconf,Gsettings及其之间的关系可以很清楚地看出这一点。

在我看来,程序gsettingsdconf-editor访问同一dconf数据库的只是两种不同的方式,在什么是dconf,其功能是什么以及如何使用它中得到了证实

编辑:我发现有人注意到它是某些模式名称中大小写的差异,请参阅--- dconf模式名称是否区分大小写?; 但似乎差异不限于此。在一个答案中,有一个不匹配的例子,但是我没有找到为什么的解释。

但后来我发现,从访问的按键gsettingsdconf-editor是不一样的。例如,gsettings的设置vino位于dconf-editororg.gnome.desktop.remote-access(请参见下面的屏幕截图) 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-editor中

dconf编辑器

Answers:


39
  • dconf-editor用于schema path显示设置数据树。用于在GVariant数据库中存储数据的结构相同。

  • gsettings(来自glib-2.0)用于schema id显示/获取设置数据。与使用GSetttings API的任何其他应用程序一样。

  • 应用程序开发人员可以根据自己的意愿进行设置。(对规范命名有一些限制)。因此path可能有所不同,id但大多数应用程序开发人员更喜欢使用相同的单词系列/组合。有些不保留相同的大小写。Gnome的Tracker项目示例

    <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
    
    1. user-db:user:配置文件中的第一个数据库是可读写的,rw并在用户的主目录中创建。

      $ file ~/.config/dconf/user
      /home/sneetsher/.config/dconf/user: GVariant Database file, version 0
      
    2. system-db:gdm: 只读

      $ file /etc/dconf/db/gdm
      /etc/dconf/db/gdm: GVariant Database file, version 0
      

      dconf可以从db.d/*文件夹中绑定GVariant数据库和文本样式存储。示例(注意文件路径,它是的一部分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 idschema path*.gschema.xml之间的关系

    Quickly应用程序的data / glib-2.0文件夹中的模式XML文件是什么?通过特伦特显示了快速的应用程序使用API GSettings一个很好的例子,他的结论基于他的经验。

    回到维诺。每个使用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与same 一起用作新数据类型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)的其他答案都可能不是针对旧版本的。


1
@Rmano,我也很想知道它。非常感谢。
user.dz 2014年

1
您能否解释一下如何使用dconf定义特定于用户的设置(例如,我需要为一个用户部署一组设置(在创建帐户后将必要的文件复制到他/她的〜/ .config / dconf目录中)和另一个对于第二个用户,如何?)?AFAIK,“文本样式存储”仅适用于系统范围的设置,不是吗?有什么方法可以只转储用户设置(例如〜/ .config / dconf / user中的用户设置)?我知道“ dconf dump /”,但这适用于整个用户数据库,包括系统默认值。该文档非常不完整。
Anatoli

1
@Anatoli,是的,文本存储仅适用于系统范围的数据库。实际上dconf dump /转储所有用户更改的条目,它不包括从未更改或已重置的条目。(例如,它包括已更改或设置的条目,甚至其值与默认值相同)。参见askubuntu.com/q/420527/26246。也不是整个DB,可以设置路径。例如:dconf dump /com/
user.dz

1
@ user.dz,感谢您的澄清。因此,配置用户特定设置的唯一方法是在另一个具有必要设置的干净帐户上创建“用户” GVDB二进制文件,然后将其复制到.config / dconf文件夹?AFAIK,没有以dconf load / < file用户身份登录就无法使用的方法。
Anatoli

1
@Anatoli,是的。可能是更改其他用户设置的简便方法,而无需记录您需要多大的密码或超级用户权限(安全规则)。这应该可以工作 sudo su username2 -c "dconf load / < file"
user.dz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.