Sollten dconf-editor und gsettings nicht auf dieselbe Datenbank zugreifen?

34

Dies ist eine im Grunde genommen 'akademische' Frage - um zu versuchen, die Innereien des Konfigurationssystems besser zu verstehen.

Ich verstehe, dass das dconf- System das neue Konfigurationssystem in gnome3 ist, das die (veraltete) gconf ersetzt hat . Dies geht ganz klar aus Gconf, Dconf, Gsettings und der Beziehung zwischen ihnen hervor .

Es schien mir, dass die Programme gsettingsund dconf-editorwo nur zwei verschiedene Möglichkeiten, auf die gleiche Dconf- Datenbank zuzugreifen , die in
Was ist Dconf, was ist ihre Funktion, und wie verwende ich es?

BEARBEITEN: Ich habe festgestellt, dass jemand dies als Unterschied in der Groß- und Kleinschreibung eines Schemanamens bemerkt hat . ; aber es scheint, dass die Unterschiede nicht darauf beschränkt sind. In einer der Antworten gibt es ein Beispiel für ein Missverhältnis, aber ich habe keine Erklärung dafür gefunden, warum .

Aber in letzter Zeit entdeckte ich , dass die Schlüssel zugänglich gsettingsund dconf-editorsind nicht gleich. Zum Beispiel Einstellungen für vinosind in dconf-editorunter org.gnome.desktop.remote-access(siehe Abbildung unten) , während in gsettings sie unter sind org.gnome.Vino. Gibt es eine Dokumentation, die den Unterschied erklärt?

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

und:

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

Aber im dconf-editor :

dconf-editor

Rmano
quelle

Antworten:

39
  • dconf-editorwird verwendet schema path, um den Einstellungsdatenbaum anzuzeigen. Dieselbe Struktur zum Speichern von Daten in der GVariant-Datenbank.

  • gsettings(von glib-2.0) dient schema idzum Anzeigen / Abrufen von Einstellungsdaten. Genauso wie jede andere Anwendung, die die GSetttings-API verwendet.

  • Es ist Sache des Anwendungsentwicklers, beide Einstellungen so vorzunehmen, wie er möchte. (mit einigen Einschränkungen für die kanonische Benennung). Das pathkönnte anders sein als, idaber die meisten Anwendungsentwickler ziehen es vor, identische Wortreihen / Kombinationen zu verwenden. Einige bewahren nicht die gleiche Großschreibung. Beispiel für ein Tracker-Projekt von Gnome

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

    Darüber hinaus haben einige alternative Anwendungen dieselben Einstellungen wie der Gnome-Desktop. Beispiel:input-sources


  • Erstens sollten sich Apps nicht damit anlegendconf

    Einführung von der dconf Projektseite:

    dconfist ein einfaches Konfigurationssystem. Der Hauptzweck ist die Bereitstellung eines Backends für GSettings auf Plattformen, auf denen noch keine Konfigurationsspeichersysteme vorhanden sind.

  • Wo werden die Daten gespeichert? (Referenz: https://wiki.gnome.org/Projects/dconf/SystemAdministrators )

    Ein Profil ist eine Liste von Konfigurationsdatenbanken. Wie es scheint, verwenden Gnome & Unity dasselbe Profil.

    $ cat /etc/dconf/profile/gdm
    user-db:user
    system-db:gdm
    
    1. user-db:user: Die erste Datenbank im Profil ist schreibgeschützt rwund wird im Basisverzeichnis des Benutzers erstellt.

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

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

      dconfkönnte zusätzlich zu GVariant Database einen Textstilspeicher aus db.d/*Ordner binden . Beispiel (Beachten Sie den Dateipfad, der Teil von ist 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
       ...
      
  • Schemadateien: Beziehung zwischen schema id&schema path ( *.gschema.xml)

    Was ist die Schema-XML-Datei im Ordner data / glib-2.0 meiner Quickly-Anwendung? by trent zeigt ein schönes Beispiel für die Verwendung der GSettings-API in einer Quickly-Anwendung und seine Schlussfolgerung basiert auf seinen Erfahrungen.

    Zurück zu Vino. Jede Anwendung, die GSsettings verwendet, sollte ihre Schemas definieren und diese speichern / installieren /usr/share/glib-2.0/schemas/(es ist ein glib-Verzeichnis):

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

    Wenn Sie bemerkt haben, wird das Schema mit einem idund einem definiert path. Der Name der Schemadatei folgt dem idWert.

    <schema id='org.gnome.Vino' path='/org/gnome/desktop/remote-access/'>
    
  • *.enums.xmlDateien sind für die benutzerdefinierte Aufzählungsdeklaration vorgesehen und können als neue Datentypen in *.gschema.xmlderselben verwendet werden 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'
    
  • Kompilieren von Schemas (Ref: Spielen mit dconf und gnome-tweak-tool )

    Im Rahmen des Installationsprozesses (es hat einen dpkg-Trigger) werden Schemas mit dem glib-compile-schemasTool (aus glib) kompiliert.

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

    *.gschema.xml wird zu einer Binärdatei kompiliert /usr/share/glib-2.0/schemas/gschemas.compiled

  • Vendor Override Files ( *.gschema.override)

    glib-compile-schemasLiest neben Schemadateien auch Vendor-Override- Dateien. Hierbei handelt es sich um Schlüsseldateien, die Standardwerte für Schlüssel in den Schemas überschreiben können (Ref man glib-compile-schemas. :) . Sie enthalten die Änderungen, die von der Ubuntu-Distribution vorgenommen wurden, um die Standardeinstellungen des Upstream-Schemas zu überschreiben.

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

    Beispiel für die Verwendung von Override-Dateien, siehe So passen Sie die Ubuntu Live-CD an (5. Anpassung 2: Hintergründe und Designs).

  • Dateien sperren

    Derzeit unterstützt dconf nur das Sperren pro Schlüssel, keine Unterpfadsperre. Benutzerdefinierte Werte werden weiterhin in gespeichert user-db, haben jedoch keine Auswirkungen auf Anwendungen. dconf / gsettings gibt stattdessen Standardwerte für diese gesperrten Schlüssel zurück. Sperrdateien werden in gespeichert db.d/locks/. Beispiel:

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

    Führen Sie folgende Schritte aus, um die Änderung der Sperren wirksam zu machen:

    sudo dconf update
    

    Ein gutes Schaufenster: dconf Einstellungen: Standardeinstellungen und Sperren

  • Globale Einstellungen ändern

    Die Standardeinstellung für gsettings/ dconf-editorist das Bearbeiten der user-db. system-dbSchreiben Sie zum Ändern eine neue Überschreibungsdatei und kompilieren Sie die Schemas neu.

    Ich konnte das nicht zum Laufen bringen:

    sudo su gdm -c 'gsettings ...'
    

    Weder die anderen Antworten, die Sie hier unter " Standardeinstellungen / Globale Gnome-Einstellungen festlegen" (Gnome 3) finden , beziehen sich auf eine ältere Version.

user.dz
quelle
1
@Rmano, ich hatte auch eine Neugierde mich darüber zu informieren. Vielen Dank.
user.dz
1
Könnten Sie bitte erläutern, wie Sie benutzerspezifische Einstellungen mit dconf definieren (z. B. muss ich einen Satz von Einstellungen für einen Benutzer bereitstellen (indem Sie die erforderlichen Dateien direkt nach dem Erstellen des Kontos in sein ~ / .config / dconf-Verzeichnis kopieren) und einen anderen für den zweiten Benutzer, wie?)? AFAIK, der "Text Style Store", wird nur für systemweite Einstellungen unterstützt, nicht wahr? Gibt es eine Möglichkeit, nur Benutzereinstellungen zu sichern (z. B. die in ~ / .config / dconf / user)? Ich kenne "dconf dump /", aber dies gilt für die gesamte Benutzerdatenbank, einschließlich der Systemstandards. Die Dokumentation ist äußerst unvollständig.
Anatoli
1
@ Anatoli, Ja, der Textspeicher funktioniert nur für systemweite Datenbanken. Eigentlich dconf dump /Dumps alle Benutzer geändert Einträge, es enthält keine Einträge nie geändert oder zurückgesetzt worden. (Zum Beispiel beinhaltet es, dass die Einträge geändert oder festgelegt wurden, auch wenn ihre Werte mit den Standardwerten übereinstimmen). Siehe askubuntu.com/q/420527/26246 . Ist auch nicht der gesamte DB, kann man den Pfad einstellen. Beispiel:dconf dump /com/
user.dz
1
@ user.dz, danke für die Klarstellung. Die einzige Möglichkeit, benutzerspezifische Einstellungen zu konfigurieren, besteht darin, die 'Benutzer'-GVDB-Binärdatei auf einem anderen sauberen Konto mit den erforderlichen Einstellungen zu erstellen und sie dann in den Ordner .config / dconf zu kopieren. AFAIK, es gibt keine Möglichkeit, dconf load / < fileohne Anmeldung als Benutzer zu verwenden.
Anatoli
1
@ Anatoli, Ja, so oder so. Möglicherweise ist es einfacher, andere Benutzereinstellungen zu ändern, ohne zu protokollieren, wann immer Sie sein Kennwort oder seine Root-Berechtigung benötigen (Sicherheitsregel). Dies sollte funktionieren sudo su username2 -c "dconf load / < file"
user.dz