![手动更改 $XDG_DATA 的位置后,$GDM_USER 无法访问 $XDG_DATA](https://linux22.com/image/124618/%E6%89%8B%E5%8A%A8%E6%9B%B4%E6%94%B9%20%24XDG_DATA%20%E7%9A%84%E4%BD%8D%E7%BD%AE%E5%90%8E%EF%BC%8C%24GDM_USER%20%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%20%24XDG_DATA.png)
我有一个小办公室,有 5 台桌面和一台服务器,所有这些都运行在 Debian 上。我刚刚将客户端升级到 Stretch,并且在日志中只看到 1 个令我困扰的错误:
gnome-settings-[939]:无法从 EDID 数据创建配置文件:无法保存 ICC 文件:打开文件“/var/data/users/Debian-gdm/icc/edid-93ed9b01fe8febb07668e99b557191e9.icc”时出错:访问被拒绝
gnome-设置-[939]:无法从 EDID 数据创建配置文件:无法保存 ICC 文件:打开文件“/var/data/users/Debian-gdm/icc/edid-93ed9b01fe8febb07668e99b557191e9.icc”时出错:访问被拒绝
gnome-settings- [939]:无法设置屏幕_ICC_PROFILE:打开文件“/var/data/users/vincent/icc/edid-93ed9b01fe8febb07668e99b557191e9.icc”失败:访问被拒绝
由于我们的用户 $HOME 文件夹是通过 NFS 挂载的,因此我确保所有 $XDG_DATA 和 $XDG_CACHE (至少对于普通用户)都存储在客户端本地。早在 2014 年,我就找到了一本手册,可以这样做:
在/etc/profile.d/xdg_dirs.sh中:
if [ "$USER" == "root" ]; then
unset XDG_CACHE_HOME
unset XDG_DATA_HOME
else
test -d $XDG_CACHE_HOME || mkdir -p $XDG_CACHE_HOME
test -d $XDG_DATA_HOME || mkdir -p $XDG_DATA_HOME
fi
在 /etc/security/pam_env.conf 中:
XDG_CACHE_HOME DEFAULT="/var/cache/users/@{PAM_USER}"
XDG_DATA_HOME DEFAULT="/var/data/users/@{PAM_USER}"
我很确定这已经扰乱了 Debian-gdm 用户的正确权限,但我不知道如何解决它。我尝试创建目录并向 Debian-gdm 和默认用户组授予 r+w 权限,但这不起作用。我还尝试通过添加以下内容从上述脚本中排除 Debian-gdm 用户:
if [ "$USER" == "root" ] || [ "$USER" == "Debian-gdm" ]; then
,但这并没有那么有效。
有什么想法吗?
答案1
我相信这里的主要问题是/etc/profile.d/xdg_dirs.sh
启动 gdm 时没有获取源,因为它现在使用 wayland 而不是 X (Xsession 脚本不再启动)
恕我直言,你不应该破坏这些变量。用户的家庭Debian-gdm
存储位置/var/lib/gdm3
应该已经位于您客户端的本地位置。
我要做的就是修改,其中第一次调用时/etc/pam.d/gdm-launch-environment
有两次调用,设置为.这将阻止 pam 模块读取文件并保持环境不变。pam_env.so
conffile=
/dev/null
/etc/security/pam_env.conf
另一种解决方案是尝试使用 X 而不是 Wayland 来启动 gdm,设置WaylandEnable=false
为/etc/gdm3/daemon.conf
答案2
自从提出这个问题以来,我已将所有系统从 Stretch 升级到 Buster,并且正在升级到 Bullseye。我接受了 @Bigon 对 Stretch 和 Buster 的回答,但由于 pam_env.so 不断产生的错误,我回到了最初的解决方案。我没有见过任何问题,所以这个错误根本没有害处。
对于未来的访问者,如果您的用户的 $HOME 由 NFS 提供服务,则在本地存储用户的缓存非常有用,这就是为什么通过 /etc/ 为 $UID>=2000 的用户设置 XDG_CACHE_HOME 环境变量非常有用个人资料,例如:
if ((`id -u`>=2000)); then
umask 0007
USER=$(id -un)
if [[ !-d "/var/cache/users/$USER" ]]; then
mkdir "/var/cache/users/$USER"
chown "$USER" "/var/cache/users/$USER"
fi
XDG_CACHE_HOME=/var/cache/users/$USER
export XDG_CACHE_HOME
NSS_SDB_USE_CACHE=yes
export NSS_SDB_USE_CACHE
fi
该解决方案可以阻止 root 和 Debian-gdm 等系统用户出现错误,并且它的工作方式独立于用户正在使用的会话管理器。我已删除设置中对 pam_env.so 的所有引用。