当前位置: 首页>>技术问答>>正文


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

, , , , ,

问题描述

这基本上是’academic’问题—试图更好地了解配置系统内部。

据我所知,dconf系统是gnome3中的新配置系统,它取代了(不推荐的)gconf;从Gconf,Dconf,Gsettings以及它们之间的关系可以清楚地看出这一点。

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

编辑:我发现有人注意到它在某些模式名称中的区别,请参见此处— Are dconf schema names case-sensitive?;但似乎差异不仅限于此。在其中一个答案中有一个不匹配的例子,但我没有找到原因的解释。

但最近我发现可从gsettingsdconf-editor访问的密钥不一样。例如,vino的设置在org.gnome.desktop.remote-access下的dconf-editor中(见下面的截图),而在gsettings中它们在org.gnome.Vino下。有一些文件可以解释这种差异吗?

在gsettings:

(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中:

unity,gnome,system-settings,dconf,gsettings,ubuntu

最佳解决办法

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

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

  • 由应用程序开发人员根据他/她的意愿设置它们。 (对规范命名有一些限制)。因此path可能与id不同,但大多数应用程序开发人员更喜欢使用相同的单词系列/组合。有些人不保留相同的大写字母。示例Tracker project from Gnome

    <schema id="org.freedesktop.Tracker.Miner" path="/org/freedesktop/tracker/miner/" />
    

    除此之外,一些替代应用程序共享属于Gnome桌面的相同设置。示例:input-sources


  • 首先,应用程序不应该混淆dconf来自dconf项目页面的介绍:dconf是一个low-level配置系统。其主要目的是在尚未配置存储系统的平台上为GSettings提供后端。

  • 数据存储在哪里? (Ref:https://wiki.gnome.org/Projects/dconf/SystemAdministrators)配置文件是配置数据库的列表。 Gnome& amp; Unity使用相同的配置文件$ cat /etc/dconf/profile/gdm
    user-db:user
    system-db:gdm

    1. user-db:user:配置文件中的第一个数据库是read-write rw,它在用户的主目录中创建。

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

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

      除了来自db.d/*文件夹的GVariant数据库之外,dconf还可以绑定文本样式存储。示例(注意文件路径,因此它是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)

    What is the schema XML file in the data/glib-2.0 folder of my Quickly application?trent显示了在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>
    ...
    

    如果您注意到,架构是使用idpath定义的。模式文件名遵循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'
    
  • 编译模式(参考:Playing with dconf and 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还读取供应商覆盖文件,这些文件是可以覆盖模式中密钥的默认值的关键文件(Ref: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']
    

    使用覆盖文件的示例,请参阅How to customize the Ubuntu Live CD?(5.自定义2:背景和主题)。

  • 锁定文件

    目前,dconf仅支持per-key锁定,没有sub-path锁定。用户定义的值仍将存储在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 Settings: defaults and locks

  • 更改全局设置

    gsettings /dconf-editor的默认设置是编辑user-db。要更改system-db,请编写新的覆盖文件并重新编译模式。

    我无法让这个工作:

    sudo su gdm -c 'gsettings ...'
    

    这里的其他答案Set Default/Global Gnome Preferences (Gnome 3),可能都是旧的版本。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/7194.html,未经允许,请勿转载。