![如何通过终端在 chroot 模式下更改 dconf 设置?](https://linux22.com/image/201347/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E7%BB%88%E7%AB%AF%E5%9C%A8%20chroot%20%E6%A8%A1%E5%BC%8F%E4%B8%8B%E6%9B%B4%E6%94%B9%20dconf%20%E8%AE%BE%E7%BD%AE%EF%BC%9F.png)
我使用了dconf write
和gsetting 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 dconf
,man 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 get
chrooted 的输出没有改变(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 上进行 chroot
gsettings get
显示 1.0,但dconf read
输出为空。
和gsettings
(实际上是查找或查找用户配置的dconf
后端。如果在那里找不到配置,将在.gsettings
$HOME/.config/dconf/user
$XDG_CACHE_HOME/dconf/user
gsettings
/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.