O dconf-editor e o gsettings não devem acessar o mesmo banco de dados?

34

Esta é uma pergunta basicamente 'acadêmica' - para tentar entender melhor as entranhas do sistema de configuração.

Eu entendo que o sistema dconf é o novo sistema de configuração no gnome3 que substituiu o (obsoleto) gconf ; isso fica bem claro no Gconf, Dconf, Gsettings e na relação entre eles .

Pareceu-me que os programas gsettingse dconf-editoronde apenas duas maneiras diferentes de acessar o mesmo banco de dados dconf , o que é corroborado em
O que é dconf, qual é sua função e como usá-lo?

Edição: Descobri que alguém percebeu isso como uma diferença no caso de algum nome de esquema, veja aqui --- Os nomes de esquema dconf diferenciam maiúsculas de minúsculas? ; mas parece que as diferenças não se restringem a isso. Em uma das respostas, há um exemplo de incompatibilidade, mas não encontrei uma explicação do porquê .

Mas ultimamente eu descobri que as chaves acessíveis gsettingse dconf-editornão são as mesmas. Por exemplo, as configurações de vinoestão em dconf-editorbaixo org.gnome.desktop.remote-access(veja a captura de tela abaixo), enquanto nas configurações em que estão abaixo org.gnome.Vino. Existe alguma documentação que explica a diferença?

Em configurações :

(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'

Mas no dconf-editor :

dconf-editor

Rmano
fonte

Respostas:

39
  • dconf-editorusa schema pathpara mostrar a árvore de dados de configurações. Mesma estrutura usada para armazenar dados no banco de dados GVariant.

  • gsettings(do glib-2.0) usa schema idpara mostrar / obter dados de configurações. Da mesma forma que qualquer outro aplicativo que use a API GSetttings.

  • Cabe ao desenvolvedor do aplicativo definir ambos como ele / ela gostaria. (com alguma restrição para nomeação canônica). Portanto, pathpode ser diferente, idmas a maioria dos desenvolvedores de aplicativos prefere usar séries / combinações de palavras idênticas. Alguns não preservam a mesma capitalização. Exemplo de projeto Tracker do Gnome

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

    Além disso, alguns aplicativos alternativos compartilham as mesmas configurações que pertencem à área de trabalho do Gnome. Exemplo:input-sources


  • Primeiro, os aplicativos não devem mexer comdconf

    Introdução na página do projeto dconf :

    dconfé um sistema de configuração de baixo nível. Seu principal objetivo é fornecer um back-end para o GSettings em plataformas que ainda não possuem sistemas de armazenamento de configuração.

  • Onde estão os dados armazenados? (Ref: https://wiki.gnome.org/Projects/dconf/SystemAdministrators )

    Um perfil é uma lista de bancos de dados de configuração. O que parece que o Gnome & Unity usa o mesmo perfil.

    $ cat /etc/dconf/profile/gdm
    user-db:user
    system-db:gdm
    
    1. user-db:user: O primeiro banco de dados no perfil é de leitura e gravação rwe é criado no diretório inicial do usuário.

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

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

      dconfpoderia vincular um armazenamento de estilo de texto, além do GVariant Database da db.d/*pasta. Exemplo (observe o caminho do arquivo, faça parte dele 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
       ...
      
  • Arquivos de esquema: Relação entre schema id&schema path ( *.gschema.xml)

    Qual é o arquivo XML do esquema na pasta data / glib-2.0 do meu aplicativo Quickly? by trent mostra um bom exemplo de uso da API GSettings em um aplicativo Rapidamente, e sua conclusão com base em sua experiência.

    De volta ao Vino. Cada aplicativo que usa GSsettings deve definir seus esquemas e armazená-los / instalá-los /usr/share/glib-2.0/schemas/(é um diretório 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 você notou, o esquema é definido com um ide um path. O nome do arquivo de esquema segue o idvalor

    <schema id='org.gnome.Vino' path='/org/gnome/desktop/remote-access/'>
    
  • *.enums.xmlarquivos são para declaração de enumeração personalizada, para serem usados ​​como novos tipos de dados *.gschema.xmlcom o mesmo 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'
    
  • Compilando esquemas (Ref: Jogando com dconf e gnome-tweak-tool )

    Como parte do processo de instalação (possui um gatilho dpkg), os esquemas são compilados com a glib-compile-schemasferramenta (da glib)

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

    *.gschema.xml será compilado em um arquivo binário /usr/share/glib-2.0/schemas/gschemas.compiled

  • Arquivos de substituição de fornecedor ( *.gschema.override)

    Além dos arquivos de esquema, glib-compile-schemaslê os arquivos de substituição de fornecedor , que são arquivos de chave que podem substituir os valores padrão das chaves nos esquemas (Ref:) man glib-compile-schemas. Eles contêm as alterações feitas pela distribuição do Ubuntu para substituir os padrões de esquema upstream.

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

    Exemplo de uso de arquivos de substituição, consulte Como personalizar o Ubuntu Live CD? (5. Personalização 2: Planos de fundo e temas).

  • Bloquear arquivos

    Atualmente, o dconf suporta apenas bloqueio por chave, sem bloqueio de subcaminho. Os valores definidos pelo usuário ainda serão armazenados, user-dbmas não terão efeito nos aplicativos. O dconf / gsettings retorna os valores padrão para essas chaves bloqueadas. Os arquivos de bloqueio são armazenados em db.d/locks/. Exemplo:

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

    Após a modificação dos bloqueios, para ser eficaz, execute:

    sudo dconf update
    

    Uma boa vitrine: dconf Configurações: padrões e bloqueios

  • Alterando configurações globais

    O padrão para gsettings/ dconf-editoré editar o user-db. Para alterar system-db, escreva um novo arquivo de substituição e recompile os esquemas.

    Não consegui fazer isso funcionar:

    sudo su gdm -c 'gsettings ...'
    

    nem as outras respostas aqui Defina as preferências padrão / globais do Gnome (Gnome 3) , talvez seja para uma versão antiga.

user.dz
fonte
1
@Rmano, eu também tinha uma curiosidade de aprender sobre isso. Muito obrigado.
user.dz
1
Você poderia explicar como definir configurações específicas do usuário usando o dconf (por exemplo, eu preciso implantar um conjunto de configurações para um usuário (copiando os arquivos necessários para o diretório ~ / .config / dconf logo após a criação da conta) e outro para o segundo usuário, como?)? AFAIK, o "armazenamento de estilo de texto" é suportado apenas para configurações em todo o sistema, não é? Existe alguma maneira de despejar apenas as configurações do usuário (por exemplo, em ~ / .config / dconf / user)? Eu sei sobre "dconf dump /", mas isso é para todo o usuário DB, incluindo os padrões do sistema. A documentação está extremamente incompleta.
Anatoli
1
@ Anatoli, sim, o armazenamento de texto funciona apenas para o banco de dados de todo o sistema. Realmente dconf dump /despeja todas as entradas alteradas pelo usuário, não inclui entradas nunca alteradas ou que foram redefinidas. (por exemplo, inclui que as entradas foram alteradas ou configuradas até seus valores são os mesmos que o padrão). Veja askubuntu.com/q/420527/26246 . Também não é o banco de dados inteiro, você pode definir o caminho. ex:dconf dump /com/
user.dz
1
@ user.dz, obrigado pelo esclarecimento. Portanto, a única maneira de definir configurações específicas do usuário é criando o arquivo binário GVDB 'user' em outra conta limpa com as configurações necessárias e copiando-o para a pasta .config / dconf? AFAIK, não há como usar dconf load / < filesem fazer login como usuário.
Anatoli
1
@ Anatoli, sim dessa maneira. Pode ser uma maneira mais fácil de alterar outras configurações do usuário sem registrar a necessidade de sua senha ou poder raiz (regra de segurança). Isso deve funcionar sudo su username2 -c "dconf load / < file"
user.dz