pam_systemd.so 是做什么的?

pam_systemd.so 是做什么的?

我将我的 SD 卡从快速的 RaspberryPi 4 切换到 RaspberryPi 2。现在,登录它ssh -vv花了大约 3 分钟,并卡在pledge: network。这问题session optional pam_systemd.so讨论了这种行为,我的解决方案是在 中注释掉/etc/pam.d/common-session

但我想知道这实际上是做什么的。我知道它与打开用户会话有关,但我不熟悉为什么它很重要。

我的journalctl | grep pam显示这个:

Dec 29 15:59:07 RPi4 sshd[1392]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Dec 29 15:59:08 RPi4 systemd: pam_unix(systemd-user:session): session opened for user admin by (uid=0)
Dec 29 16:02:01 RPi4 sudo: pam_unix(sudo:session): session opened for user root by admin(uid=0)
Dec 29 16:02:01 RPi4 sudo: pam_unix(sudo:session): session closed for user root
Dec 29 16:02:23 RPi4 sudo: pam_unix(sudo:session): session opened for user root by admin(uid=0)

答案1

pam_systemd是一个插件,它区分了经典(systemd 之前)登录过程和systemd-aware 登录过程。

如果没有它,登录进程的工作方式与使用 SysVinit 时一样:如果用户进程守护进程(即关闭其标准输入、输出和错误流,分叉两次,则子进程死亡,使孙子进程成为孤儿,将父进程重新设置为 UID #1由内核),将无法跟踪它属于哪个会话。而不是将整个登录会话及其所有子会话可靠地封装到一个单独的会话中控制组,所有进程都进入公共堆。因此也无法强制执行每个会话的资源限制。

/run/user/<UID>/此外,不会创建用户运行时目录,这可能会禁用某些桌面环境的某些功能,以及尝试多会话友好的功能,例如 GnuPG Agent。最后但并非最不重要的一点是,user@<UID>.service系统服务及其管理的任何每用户systemd服务将不会启动:该用户/会话将没有会话 D-Bus,也没有 Pulseaudio。请参阅systemctl --user(在具有有效的每用户服务的系统中systemd)。

在注销时,如果不pam_systemd进行操作,注销进程将无法彻底强制用户会话的所有进程在会话结束时都被明确清除(如果系统管理员希望如此;请参阅 参考资料KillUserProcesses=logind.conf(5)

您还将失去一种简单的方法来将非根操作插入到用户登录/注销等事件中,或者以安装文件系统或可热插拔网络/存储/蓝牙/其他设备存在或出现等为条件的非根操作稍后在登录会话期间。

如果你的目标是一台精简、简单的单任务机器,你可能会认为这是对许多不必要的东西的成功截肢;但根据您的目标,您可能不会。

无论如何,您提到的问题表明问题可能是由导致系统D-Bus 重新启动,这将需要重新启动systemd-logind以及可能需要重新启动依赖于系统 D-Bus 的其他系统服务。

登录缓慢问题的根本原因也可能是 Pulseaudio 仍配置为期望 RasPi 4 硬件,但因找不到它而感到困惑。

背景:

systemd基于 的安装中,每个用户会话可能至少有两个相关的 D-Bus 实例:系统D-Bus,可以选择性地传递系统范围的状态信息和控制,如配置的polkit,和会议用于用户级事物的 D-Bus。某些 GUI 桌面环境可能会启动一个或两个额外的小型 D-Bus 实例,用于处理可访问性和/或国际化(中文/日文/韩文字符及类似字符的输入方法)。

相关内容