![当主目录无法访问时 GDM 挂起](https://linux22.com/image/31920/%E5%BD%93%E4%B8%BB%E7%9B%AE%E5%BD%95%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E6%97%B6%20GDM%20%E6%8C%82%E8%B5%B7.png)
我已经通过 KRB5 和 LDAP 设置了带有 SSO 的 OpenSUSE 12.3 工作站。
这工作得相当顺利,直到 GDM 对其无法访问实际上是使用 krb5p 进行 nfs 挂载的用户主目录感到不太满意为止。
如果没有安装主目录,GDM 工作正常。如果至少安装了一个主目录,则 GDM 在尝试打开欢迎/登录屏幕时将崩溃。
如果我从中删除 LDAP (sss),/etc/nsswitch.conf
那么即使安装了主目录,GDM 也会正常工作。
起初我曾经在 fstab 中挂载 nfs for /home/users
. GDM 每次都会崩溃。然后我尝试切换到autofs来/home/users/*
单独挂载。 GDM 一开始会工作,但此后会崩溃(当用户注销时)。现在我已将其配置为使用 pam_mount ,以便在用户注销后卸载主目录。现在,只要没有其他用户登录到系统,GDM 就可以工作。
因此,该问题一定与以下事实有关:如果gdm
GDM 问候程序使用的用户尝试访问任何已安装的主目录,则由于缺少 kerberos 票证,nfs 服务器将拒绝其权限。即使 root 也无法访问这些目录。
在相应用户登录之前尝试向 GDM 授予对这些目录的访问权限,将导致安全问题。
有趣的是,如果主目录不存在,那么 GDM 绝对没有问题。所以GDM确实容忍file does not exist
,但不容忍permission denied
。
因此,这让我得出结论,无论 GDM 尝试从主目录访问什么,都根本不需要。
那么 GDM 试图从主目录中获取什么呢?更重要的是,我怎样才能阻止它尝试这样做?我怎样才能防止它挂起来?对于一些额外的故障排除有什么想法吗?
或者我怎样才能使挂载的主目录对 GDM 不可见,这样它就不会被它们绊倒?
答案1
/etc/gdm/* 问题
在看着GNOME 显示管理器参考手册我注意到下面有几个目录/etc/gdm
包含不同的脚本等。
这些目录中有一些对$HOME
.我会尝试将它们注释掉,看看您是否可以摆脱对$HOME
.
为了进一步调试您的问题,我倾向于set -x
在这些目录中的各种脚本的顶部添加几行,以查看在“权限被拒绝”消息之前正在运行的内容。
目录中的脚本都是bash
我系统上的脚本。
/etc/gdm/custom.conf
调试选项
有一个调试选项在此文件中默认禁用。尝试启用它,消息将显示在/var/log/messages
.
[debug]
Enable=true
登录时禁用面孔
我也想尝试禁止包含所有用户的脸部在面部浏览器中的 gdm 登录处。
[greeter]
IncludeAll=false
您可以尝试通过将问题用户添加到此列表来仅禁用其中一个用户,而不是禁用它:
Exclude=<some user>
更新 #1 - bugzilla 问题
该问题似乎与针对 Red Hat 问题跟踪器提交的错误有关,标题为:
目前尚无解决方案,但作为错误的一部分,进行了一项测试来确认您遇到了此错误。
当问题出现时,GDM 显然会在此处创建一个缓存目录:/var/run/user/42
。删除此目录允许 GDM 登录继续。 OP 在评论中证实了这一点。
更新 #2 - 可能的解决方法
(我)对一些附加链接提出了第二条评论,其中包含解决该问题的建议。链接标题为:
具体在本节中:
对 PAM 设置进行一些修改可能会解决该问题。
答案2
答案3
它可能正在寻找.dmrc
或类似的东西来加载用户会话设置。为了确保这一点,请附加到 gdm 进程strace
并检查它试图打开哪些文件(以及它挂起的位置)。您可能想使用类似的东西:
strace -f -o /path/to/logfile PID_OF_GDM
-f
还跟踪子进程,-o
将日志重定向到文件(而不是 stderr)。
如果是这种情况,在安装之前将文件放入用户目录应该可以解决问题(但用户无法更改它)。
如果在崩溃之前不容易连接到 GDM,您可以编辑启动器(适当的 systemd 单元,或者 - 如果您仍然坚持使用 sysvinit - 初始化脚本)。
然而,捕获它的最安全方法是替换gdm
为调用原始二进制文件的包装脚本(重命名为eg gdm.bin
)。那么无论 manager 是如何产生的,它都会被追踪到。您可能还想使用唯一命名的文件进行输出 - 只需在包装脚本中使用$$
and/or 即可:`date --iso=ns`
#!/bin/bash
strace -f -o /path/to/gdm-${$}-$(date --iso-8601=ns).strace \
/path/to/original/gdm.bin