這基本上是一個「學術」問題——試圖更好地理解配置系統的內部結構。
據我了解,dconfsystem 是 gnome3 中的新配置系統,它取代了(已棄用)全域設定檔;這很清楚Gconf、Dconf、Gsettings以及它們之間的關係。
在我看來,這些程式gsettings
和dconf-editor
其中只有兩種不同的方式來存取相同的內容dconf資料庫中得到證實
什麼是 dconf,它的功能是什麼,如何使用它?
編輯:我發現有人注意到它在某些模式名稱中的大小寫有所不同,請參見此處---dconf 模式名稱區分大小寫嗎?;但差異似乎不僅限於此。在其中一個答案中有一個不匹配的例子,但我沒有找到解釋為什麼。
gsettings
但最近我發現和存取的密鑰dconf-editor
不一樣。例如, 的設定vino
位於dconf-editor
under 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 編輯器:
答案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
user-db:user
:設定檔中的第一個資料庫是讀寫的,rw
並且在使用者的主目錄中建立。$ file ~/.config/dconf/user /home/sneetsher/.config/dconf/user: GVariant Database file, version 0
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> ...
如果您注意到,架構是用 an
id
和 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),可能是舊版的。