如何通过终端在 chroot 模式下更改 dconf 设置?

如何通过终端在 chroot 模式下更改 dconf 设置?

我使用了dconf writegsetting set,他们在启动的 GUI 桌面系统上工作。我尝试在 chroot 环境中的脚本中运行它们,但出现错误。网络搜索发现了类似错误的 QA:生成命令行“dbus-launch --autolaunch=“xyz”--binary-syntax --close-stderr”时出错:子进程退出,代码为 1,https://www.reddit.com/r/linuxquestions/comments/n90sry/error_spawning_command_line_dbuslaunch/但前者没有答案,后来我发现错误原因与我的不同。

在 的手册页中man 7 dconfman dconf我没有找到如何选择特定数据库进行编辑。有办法吗?

我试图在工作系统上找到 dconf 数据库,但即使在dconf write工作的系统上,$ echo $XDG_CONFIG_HOME也会产生空输出,/etc/dconf/profile/不存在,$ echo $DCONF_PROFILE会产生空输出。

$ man 7 dconf
DCONF_PROFILE can specify a relative path to a file in
       /etc/dconf/profile/, or an absolute path (such as in a user's home
       directory).
A "user-db" line specifies a user database. These databases are found
       in $XDG_CONFIG_HOME/dconf/  

添加了 1(正如 @aviro 的评论中所要求的):

# Commands invoked by the script include:
dconf write /org/cinnamon/desktop/keybindings/custom-keybindings/custom0/name "'Display rotate normal'"

gsettings set org.cinnamon.desktop.keybindings custom-list "['__dummy__', 'custom0', 'custom1', 'custom2', 'custom3']"

# output:
error: Error spawning command line “dbus-launch --autolaunch=XXX --binary-syntax --close-stderr”: Child process exited with code 1

(process:108725): dconf-WARNING **: 15:35:32.574: failed to commit changes to dconf: Error spawning command line “dbus-launch --autolaunch=XXX --binary-syntax --close-stderr”: Child process exited with code 1  

该脚本通过 运行sudo chroot fin_sq pathinsidenewroot/nameofscript,其中新的根目录安装了 Linux Mint Cinnamon 版本发行版 iso 的内容:

mkdir iso to temp fin 
sudo mount $original_iso iso #  -o loop
sudo mount -t overlay -o lowerdir=iso,upperdir=to,workdir=temp overlay fin
mkdir iso_sq to_sq temp_sq fin_sq
sudo mount iso/casper/filesystem.squashfs iso_sq -t squashfs -o loop
sudo mount -t overlay -o lowerdir=iso_sq,upperdir=to_sq,workdir=temp_sq overlay fin_sq  

添加 2:
注意到,虽然在“普通”环境中 和 都dconf read /org/cinnamon/desktop/interface/text-scaling-factor显示gsettings get org.cinnamon.desktop.interface text-scaling-factor相同的 (1.0),但在该 PC 上的 chrooted 中大约同时gsettings get 显示 1.0,但dconf read输出为空。当我更改text-scaling-factor密钥(通常)时,gsettings getchrooted 的输出没有改变(dconf read普通的输出更改为新的密钥值)。

答案1

首先,dconf更改配置设置特定用户X11 显示器正在运行。所以你的第一个问题是你以 root 身份运行它。即使您尝试切换到自己的用户,在 chroot 环境中,您的用户和组也不会出现在/etc/{passwd,group}chroot 环境中,因此它根本不熟悉您的用户,因此您甚至无法切换用户。即使您能够切换(在从主机绑定安装相关文件之后),您在 chroot 环境中也没有主目录。即使您将 homedir 绑定到您的 chroot 环境并且您可以su对您的用户进行绑定,您可能在 chroot 环境中没有 X11 套接字,并且您仍然DBUS_SESSION_BUS_ADDRESS没有su.

您可以检查以下问题的答案作为 root,我可以使用 su 为另一个用户更改 dconf。我如何真正让它们应用?查看一些有关如何执行 find/set/use 的示例DBUS_SESSION_BUS_ADDRESS

因此,您可以看到以 root 身份执行此操作非常复杂,在 chroot 环境中执行此操作甚至更复杂。并非不可能,但很困难。在开始之前,您需要将所有相关文件/文件夹绑定安装到 chroot 文件夹。这就是为什么我问你的用例是什么,这就是为什么我问你是否尝试将它用作一种容器(因为一些容器工具,例如singularity,已经为你做了一些工作,比如创建相关的passwd/ group,安装您的主目录等)。

关于以下评论:

大约同时在该 PC 上进行 chrootgsettings get显示 1.0,但dconf read输出为空。

gsettings(实际上是查找或查找用户配置的dconf后端。如果在那里找不到配置,将在.gsettings$HOME/.config/dconf/user$XDG_CACHE_HOME/dconf/usergsettings/usr/share/glib-2.0/schemas/gschemas.compiled

man glib-compile-schemas

   glib-compile-schemas compiles all the GSettings XML schema files in
   DIRECTORY into a binary file with the name gschemas.compiled that can
   be used by GSettings. The XML schema files must have the filename
   extension .gschema.xml. For a detailed description of the XML file
   format, see the GSettings documentation.

   At runtime, GSettings looks for schemas in the glib-2.0/schemas
   subdirectories of all directories specified in the XDG_DATA_DIRS
   environment variable. The usual location to install schema files is
   /usr/share/glib-2.0/schemas.

相关内容