Разве dconf-editor и gsettings не должны обращаться к одной и той же базе данных?

Разве dconf-editor и gsettings не должны обращаться к одной и той же базе данных?

Это в основном «академический» вопрос — чтобы попытаться лучше понять внутренности системы конфигурации.

Я понимаю, чтоdconfsystem — это новая система конфигурации в gnome3, которая заменила (устаревшую)gconf; это совершенно ясно изGconf, Dconf, Gsettings и связь между ними.

Мне показалось, что программы gsettingsи dconf-editorгде просто два разных способа доступа к одному и тому жеdconfбаза данных, которая подтверждена в
Что такое dconf, каковы его функции и как его использовать?

EDIT: Я обнаружил, что кто-то заметил это как разницу в регистре в имени какой-то схемы, см. здесь ---Чувствительны ли к регистру имена схем dconf?; но, похоже, этим различия не ограничиваются. В одном из ответов есть пример несоответствия, но я не нашел объясненияпочему.

Но недавно я обнаружил, что клавиши, доступные из gsettingsи , dconf-editorне одинаковы. Например, настройки для vinoнаходятся в dconf-editorпод org.gnome.desktop.remote-access(см. скриншот ниже), а в 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-редактор:

dconf-редактор

решение1

  • dconf-editorиспользует schema pathдля отображения дерева данных настроек. Та же структура используется для хранения данных в базе данных GVariant.

  • gsettings(из glib-2.0) использует schema idдля показа/получения данных настроек. Точно так же, как и любое другое приложение, использующее API GSetttings.

  • Разработчик приложения может установить оба варианта по своему усмотрению (с некоторыми ограничениями для канонического наименования). Так что 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
    
    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можно связать хранилище стилей текста в дополнение к базе данных 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)

    Что представляет собой XML-файл схемы в папке data/glib-2.0 моего приложения Quickly?кТрентдемонстрирует хороший пример использования API GSettings в приложении Quickly и делает вывод, основанный на собственном опыте.

    Вернемся к 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), возможно, это было для старого релиза.

Связанный контент