Dconf-editor e gsettings non dovrebbero accedere allo stesso database?


34

Questa è una domanda fondamentalmente "accademica" --- per cercare di capire meglio le interiora del sistema di configurazione.

Comprendo che il sistema dconf è il nuovo sistema di configurazione in gnome3 che ha sostituito il (deprecato) gconf ; questo è abbastanza chiaro da Gconf, Dconf, Gsettings e dalla loro relazione .

Mi è sembrato che i programmi gsettingse dconf-editordove solo due modi diversi di accedere allo stesso database dconf , che è confermato in
Cos'è dconf, qual è la sua funzione e come lo uso?

EDIT: ho scoperto che qualcuno l'ha notato come differenza nel caso in un nome di schema, vedi qui --- I nomi di schema di dconf fanno distinzione tra maiuscole e minuscole? ; ma sembra che le differenze non siano limitate a questo. In una delle risposte c'è un esempio di mancata corrispondenza, ma non ho trovato una spiegazione del perché .

Ma ultimamente ho scoperto che le chiavi accessibili da gsettingse dconf-editornon sono le stesse. Ad esempio, le impostazioni per vinosono dconf-editorsotto org.gnome.desktop.remote-access(vedi screenshot sotto) mentre nelle impostazioni sono sotto org.gnome.Vino. C'è della documentazione che spiega la differenza?

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

e:

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

Ma in dconf-editor :

dconf-editore

Risposte:


39
  • dconf-editorutilizza schema pathper mostrare l'albero dei dati delle impostazioni. Stessa struttura utilizzata per archiviare i dati nel database GVariant.

  • gsettings(da glib-2.0) utilizza schema idper mostrare / ottenere i dati delle impostazioni. Allo stesso modo di qualsiasi altra applicazione che dovrebbe utilizzare l'API GSetttings.

  • Spetta allo sviluppatore dell'applicazione impostare entrambi come desidera. (con alcune restrizioni per la denominazione canonica). Quindi pathpotrebbe essere diverso da idma la maggior parte degli sviluppatori di applicazioni preferisce utilizzare identiche serie / combinazioni di parole. Alcuni non conservano la stessa capitalizzazione. Esempio di progetto Tracker di Gnome

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

    Inoltre, alcune applicazioni alternative condividono le stesse impostazioni che appartengono al desktop Gnome. Esempio:input-sources


  • Innanzitutto, le app non dovrebbero fare confusionedconf

    Introduzione dalla pagina del progetto dconf :

    dconfè un sistema di configurazione di basso livello. Il suo scopo principale è fornire un backend a GSettings su piattaforme che non dispongono già di sistemi di archiviazione della configurazione.

  • Dove sono archiviati i dati? (Rif: https://wiki.gnome.org/Projects/dconf/SystemAdministrators )

    Un profilo è un elenco di database di configurazione. Cosa sembra che Gnome & Unity utilizzino lo stesso profilo.

    $ cat /etc/dconf/profile/gdm
    user-db:user
    system-db:gdm
    
    1. user-db:user: Il primo database nel profilo è di lettura / scrittura rwe viene creato nella home directory dell'utente.

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

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

      dconfpotrebbe associare un archivio di stili di testo oltre al database GVariant dalla db.d/*cartella. Esempio (notare il percorso del file, quindi fa parte di 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
       ...
      
  • File di schema: relazione tra schema id&schema path ( *.gschema.xml)

    Qual è il file XML dello schema nella cartella data / glib-2.0 della mia applicazione Quickly? by Trento mostra un bell'esempio di utilizzo dell'API GSettings in un'applicazione Quickly e le sue conclusioni basate sulla sua esperienza.

    Ritorno a Vino. Ogni applicazione che utilizza GSsettings dovrebbe definire i suoi schemi e dovrebbe memorizzarli / installarli in /usr/share/glib-2.0/schemas/(è una directory 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>
    ...
    

    Se hai notato, lo schema è definito con un ide un path. Il nome del file dello schema segue il idvalore.

    <schema id='org.gnome.Vino' path='/org/gnome/desktop/remote-access/'>
    
  • *.enums.xmli file servono per la dichiarazione di enumerazione personalizzata, da utilizzare come nuovi tipi di dati *.gschema.xmlcon lo stesso 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'
    
  • Schema di compilazione (Rif: giocare con dconf e gnome-tweak-tool )

    Come parte del processo di installazione (ha un trigger dpkg), gli schemi sono compilati con lo glib-compile-schemasstrumento (da glib)

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

    *.gschema.xml sarà compilato in un file binario /usr/share/glib-2.0/schemas/gschemas.compiled

  • Vendor Override Files ( *.gschema.override)

    Oltre ai file di schema, glib-compile-schemaslegge i file di sostituzione del fornitore , che sono file di chiavi che possono sovrascrivere i valori predefiniti per le chiavi negli schemi (Rif man glib-compile-schemas. :) . Contengono le modifiche apportate dalla distribuzione Ubuntu per sovrascrivere le impostazioni predefinite dello schema a monte.

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

    Esempio di utilizzo dei file di sostituzione, vedi Come personalizzare il Live CD di Ubuntu? (5. Personalizzazione 2: sfondi e temi).

  • Blocca i file

    Attualmente, dconf supporta solo il blocco per chiave, nessun blocco del percorso secondario. I valori definiti dall'utente verranno comunque archiviati user-dbma non avranno alcun effetto sulle applicazioni. dconf / gsettings restituisce valori predefiniti invece per quelle chiavi bloccate. I file di blocco sono memorizzati in db.d/locks/. Esempio:

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

    Dopo la modifica dei blocchi, per essere efficace eseguire:

    sudo dconf update
    

    Una buona vetrina: Impostazioni dconf: impostazioni predefinite e blocchi

  • Modifica delle impostazioni globali

    L'impostazione predefinita per gsettings/ dconf-editorè modificare il file user-db. Per modificare system-db, scrivere un nuovo file di override e ricompilare gli schemi.

    Non sono riuscito a farlo funzionare:

    sudo su gdm -c 'gsettings ...'
    

    né le altre risposte qui Imposta preferenze predefinite / globali di Gnome (Gnome 3) , potrebbe essere che fosse per una vecchia versione.


1
@Rmano, anch'io ho avuto una curiosità per conoscerlo. Grazie mille.
user.dz,

1
Potresti spiegare come definire le impostazioni specifiche dell'utente usando dconf (ad esempio, devo distribuire un set di impostazioni per un utente (copiando i file necessari nella sua directory ~ / .config / dconf subito dopo aver creato l'account) e un altro per il secondo utente, come?)? AFAIK, il "negozio di stili di testo" è supportato solo per le impostazioni di sistema, no? Esiste un modo per scaricare solo le impostazioni utente (ad esempio quelle in ~ / .config / dconf / user)? Conosco "dconf dump /", ma questo è per l'intero DB utente, inclusi i valori predefiniti del sistema. La documentazione è estremamente incompleta.
Anatoli

1
@Anatoli, Sì, l'archivio di testo funziona solo per database a livello di sistema. dconf dump /Scarica effettivamente tutte le voci modificate dall'utente, non include voci mai modificate o ripristinate. (ad esempio, include le voci sono state modificate o impostate anche i loro valori sono gli stessi di default). Vedi askubuntu.com/q/420527/26246 . Inoltre non è l'intero DB, è possibile impostare il percorso. es:dconf dump /com/
user.dz

1
@ user.dz, grazie per il chiarimento. Quindi l'unico modo per configurare le impostazioni specifiche dell'utente è creare il file binario GVDB "utente" su un altro account pulito con le impostazioni necessarie e quindi copiarlo nella cartella .config / dconf? AFAIK, non c'è modo di usare dconf load / < filesenza accedere come utente.
Anatoli,

1
@Anatoli, Sì in un modo. Potrebbe essere il modo più semplice per modificare altre impostazioni utente senza registrare la tua password o il potere di root (regola di sicurezza). Questo dovrebbe funzionare sudo su username2 -c "dconf load / < file"
user.dz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.