dconf-editor 和 gsettings 不應該存取同一個資料庫嗎?

dconf-editor 和 gsettings 不應該存取同一個資料庫嗎?

這基本上是一個「學術」問題——試圖更好地理解配置系統的內部結構。

據我了解,dconfsystem 是 gnome3 中的新配置系統,它取代了(已棄用)全域設定檔;這很清楚Gconf、Dconf、Gsettings以及它們之間的關係

在我看來,這些程式gsettingsdconf-editor其中只有兩種不同的方式來存取相同的內容dconf資料庫中得到證實
什麼是 dconf,它的功能是什麼,如何使用它?

編輯:我發現有人注意到它在某些模式名稱中的大小寫有所不同,請參見此處---dconf 模式名稱區分大小寫嗎?;但差異似乎不僅限於此。在其中一個答案中有一個不匹配的例子,但我沒有找到解釋為什麼

gsettings但最近我發現和存取的密鑰dconf-editor不一樣。例如, 的設定vino位於dconf-editorunder org.gnome.desktop.remote-access(請參閱下面的螢幕截圖),而在 gsettings 中,它們位於 org.gnome.Vino。有一些文件可以解釋其中的差異嗎?

設定

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

和:

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

但在dconf 編輯器

dconf 編輯器

答案1

  • dconf-editor用於schema path顯示設定資料樹。 GVariant 資料庫中用於儲存資料的結構相同。

  • gsettings(來自 glib-2.0)用於schema id顯示/獲取設定資料。與使用 GSetttings API 的任何其他應用程式應該執行的操作相同。

  • 由應用程式開發人員根據他/她的意願進行設定。 (對規範命名有一些限制)。因此path可能有所不同,id但大多數應用程式開發人員更喜歡使用相同的單字系列/組合。有些不保留相同的大小寫。例子Gnome 的追蹤器項目

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

    除此之外,一些替代應用程式共用屬於 Gnome 桌面的相同設定。例子:input-sources


  • 第一的,應用程式不應混亂dconf

    簡介來自dconf專案頁面:

    dconf是一個低級配置系統。其主要目的是在尚未配置儲存系統的平台上為 GSettings 提供後端。

  • 資料儲存在哪裡?(參考:https://wiki.gnome.org/Projects/dconf/SystemAdministrators

    設定檔是配置資料庫的清單。看起來 Gnome 和 Unity 使用相同的設定檔。

    $ cat /etc/dconf/profile/gdm
    user-db:user
    system-db:gdm
    
    1. user-db:user:設定檔中的第一個資料庫是讀寫的,rw並且在使用者的主目錄中建立。

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

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

      dconf除了db.d/*資料夾中的 GVariant 資料庫之外,還可以綁定文字樣式儲存。範例(注意檔案路徑,因此它是 的一部分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
       ...
      
  • 架構文件:schema id&之間的關係schema path ( *.gschema.xml)

    我的 Quickly 應用程式的 data/glib-2.0 資料夾中的架構 XML 檔案是什麼?經過特倫特顯示了在 Quickly 應用程式中使用 GSettings API 的一個很好的範例,以及他根據自己的經驗得出的結論。

    回到維諾。每個使用 GSsettings 的應用程式都應該定義其架構,並應將它們儲存/安裝在/usr/share/glib-2.0/schemas/(這是 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>
    ...
    

    如果您注意到,架構是用 anid和 a定義的path。架構檔名位於id值後面。

    <schema id='org.gnome.Vino' path='/org/gnome/desktop/remote-access/'>
    
  • *.enums.xml文件用於自訂枚舉聲明,用作*.gschema.xml相同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'
    
  • 編譯架構(參考:使用 dconf 和 gnome-tweak-tool

    作為安裝過程的一部分(它有一個 dpkg 觸發器),模式是使用glib-compile-schemas工具(來自 glib)進行編譯的

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

    *.gschema.xml將被編譯為二進位文件/usr/share/glib-2.0/schemas/gschemas.compiled

  • 供應商覆蓋文件( *.gschema.override)

    除了模式檔案之外,glib-compile-schemas還讀取供應商覆蓋文件,它們是可以覆蓋模式中鍵的預設值的密鑰檔案(參考:man glib-compile-schemas)。它們包含 Ubuntu 發行版為覆蓋上游模式預設值所做的變更。

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

    覆蓋文件使用範例,請參見如何客製Ubuntu Live CD?(5.定制2:背景和主題)。

  • 鎖定文件

    目前,dconf 僅支援每鍵鎖定,不支援子路徑鎖定。使用者定義的值仍將存儲,user-db但不會對應用程式產生影響。 dconf/gsettings 傳回預設值而不是那些鎖定的鍵。鎖定檔案儲存在db.d/locks/.例子:

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

    修改鎖後,要有效運作:

    sudo dconf update
    

    一個好的展示:dconf 設定:預設值和鎖定

  • 更改全域設定

    gsettings/的預設值dconf-editor是編輯user-db.若要更改system-db,請編寫新的覆蓋檔案並重新編譯架構。

    我無法讓它工作:

    sudo su gdm -c 'gsettings ...'
    

    其他人都沒有在這裡回答設定預設/全域 Gnome 首選項 (Gnome 3),可能是舊版的。

相關內容