当主目录无法访问时 GDM 挂起

当主目录无法访问时 GDM 挂起

我已经通过 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 就可以工作。

因此,该问题一定与以下事实有关:如果gdmGDM 问候程序使用的用户尝试访问任何已安装的主目录,则由于缺少 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

gdm 可能在主目录中查找的一件事是获取用户的照片以在用户列表中显示。

思考OpenSUSE 使用 gdm 3.6.2,这是正确的吗?

我建议做两件事:

  1. 启用调试日志记录gdm 调试部分,尝试重新运行 gdm,然后查看系统日志中是否有任何有用的内容
  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

相关内容