Bukankah seharusnya dconf-editor dan gsettings mengakses database yang sama?

34

Ini pada dasarnya adalah pertanyaan 'akademik' --- untuk mencoba memahami dengan lebih baik jeroan sistem konfigurasi.

Saya mengerti bahwa sistem dconf adalah sistem konfigurasi baru di gnome3 yang telah menggantikan gconf (yang sudah tidak digunakan lagi) ; ini cukup jelas dari Gconf, Dconf, Gsettings dan hubungan di antara mereka .

Tampak bagi saya bahwa program gsettingsdan di dconf-editormana hanya dua cara berbeda untuk mengakses database dconf yang sama , yang dikuatkan dalam
Apa itu dconf, apa fungsinya, dan bagaimana cara menggunakannya?

EDIT: Saya menemukan bahwa seseorang memperhatikannya sebagai perbedaan dalam kasus dalam beberapa nama skema, lihat di sini --- Apakah nama skema dconf case-sensitive? ; tetapi tampaknya perbedaan itu tidak terbatas pada itu saja. Dalam salah satu jawaban ada contoh ketidakcocokan, tetapi saya tidak menemukan penjelasan mengapa .

Namun belakangan ini saya menemukan bahwa kunci dapat diakses dari gsettingsdan dconf-editortidak sama. Misalnya, pengaturan untuk vinoberada di dconf-editorbawah org.gnome.desktop.remote-access(lihat tangkapan layar di bawah) sementara di gsettings mereka berada di bawah org.gnome.Vino. Ada beberapa dokumentasi yang menjelaskan perbedaannya?

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

dan:

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

Tetapi di dconf-editor :

dconf-editor

Rmano
sumber

Jawaban:

39
  • dconf-editorgunakan schema pathuntuk menampilkan pohon data pengaturan. Struktur yang sama digunakan untuk menyimpan data dalam basis data GVariant.

  • gsettings(dari glib-2.0) digunakan schema iduntuk menampilkan / mendapatkan data pengaturan. Cara yang sama seperti aplikasi lain yang harus dilakukan yang menggunakan GSetttings API.

  • Terserah pengembang aplikasi untuk mengatur keduanya sesuai keinginannya. (dengan beberapa batasan untuk penamaan kanonik). Jadi pathbisa berbeda dari idtetapi kebanyakan pengembang aplikasi lebih suka menggunakan seri kata / kombinasi yang identik. Beberapa tidak mempertahankan kapitalisasi yang sama. Contoh proyek Pelacak dari Gnome

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

    Selain itu, beberapa aplikasi alternatif berbagi pengaturan yang sama yang dimiliki oleh desktop Gnome. Contoh:input-sources


  • Pertama, Aplikasi tidak boleh dipusingkandconf

    Pengantar dari halaman proyek dconf :

    dconfadalah sistem konfigurasi tingkat rendah. Tujuan utamanya adalah untuk memberikan backend ke GSettings pada platform yang belum memiliki sistem penyimpanan konfigurasi.

  • Di mana data disimpan?(Ref: https://wiki.gnome.org/Projects/dconf/SystemAdministrators )

    Profil adalah daftar database konfigurasi. Sepertinya Gnome & Unity menggunakan profil yang sama.

    $ cat /etc/dconf/profile/gdm
    user-db:user
    system-db:gdm
    
    1. user-db:user: Database pertama di profil adalah baca-tulis rwdan dibuat di direktori home pengguna.

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

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

      dconfdapat mengikat toko gaya teks selain GVariant Database dari db.d/*folder. Contoh (Perhatikan file path, jadi itu adalah bagian dari 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 Skema: Hubungan antara schema id&schema path (*.gschema.xml )

    Apakah file XML skema di folder data / glib-2.0 aplikasi Quickly saya? oleh trent menunjukkan contoh yang bagus tentang penggunaan GSettings API dalam aplikasi Quickly, dan kesimpulannya berdasarkan pengalamannya.

    Kembali ke Vino. Setiap aplikasi yang menggunakan GSsettings harus mendefinisikan skema dan harus menyimpan / menginstalnya di /usr/share/glib-2.0/schemas/(Ini adalah direktori 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>
    ...
    

    Jika Anda perhatikan, Skema didefinisikan dengan a iddan a path. Nama file skema mengikuti idnilainya.

    <schema id='org.gnome.Vino' path='/org/gnome/desktop/remote-access/'>
    
  • *.enums.xmlfile untuk deklarasi enumerasi khusus, untuk digunakan sebagai tipe data baru *.gschema.xmldengan yang sama 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'
    
  • Skema Kompilasi (Ref: Bermain dengan dconf dan gnome-tweak-tool )

    Sebagai bagian dari proses instalasi (memiliki pemicu dpkg), skema dikompilasi dengan glib-compile-schemasalat (dari glib)

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

    *.gschema.xml akan dikompilasi ke file biner /usr/share/glib-2.0/schemas/gschemas.compiled

  • Vendor Override Files (*.gschema.override )

    Selain file skema, glib-compile-schemasmembaca vendor menimpa file, yang merupakan file kunci yang dapat menimpa nilai default untuk kunci dalam skema (Ref:man glib-compile-schemas . Mereka berisi perubahan yang dilakukan oleh distribusi Ubuntu untuk menimpa default skema hulu.

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

    Contoh penggunaan override file, Lihat Bagaimana menyesuaikan CD Live Ubuntu? (5. Kustomisasi 2: Latar Belakang dan Tema).

  • Kunci file

    Saat ini, dconf hanya mendukung penguncian per-kunci, tidak ada kunci sub-jalur. Nilai yang ditentukan pengguna akan tetap disimpan user-dbtetapi tidak akan berpengaruh pada aplikasi. dconf / gsettings mengembalikan nilai default sebagai gantinya untuk kunci yang dikunci. File kunci disimpan di db.d/locks/. Contoh:

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

    Setelah modifikasi kunci, agar berjalan efektif:

    sudo dconf update
    

    Sebuah showcase yang bagus: Pengaturan dconf: default dan terkunci

  • Mengubah Pengaturan Global

    Default untuk gsettings/ dconf-editoradalah mengedit user-db. Untuk mengubah system-db, tulis file override baru dan kompilasi ulang skema.

    Saya tidak bisa mengaktifkan ini:

    sudo su gdm -c 'gsettings ...'
    

    tidak ada jawaban lain di sini Tetapkan Default / Global Gnome Preferences (Gnome 3) , mungkin itu untuk rilis lama.

user.dz
sumber
1
@Rmano, saya juga ingin tahu tentang hal itu. Terima kasih banyak.
user.dz
1
Bisakah Anda jelaskan bagaimana cara mendefinisikan pengaturan khusus pengguna menggunakan dconf (katakanlah, saya perlu menggunakan satu set pengaturan untuk satu pengguna (menyalin file yang diperlukan ke / ~. .Config / dconf dirnya tepat setelah membuat akun) dan lainnya untuk pengguna kedua, bagaimana?)? AFAIK, "toko gaya teks" hanya didukung untuk pengaturan seluruh sistem, bukan? Apakah ada cara untuk membuang hanya pengaturan pengguna (mis. Yang ada di ~ / .config / dconf / user)? Saya tahu tentang "dconf dump /", tetapi ini untuk seluruh pengguna DB, termasuk sistem default. Dokumentasinya sangat tidak lengkap.
Anatoli
1
@Anatoli, Ya, toko teks hanya berfungsi untuk basis data sistem yang luas. Sebenarnya dconf dump /dump semua entri yang diubah pengguna, tidak termasuk entri yang tidak pernah diubah atau telah disetel ulang. (misalnya, itu termasuk entri telah diubah atau diatur bahkan nilainya sama dengan standar). Lihat askubuntu.com/q/420527/26246 . Juga bukan seluruh DB, Anda dapat mengatur path. mis:dconf dump /com/
user.dz
1
@ user.dz, terima kasih atas klarifikasi. Jadi satu-satunya cara untuk mengonfigurasi pengaturan khusus pengguna adalah dengan membuat file biner GVDB 'pengguna' pada akun bersih lain dengan pengaturan yang diperlukan dan kemudian menyalinnya ke folder .config / dconf? AFAIK, tidak ada cara untuk digunakan dconf load / < filetanpa masuk sebagai pengguna.
Anatoli
1
@Anatoli, Ya itu satu arah. Mungkin cara yang lebih mudah untuk mengubah pengaturan pengguna lain tanpa masuk log seberapa pun Anda membutuhkan kata sandi atau kekuatan root (aturan keamanan). Ini seharusnya bekerja sudo su username2 -c "dconf load / < file"
user.dz