Czy edytor dconf i gsettings nie powinni uzyskiwać dostępu do tej samej bazy danych?

34

Jest to w zasadzie pytanie „akademickie” - aby lepiej zrozumieć wewnętrzne elementy systemu konfiguracji.

Rozumiem, że system dconf to nowy system konfiguracji w gnome3, który zastąpił (przestarzały) gconf ; jest to całkiem jasne z Gconf, Dconf, Gsettings i relacji między nimi .

Wydawało mi się, że programy gsettingsi dconf-editorgdzie tylko dwa różne sposoby dostępu do tej samej bazy danych dconf , co jest potwierdzone w
Czym jest dconf, jaka jest jego funkcja i jak go używać?

EDYCJA: Odkryłem, że ktoś zauważył różnicę wielkości liter w nazwie jakiegoś schematu, patrz tutaj --- Czy w nazwach schematów dconf rozróżniana jest wielkość liter? ; ale wydaje się, że różnice nie są do tego ograniczone. W jednej z odpowiedzi znajduje się przykład niedopasowania, ale nie znalazłem wyjaśnienia, dlaczego .

Ale ostatnio odkryłem, że klucze dostępne gsettingsi dconf-editornie są takie same. Na przykład ustawienia dla vinodconf-editorponiżej org.gnome.desktop.remote-access(patrz zrzut ekranu poniżej), podczas gdy w ustawieniach są poniżej org.gnome.Vino. Czy jest jakaś dokumentacja wyjaśniająca różnicę?

W ustawieniach :

(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
[...]

i:

(0)samsung-romano:~/tmp/try% gsettings list-recursively org.gnome.desktop.remote-access
No such schema 'org.gnome.desktop.remote-access'

Ale w edytorze dconf :

edytor dconf

Rmano
źródło

Odpowiedzi:

39
  • dconf-editorsłuży schema pathdo wyświetlania drzewa danych ustawień. Taka sama struktura, jak w przypadku przechowywania danych w bazie danych GVariant.

  • gsettings(z glib-2.0) używa schema iddo wyświetlania / pobierania danych ustawień. Tak samo jak każda inna aplikacja, która korzysta z interfejsu API GSetttings.

  • Twórca aplikacji musi ustawić obie opcje tak, jak tego chce. (z pewnym ograniczeniem nazewnictwa kanonicznego). Więc pathmoże być inna niż idale większość programiści wolą używać identycznych serii Word / kombinację. Niektóre nie zachowują tej samej wielkości liter. Przykładowy projekt Tracker firmy Gnome

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

    Ponadto niektóre alternatywne aplikacje mają te same ustawienia, które należą do pulpitu Gnome. Przykład:input-sources


  • Po pierwsze, aplikacje nie powinny zadzieraćdconf

    Wprowadzenie ze strony projektu dconf :

    dconfto system konfiguracji niskiego poziomu. Jego głównym celem jest zapewnienie zaplecza GSettings na platformach, które nie mają jeszcze systemów pamięci konfiguracji.

  • Gdzie są przechowywane dane? (Patrz: https://wiki.gnome.org/Projects/dconf/SystemAdministrators )

    Profil to lista baz danych konfiguracji. Wygląda na to, że Gnome & Unity używa tego samego profilu.

    $ cat /etc/dconf/profile/gdm
    user-db:user
    system-db:gdm
    
    1. user-db:user: Pierwsza baza danych w profilu jest do odczytu i zapisu rwi jest tworzona w katalogu osobistym użytkownika.

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

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

      dconfmoże powiązać magazyn stylów tekstowych oprócz GVariant Database z db.d/*folderu. Przykład (ścieżka pliku powiadomienia, więc jest to część 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
       ...
      
  • Pliki schematu: Relacja między schema id&schema path ( *.gschema.xml)

    Co to jest plik XML schematu w folderze data / glib-2.0 mojej aplikacji Quickly? przez trent pokazuje dobry przykład użycia GSettings API w aplikacji Quickly, a jego wnioski oparte są na jego doświadczeniu.

    Powrót do Vino. Każda aplikacja korzystająca z GSsettings powinna zdefiniować swoje schematy i przechowywać je / instalować w /usr/share/glib-2.0/schemas/(Jest to katalog 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>
    ...
    

    Jeśli zauważyłeś, schemat jest zdefiniowany za pomocą ida oraz a path. Nazwa pliku schematu jest zgodna z idwartością.

    <schema id='org.gnome.Vino' path='/org/gnome/desktop/remote-access/'>
    
  • *.enums.xmlpliki służą do deklaracji niestandardowego wyliczenia, które mają być używane jako nowe typy danych w *.gschema.xmltym samym 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'
    
  • Kompilowanie schematu ( zob . : Gra z dconf i gnome-tweak-tool )

    W ramach procesu instalacji (ma wyzwalacz dpkg), schematy są kompilowane za pomocą glib-compile-schemasnarzędzia (z glib)

    sudo glib-compile-schemas /usr/share/glib-2.0/schemas
    

    *.gschema.xml zostanie skompilowany do pliku binarnego /usr/share/glib-2.0/schemas/gschemas.compiled

  • Pliki zastępowania dostawcy ( *.gschema.override)

    Oprócz plików schematów glib-compile-schemasodczytuje pliki zastępowania dostawcy , które są plikami kluczy, które mogą przesłonić domyślne wartości kluczy w schematach (patrz:) man glib-compile-schemas. Zawierają zmiany wprowadzone przez dystrybucję Ubuntu w celu zastąpienia domyślnych schematów nadrzędnych.

    $ 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']
    

    Przykład zastosowania zastępowania plików, zobacz Jak dostosować Live CD Ubuntu? (5. Dostosowanie 2: Tła i motywy).

  • Zablokuj pliki

    Obecnie dconf obsługuje tylko blokowanie według klucza, bez blokady podścieżki. Wartości zdefiniowane przez użytkownika będą nadal przechowywane, user-dbale nie będą miały wpływu na aplikacje. dconf / gsettings zwraca zamiast tego wartości domyślne dla zablokowanych kluczy. Zablokuj pliki są przechowywane w db.d/locks/. Przykład:

    $ 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
    ...
    

    Po modyfikacji blokad, aby uruchomić skutecznie:

    sudo dconf update
    

    Dobra prezentacja: dconf Ustawienia: ustawienia domyślne i blokady

  • Zmiana ustawień globalnych

    Domyślną opcją gsettings/ dconf-editorjest edycja user-db. Aby to zmienić system-db, napisz nowy plik zastępowania i ponownie skompiluj schemat.

    Nie mogłem tego uruchomić:

    sudo su gdm -c 'gsettings ...'
    

    żadne inne odpowiedzi tutaj Ustaw domyślne / globalne preferencje gnome (Gnome 3) , może być tak, jak w starej wersji.

user.dz
źródło
1
@Rmano, miałem ciekawość, żeby się o tym dowiedzieć. Dziękuję bardzo.
user.dz
1
Czy mógłbyś wyjaśnić, jak zdefiniować ustawienia specyficzne dla użytkownika za pomocą dconf (powiedzmy, że muszę wdrożyć jeden zestaw ustawień dla jednego użytkownika (kopiowanie niezbędnych plików do jego / jej ~ / .config / dconf katalog zaraz po utworzeniu konta) i innego dla drugiego użytkownika, jak?)? AFAIK, „sklep w stylu tekstowym” jest obsługiwany tylko dla ustawień systemowych, prawda? Czy jest jakiś sposób na zrzucenie tylko ustawień użytkownika (np. Tych w ~ / .config / dconf / user)? Wiem o „dconf dump /”, ale dotyczy to całej bazy danych użytkownika, w tym ustawień domyślnych systemu. Dokumentacja jest wyjątkowo niekompletna.
Anatoli
1
@Anatoli, tak, sklep tekstowy działa tylko dla systemowej bazy danych. Właściwie dconf dump /zrzuca wszystkie zmienione przez użytkownika wpisy, nie zawiera wpisy nigdy zmieniane lub zostały zresetowane. (na przykład zawiera wpisy zostały zmienione lub ustawione, nawet ich wartości są takie same jak domyślne). Zobacz askubuntu.com/q/420527/26246 . Również nie jest cała baza danych, możesz ustawić ścieżkę. np .:dconf dump /com/
user.dz
1
@ user.dz, dziękuję za wyjaśnienie. Tak więc jedynym sposobem na skonfigurowanie ustawień użytkownika jest utworzenie pliku binarnego GVDB „user” na innym czystym koncie z niezbędnymi ustawieniami, a następnie skopiowanie go do folderu .config / dconf? AFAIK, nie ma możliwości korzystania dconf load / < filebez zalogowania się jako użytkownik.
Anatoli
1
@Anatoli, Tak, w jedną stronę. Może być łatwiejszym sposobem zmiany ustawień innych użytkowników bez konieczności logowania się, gdy tylko potrzebujesz hasła lub uprawnień roota (reguła bezpieczeństwa). To powinno działać sudo su username2 -c "dconf load / < file"
user.dz