Чи не повинні редактор dconf та gsettings отримувати доступ до однієї бази даних?


34

Це в основному "академічне" питання --- щоб спробувати краще зрозуміти внутрішню систему конфігурації.

Я розумію, що система dconf - це нова система конфігурації в gnome3, яка замінила (застарілий) gconf ; це цілком зрозуміло з Gconf, Dconf, Gsettings та взаємозв'язків між ними .

Мені здалося, що програми gsettingsта dconf-editorде лише два різні способи доступу до тієї самої бази даних dconf , яка підтверджується в
Що таке dconf, яка її функція та як я ним користуюся?

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

Але останнім часом я виявив, що ключі доступні gsettingsі dconf-editorне є однаковими. Наприклад, параметри vinoзнаходяться в dconf-editorUnder 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-редакторі :

dconf-редактор

Відповіді:


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

  • gsettings(від glib-2.0) використовує schema idдля показу / отримання даних про налаштування. Так само, як і будь-яка інша програма, яка використовує API GSetttings.

  • Розробник додатків залежить від того, як він / вона хотів. (з деяким обмеженням для канонічного іменування). Так 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 мого швидкого додатка? by trent показує хороший приклад використання API GSettings у швидкому застосуванні та його висновок на основі свого досвіду.

    Назад до 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>
    ...
    

    Якщо ви помітили, схема визначається за допомогою ida і a 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) , можливо, це було для старого випуску.


1
@Rmano, у мене теж було цікаво, щоб дізнатися про це. Дуже дякую.
user.dz

1
Поясніть, будь ласка, як визначити налаштування для користувача за допомогою dconf (скажімо, мені потрібно розгорнути один набір налаштувань для одного користувача (копіювання необхідних файлів до його / її ~ / .config / dconf dir відразу після створення облікового запису) та іншого для другого користувача, як?)? AFAIK, "магазин стилів тексту" підтримується лише для системних налаштувань, чи не так? Чи є спосіб скинути лише налаштування користувача (наприклад, у ~ / .config / dconf / user)? Я знаю про "dconf dump /", але це для всієї БД користувача, включаючи системні параметри за замовчуванням. Документація надзвичайно неповна.
Анатолій

1
@Anatoli, Так, текстовий магазин працює лише для загальносистемних баз даних. Фактично dconf dump /скидає всі змінені користувачем записи, вона не включає записи, які ніколи не змінювались та не були скинуті. (наприклад, вона включає записи, які були змінені або встановлені, навіть їх значення такі ж, як і за замовчуванням). Див. Askubuntu.com/q/420527/26246 . Також не вся БД, ви можете встановити шлях. ex: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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.