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

34

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

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

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

РЕДАКТИРОВАТЬ: я обнаружил, что кто-то заметил это как различие в регистре в некотором имени схемы, см. Здесь --- Являются ли имена схемы dconf с учетом регистра? ; но похоже, что различия не ограничиваются этим. В одном из ответов есть пример несоответствия, но я не нашел объяснения, почему .

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

dconf-редактор

Rmano
источник

Ответы:

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

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

  • Это зависит от разработчика приложения, чтобы установить оба, как он / она хотел бы. (с некоторыми ограничениями для канонического именования). Так что pathможет отличаться, idно большинство разработчиков приложений предпочитают использовать идентичные серии слов / комбинации. Некоторые не сохраняют одинаковую капитализацию. Пример проекта Tracker из 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? по Trent показывает хороший пример использования GSettings API в приложении быстро, и его вывод на основе своего опыта.

    Вернуться к Вино. Каждое приложение, которое использует 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читает файлы переопределения поставщика , которые являются файлами ключей, которые могут переопределять значения по умолчанию для ключей в схемах (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']
    

    Пример использования файлов переопределения, смотрите Как настроить 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)» , возможно, был для старой версии.

user.dz
источник
1
@Rmano, мне тоже было любопытно узнать об этом. Большое спасибо.
user.dz
1
Не могли бы вы объяснить, как определить пользовательские настройки с помощью dconf (скажем, мне нужно развернуть один набор настроек для одного пользователя (копирование необходимых файлов в его / ее ~ / .config / dconf dir сразу после создания учетной записи) и другое для второго пользователя как?)? AFAIK, «хранилище стилей текста» поддерживается только для общесистемных настроек, не так ли? Есть ли способ сбросить только пользовательские настройки (например, в ~ / .config / dconf / user)? Я знаю о "dconf dump /", но это для всей пользовательской БД, включая системные значения по умолчанию. Документация крайне неполная.
Анатолий
1
@Anatoli, да, текстовое хранилище работает только для общесистемной базы данных. Фактически dconf dump /создает дамп всех записей, измененных пользователем, он не включает записи, которые никогда не изменялись или были сброшены. (например, он включает записи, которые были изменены или установлены, даже если их значения такие же, как по умолчанию). См. Askubuntu.com/q/420527/26246 . Также не вся БД, вы можете установить путь. например:dconf dump /com/
user.dz
1
@ user.dz, спасибо за разъяснения. Таким образом, единственный способ настроить пользовательские параметры - создать двоичный файл GVDB «user» в другой чистой учетной записи с необходимыми настройками, а затем скопировать его в папку .config / dconf? AFAIK, нет способа использовать dconf load / < fileбез входа в систему как пользователь.
Анатолий
1
@Anatoli, да, это один из способов. Это может быть более простой способ изменить другие настройки пользователя, не регистрируя, когда вам понадобится пароль или полномочия root (правило безопасности). Это должно работать sudo su username2 -c "dconf load / < file"
user.dz