pam_systemd 中文手册

译者:金步国


版权声明

本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。

其他作品

本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:

联系方式

由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。


手册索引 . 指令索引systemd-235

名称

pam_systemd — 在 systemd 登录管理器中注册用户会话

大纲

pam_systemd.so

描述

pam_systemd 将用户会话注册到 systemd 登录管理器(也就是 systemd-logind.service(8) 服务)中, 因此也同时注册到了 systemd 控制组(control group)之中。

在登录(login)时,此模块与 systemd-logind.service 服务一起, 确保实现如下功能:

  1. 如果用户运行时目录(/run/user/$UID)不存在, 那么就创建该目录或者以"tmpfs"文件系统挂载该目录, 同时根据登录用户为该目录设置磁盘配额、属主与属组。

  2. 设置 $XDG_SESSION_ID 环境变量的值。 如果开启了审计并且 pam_loginuid.so 运行在此模块之前(强烈建议这么做), 那么将使用审计会话ID(/proc/self/sessionid)的值, 否则将使用独立的会话计数器的值。

  3. 为会话创建一个新的 scope 单元。如果此会话是该用户多个并行会话中第一个建立的会话, 那么将会在 user.slice 之下自动创建一个针对该用户的 slice 单元,并将新建的 scope 单元置于其中。 按照会话用户的身份启动一个 user@.service 系统服务实例(也就是运行一个 systemd 用户实例)。

在退出(logout)时,此模块确保实现如下功能:

  1. 如果在 logind.conf(5) 中设置了 KillUserProcesses=yes (无论明确还是隐含), 那么将会杀死会话中的所有进程。如果此会话是该用户多个并行会话中最后一个退出的会话, 那么还会同时终止该用户的 systemd 用户实例以及 slice 单元。

  2. 如果此会话是该用户多个并行会话中最后一个退出的会话, 那么将会删除该用户的运行时目录(/run/user/$UID)以及其中的所有内容。

如果系统的 init 进程不是 systemd , 那么此模块什么也不做,并且立即返回 PAM_SUCCESS 值。

选项

可以使用的选项如下:

class=

设置会话类。 环境变量 XDG_SESSION_CLASS 的值会覆盖此设置。 可设为 "user", "greeter", "lock-screen", "background" 之一。详见 sd_session_get_class(3) 手册。

type=

设置会话类型。 环境变量 XDG_SESSION_TYPE 的值会覆盖此设置。 可设为 "unspecified", "tty", "x11", "wayland", "mir" 之一。详见 sd_session_get_type(3) 手册。

debug[=]

接受一个可选的布尔值。 不带参数(等价于设为"yes") 表示在日志中记录详细的调试信息。

提供的模块类型

仅提供 session 类型。

环境变量

将会为用户会话中的进程设置如下环境变量:

$XDG_SESSION_ID

"会话ID",可用于各种文件名。 虽然它通常就是审计会话ID(/proc/self/sessionid)的值, 但是其值本身并没有什么特别的含义。 因为在整个系统运行期间,每个 ID 仅会被分配一次, 所以可以将其视为本次会话的可靠标签,用于标记文件或其他资源。

$XDG_RUNTIME_DIR

在登录期间该用户专属的可读写目录(用户运行时目录)的路径。 该目录将在用户首次登录时创建、并在用户退出最后一个会话时删除。 对于同一个用户的多个同时存在的不同会话来说, 这些会话中的所有进程看到的 $XDG_RUNTIME_DIR 目录中的内容都完全相同。 注意,如果某个用户退出了全部会话,那么该目录中的内容将会彻底丢失, 即使之后再次重新登录,该目录中原有的内容也依然无法恢复。 应用程序不应该依赖于此目录的自动销毁特性, 而应该自己处理过期文件(例如及时删除无用的文件)。 如果想要在此目录中保存某个会话专属的私有数据,那么应该在文件名中包含 $XDG_SESSION_ID 的值。 此目录一般仅用于存放运行时文件系统对象, 例如 AF_UNIX 套接字、管道(FIFO)、PID 文件……之类。 必须确保此目录位于本机系统中, 并且能够完整提供所有可能的文件系统特性。 详见 XDG Base Directory Specification 文档。如果当前用户不是该会话的登录用户, 那么 $XDG_RUNTIME_DIR 变量将不会被设置。

pam_systemd 模块将会读取下面的环境变量, 因此, PAM 服务可以使用下列环境变量向 pam_systemd 模块传递配置数据:

$XDG_SESSION_TYPE

会话类型。推荐使用此变量来代替 session= 模块选项。

$XDG_SESSION_CLASS

会话类。推荐使用此变量来代替 class= 模块选项。

$XDG_SESSION_DESKTOP

一个简短的桌面环境标识字符串, 例如 "GNOME" 或 "KDE" 。 如果当前确实是一个图形界面会话,那么可用于表示会话所使用的桌面环境。 推荐使用与 $XDG_CURRENT_DESKTOP 相同的标识字符串(参见 Desktop Entry Specification 文档)。不过需要注意的是, $XDG_SESSION_DESKTOP 仅接受一个单独的标识, 而不是像 $XDG_CURRENT_DESKTOP 那样接受一组冒号分隔的标识。详见 sd_session_get_desktop(3) 手册。

$XDG_SEAT

用于注册会话的席位名称(如果存在的话)。

$XDG_VTNR

用于注册会话的虚拟终端编号(如果存在的话)。 仅用于拥有虚拟终端的席位(例如 "seat0")。

例子

#%PAM-1.0
auth       required     pam_unix.so
auth       required     pam_nologin.so
account    required     pam_unix.so
password   required     pam_unix.so
session    required     pam_unix.so
session    required     pam_loginuid.so
session    required     pam_systemd.so

参见

systemd(1), systemd-logind.service(8), logind.conf(5), loginctl(1), pam.conf(5), pam.d(5), pam(8), pam_loginuid(8), systemd.scope(5), systemd.slice(5), systemd.service(5)