¿No deberían dconf-editor y gsettings acceder a la misma base de datos?

34

Esta es una pregunta básicamente "académica": tratar de comprender mejor el sistema de configuración de las entrañas.

Entiendo que el sistema dconf es el nuevo sistema de configuración en gnome3 que ha reemplazado al (obsoleto) gconf ; Esto es bastante claro por Gconf, Dconf, Gsettings y la relación entre ellos .

Me pareció que los programas gsettingsy dconf-editorlas dos formas diferentes de acceder a la misma base de datos dconf , que se corrobora en
¿Qué es dconf, cuál es su función y cómo lo uso?

EDITAR: descubrí que alguien lo notó como una diferencia en el caso de algún nombre de esquema, vea aquí --- ¿Los nombres de esquema dconf distinguen entre mayúsculas y minúsculas? ; pero parece que las diferencias no se limitan a eso. En una de las respuestas hay un ejemplo de desajuste, pero no encontré una explicación de por qué .

Pero últimamente descubrí que las claves accesibles desde gsettingsy dconf-editorno son las mismas. Por ejemplo, las configuraciones para vinoestán dconf-editordebajo org.gnome.desktop.remote-access(vea la captura de pantalla a continuación) mientras que en gsettings están debajo org.gnome.Vino. ¿Hay alguna documentación que explique la diferencia?

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

y:

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

Pero en dconf-editor :

dconf-editor

Rmano
fuente

Respuestas:

39
  • dconf-editorutiliza schema pathpara mostrar la configuración del árbol de datos. La misma estructura utilizada para almacenar datos en la base de datos GVariant.

  • gsettings(de glib-2.0) utiliza schema idpara mostrar / obtener datos de configuración. De la misma manera que cualquier otra aplicación debe hacer que use la API GSetttings.

  • Depende del desarrollador de la aplicación establecer ambas cosas como le gustaría. (con alguna restricción para los nombres canónicos). Por pathlo tanto, podría ser diferente, idpero la mayoría de los desarrolladores de aplicaciones prefieren usar series / combinaciones de palabras idénticas. Algunos no conservan la misma capitalización. Proyecto de ejemplo de seguimiento de Gnome

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

    Además de eso, algunas aplicaciones alternativas comparten la misma configuración que pertenece al escritorio de Gnome. Ejemplo:input-sources


  • Primero, las aplicaciones no deberían meterse condconf

    Introducción desde la página del proyecto dconf :

    dconfEs un sistema de configuración de bajo nivel. Su objetivo principal es proporcionar un back-end a GSettings en plataformas que aún no tienen sistemas de almacenamiento de configuración.

  • ¿Dónde se almacenan los datos? (Ref: https://wiki.gnome.org/Projects/dconf/SystemAdministrators )

    Un perfil es una lista de bases de datos de configuración. Lo que parece que Gnome y Unity usan el mismo perfil.

    $ cat /etc/dconf/profile/gdm
    user-db:user
    system-db:gdm
    
    1. user-db:user: La primera base de datos en el perfil es lectura-escritura rwy se crea en el directorio de inicio del usuario.

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

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

      dconfpodría enlazar una tienda de estilo de texto además de la base de datos GVariant desde la db.d/*carpeta. Ejemplo (observe la ruta del archivo, por lo que es parte de 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
       ...
      
  • Archivos de esquema: relación entre schema id&schema path ( *.gschema.xml)

    ¿Cuál es el archivo XML de esquema en la carpeta data / glib-2.0 de mi aplicación Quickly? by trent muestra un buen ejemplo del uso de GSettings API en una aplicación Quickly, y su conclusión se basa en su experiencia.

    De vuelta al vino. Cada aplicación que usa GSsettings debe definir sus esquemas y debe almacenarlos / instalarlos en /usr/share/glib-2.0/schemas/(Es un directorio 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>
    ...
    

    Si se dio cuenta, el esquema se define con an idy a path. El nombre del archivo de esquema sigue al idvalor.

    <schema id='org.gnome.Vino' path='/org/gnome/desktop/remote-access/'>
    
  • *.enums.xmlLos archivos son para la declaración de enumeración personalizada, para ser utilizados como nuevos tipos de datos *.gschema.xmlcon el mismo 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'
    
  • Compilación de esquemas (Ref: Jugar con dconf y gnome-tweak-tool )

    Como parte del proceso de instalación (tiene un activador dpkg), los esquemas se compilan con la glib-compile-schemasherramienta (de glib)

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

    *.gschema.xml será compilado en un archivo binario /usr/share/glib-2.0/schemas/gschemas.compiled

  • Archivos de anulación de proveedor ( *.gschema.override)

    Además de los archivos de esquema, glib-compile-schemaslee los archivos de anulación del proveedor , que son archivos de clave que pueden anular los valores predeterminados para las claves en los esquemas (Ref man glib-compile-schemas. :) . Contienen los cambios realizados por la distribución de Ubuntu para anular los valores predeterminados del esquema ascendente.

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

    Ejemplo de uso de archivos de anulación, consulte ¿Cómo personalizar el Ubuntu Live CD? (5. Personalización 2: fondos y temas).

  • Bloquear archivos

    Actualmente, dconf solo admite el bloqueo por tecla, sin bloqueo de subruta. Los valores definidos por el usuario aún se almacenarán, user-dbpero no tendrán efecto en las aplicaciones. dconf / gsettings devuelve valores predeterminados para esas teclas bloqueadas. Archivos de bloqueo se almacenan en db.d/locks/. Ejemplo:

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

    Después de la modificación de los bloqueos, para que sea efectivo, ejecuta

    sudo dconf update
    

    Un buen escaparate: configuración de dconf: valores predeterminados y bloqueos

  • Cambiar la configuración global

    El valor predeterminado para gsettings/ dconf-editores editar el user-db. Para cambiar system-db, escriba un nuevo archivo de anulación y vuelva a compilar los esquemas.

    No pude hacer que esto funcione:

    sudo su gdm -c 'gsettings ...'
    

    ninguna de las otras respuestas aquí establece Preferencias de gnomo predeterminadas / globales (Gnome 3) , puede ser que fuera para una versión anterior.

user.dz
fuente
1
@Rmano, yo también tuve curiosidad por saberlo. Muchas gracias.
user.dz
1
¿Podría explicar cómo definir configuraciones específicas del usuario usando dconf (por ejemplo, necesito implementar un conjunto de configuraciones para un usuario (copiando los archivos necesarios en su directorio ~ / .config / dconf justo después de crear la cuenta) y otro para el segundo usuario, ¿cómo?) AFAIK, la "tienda de estilo de texto" solo es compatible con la configuración de todo el sistema, ¿no? ¿Hay alguna forma de volcar solo la configuración del usuario (por ejemplo, aquellos en ~ / .config / dconf / user)? Sé acerca de "dconf dump /", pero esto es para todo el usuario DB, incluidos los valores predeterminados del sistema. La documentación es extremadamente incompleta.
Anatoli
1
@Anatoli, sí, el almacén de texto solo funciona para la base de datos del sistema. En realidad, dconf dump /volca todas las entradas alteradas por el usuario, no incluye entradas que nunca se modificaron o se restablecieron. (por ejemplo, incluye que las entradas se hayan cambiado o establecido, incluso sus valores son los mismos que los predeterminados). Ver askubuntu.com/q/420527/26246 . Además, no es toda la base de datos, puede establecer la ruta. por ejemplo:dconf dump /com/
user.dz
1
@ user.dz, gracias por la aclaración. Entonces, ¿la única forma de configurar los ajustes específicos del usuario es creando el archivo binario GVDB 'usuario' en otra cuenta limpia con la configuración necesaria y luego copiarlo en la carpeta .config / dconf? AFAIK, no hay forma de usarlo dconf load / < filesin iniciar sesión como usuario.
Anatoli
1
@Anatoli, sí, de esa manera. Puede ser una forma más fácil de alterar la configuración de otros usuarios sin iniciar sesión cada vez que necesita su contraseña o poder raíz (regla de seguridad). Esto debería funcionar sudo su username2 -c "dconf load / < file"
user.dz