ไม่ควร dconf-editor และ gsettings เข้าถึงฐานข้อมูลเดียวกันหรือ


34

นี่เป็นคำถาม 'ทางวิชาการ' โดยทั่วไป - พยายามที่จะเข้าใจระบบการกำหนดค่าที่ดีขึ้น

ฉันเข้าใจว่าระบบdconfเป็นระบบกำหนดค่าใหม่ใน gnome3 ที่แทนที่gconf (คัดค้าน) ; นี้ค่อนข้างชัดเจนจากGconf, Dconf, Gsettings และความสัมพันธ์ระหว่างพวกเขา

สำหรับฉันดูเหมือนว่าโปรแกรมgsettingsและdconf-editorที่ต่างกันเพียงสองวิธีในการเข้าถึงฐานข้อมูลdconfเดียวกันซึ่งได้รับการรับรองใน
What is dconf ฟังก์ชันของมันคืออะไรและฉันจะใช้มันได้อย่างไร

แก้ไข: ฉันค้นพบว่ามีคนสังเกตเห็นว่ามันเป็นความแตกต่างในกรณีในบางชื่อสคีมาที่นี่ --- เป็นชื่อ dconf schema เป็นกรณี ๆ ไปหรือไม่? ; แต่ดูเหมือนว่าความแตกต่างไม่ได้ จำกัด อยู่แค่นั้น หนึ่งในคำตอบที่มีตัวอย่างของการไม่ตรงกัน แต่ผมไม่ได้พบกับการชี้แจงของเหตุผล

แต่เมื่อเร็ว ๆ นี้ฉันค้นพบว่ากุญแจที่สามารถเข้าถึงได้จากgsettingsและdconf-editorไม่เหมือนกัน ยกตัวอย่างเช่นการตั้งค่าสำหรับvinoอยู่ในdconf-editorภายใต้org.gnome.desktop.remote-access(ดูภาพด้านล่าง) ขณะที่อยู่ใน gsettings org.gnome.Vinoพวกเขาอยู่ภายใต้การ มีเอกสารอะไรบ้างที่อธิบายความแตกต่าง?

ใน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
[...]

และ:

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

แต่ในdconf-editor :

dconf บรรณาธิการ

คำตอบ:


39
  • 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 บนแพลตฟอร์มที่ยังไม่มีระบบจัดเก็บข้อมูลการกำหนดค่า

  • ข้อมูลถูกเก็บไว้ที่ไหน? (Ref: 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สามารถผูกร้านค้าลักษณะข้อความนอกเหนือจากฐานข้อมูล GVariant จากdb.d/*โฟลเดอร์ ตัวอย่าง (สังเกตเส้นทางไฟล์ดังนั้นมันจึงเป็นส่วนหนึ่ง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)

    ไฟล์ schema XML ในโฟลเดอร์ data / glib-2.0 ของแอปพลิเคชัน Quickly ของฉันคืออะไร โดยเทรนต์แสดงตัวอย่างที่ดีของการใช้ GSettings API ในแอปพลิเคชันอย่างรวดเร็วและข้อสรุปของเขาขึ้นอยู่กับประสบการณ์ของเขา

    กลับไปที่ Vino แต่ละแอปพลิเคชันที่ใช้ 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>
    ...
    

    ถ้าคุณสังเกตเห็นเค้าร่างที่ถูกกำหนดให้กับและid pathชื่อไฟล์สคีมาตามหลังidค่า

    <schema id='org.gnome.Vino' path='/org/gnome/desktop/remote-access/'>
    
  • *.enums.xmlไฟล์ที่มีการประกาศการแจงนับที่กำหนดเองที่จะใช้เป็นชนิดข้อมูลใหม่ ๆ ในแบบเดียวกับ*.gschema.xmlschema 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'
    
  • การรวบรวม Schema's (การอ้างอิง: การเล่นด้วย 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อ่านแทนที่ผู้ขายไฟล์ซึ่งเป็นไฟล์ที่สำคัญที่สามารถแทนที่ค่าเริ่มต้นสำหรับคีย์ใน schemas (Ref: 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)ซึ่งอาจเป็นของรุ่นเก่า


1
@Rmano ฉันก็มีความอยากรู้อยากเห็นเช่นกันเพื่อเรียนรู้เกี่ยวกับมัน ขอบคุณมาก.
user.dz

1
คุณช่วยอธิบายวิธีการกำหนดการตั้งค่าเฉพาะของผู้ใช้ด้วย dconf ได้ไหม (ฉันต้องปรับใช้การตั้งค่าหนึ่งชุดสำหรับผู้ใช้หนึ่งคน (คัดลอกไฟล์ที่จำเป็นไปยัง / ~ ~ .config / dconf dir หลังจากสร้างบัญชี) และอีก สำหรับผู้ใช้ที่สองอย่างไร) AFAIK "text style store" รองรับเฉพาะการตั้งค่าระบบเท่านั้นใช่ไหม มีวิธีการถ่ายโอนข้อมูลเฉพาะการตั้งค่าผู้ใช้ (เช่นการตั้งค่าใน ~ / .config / dconf / user) หรือไม่? ฉันรู้เกี่ยวกับ "dconf dump /" แต่นี่สำหรับฐานข้อมูลผู้ใช้ทั้งหมดรวมถึงค่าเริ่มต้นของระบบ เอกสารไม่สมบูรณ์อย่างยิ่ง
Anatoli

1
@Anatoli ใช่ที่เก็บข้อความใช้งานได้กับฐานข้อมูลทั้งระบบเท่านั้น ที่จริงdconf dump /ดัมพ์รายการที่แก้ไขโดยผู้ใช้ทั้งหมดมันไม่รวมรายการที่ไม่เคยเปลี่ยนแปลงหรือถูกรีเซ็ต (ตัวอย่างเช่นมันรวมรายการที่มีการเปลี่ยนแปลงหรือการตั้งค่าแม้ค่าของพวกเขาจะเหมือนกับค่าเริ่มต้น) ดูaskubuntu.com/q/420527/26246 ยังไม่ได้เป็นฐานข้อมูลทั้งหมดคุณสามารถกำหนดเส้นทาง เช่น:dconf dump /com/
user.dz

1
@ user.dz ขอบคุณสำหรับการชี้แจง ดังนั้นวิธีเดียวในการกำหนดการตั้งค่าเฉพาะผู้ใช้คือการสร้างไฟล์ 'user' GVDB-binary ในบัญชี clean อื่นอีกด้วยการตั้งค่าที่จำเป็นแล้วคัดลอกไปยังโฟลเดอร์. config / dconf AFAIK ไม่มีวิธีการใช้งานdconf load / < fileหากไม่ลงชื่อเข้าใช้ในฐานะผู้ใช้
Anatoli

1
@Anatoli ใช่วิธีหนึ่ง อาจเป็นวิธีที่ง่ายกว่าในการเปลี่ยนแปลงการตั้งค่าผู้ใช้อื่น ๆ โดยไม่ต้องบันทึกว่าคุณต้องการรหัสผ่านหรือกำลังไฟฟ้าของราก (กฎความปลอดภัย) สิ่งนี้น่าจะใช้ได้ sudo su username2 -c "dconf load / < file"
user.dz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.