本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。
pam_systemd — 在 systemd 登录管理器中注册用户会话
pam_systemd.so
pam_systemd 将用户会话注册到 systemd 登录管理器(也就是 systemd-logind.service(8) 服务)中, 因此也同时注册到了 systemd 控制组(control group)之中。
在登录(login)时,此模块与 systemd-logind.service
服务一起,
确保实现如下功能:
如果用户运行时目录(/run/user/$UID
)不存在,
那么就创建该目录或者以"tmpfs
"文件系统挂载该目录,
同时根据登录用户为该目录设置磁盘配额、属主与属组。
设置 $XDG_SESSION_ID
环境变量的值。
如果开启了审计并且 pam_loginuid.so 运行在此模块之前(强烈建议这么做),
那么将使用审计会话ID(/proc/self/sessionid
)的值,
否则将使用独立的会话计数器的值。
为会话创建一个新的 scope 单元。如果此会话是该用户多个并行会话中第一个建立的会话,
那么将会在 user.slice
之下自动创建一个针对该用户的 slice 单元,并将新建的 scope 单元置于其中。
按照会话用户的身份启动一个 user@.service
系统服务实例
(也就是运行一个 systemd 用户实例)。
在退出(logout)时,此模块确保实现如下功能:
如果在
logind.conf(5) 中设置了 KillUserProcesses=yes
(无论明确还是隐含),
那么将会杀死会话中的所有进程。如果此会话是该用户多个并行会话中最后一个退出的会话,
那么还会同时终止该用户的 systemd 用户实例以及 slice 单元。
如果此会话是该用户多个并行会话中最后一个退出的会话,
那么将会删除该用户的运行时目录(/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)
手册。
desktop=
¶设置会话桌面环境(若存在)。
例如 "GNOME
" 或 "KDE
" 。
环境变量 XDG_SESSION_DESKTOP
的值会覆盖此设置(参见"环境变量"小节)。
建议使用与 $XDG_CURRENT_DESKTOP
环境变量(参见 Desktop Entry
Specification 规范)完全相同的标识符。注意,此选项只接收一个单独值,
而不像 $XDG_CURRENT_DESKTOP
那样接受以冒号分隔的列表。详见
sd_session_get_desktop(3)
手册。
debug
[=]¶接受一个可选的布尔值。 不带参数(等价于设为"yes")表示在日志中记录详细的调试信息。
此模块将会为用户会话中的进程 初始化如下环境变量:
$XDG_SESSION_ID
¶"会话ID",可用于各种文件名。
虽然它通常就是审计会话ID的值(/proc/self/sessionid
),
但是其值本身并没有什么特别的含义。
因为在整个系统运行期间,每个 ID 仅会被分配一次,
所以可以将其视为本次会话的可靠标签,用于标记文件或其他资源。
将"会话ID"与启动标识符(sd_id128_get_boot(3))组合在一起,
即可在全局范围内唯一标识当前会话。
$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 模块传递配置数据。 如果在调用PAM模块时尚未设置这些变量,但可以推断出这些变量的值,那么 pam_systemd 模块将会设置它们。 因此,只要能够推断出这些变量的值,就会为会话和应用程序初始化这些变量。
若尚未设置, pam_systemd
将会根据 $DISPLAY
的值(若存在)初始化
$XDG_SEAT
与 $XDG_VTNR
在 PAM 栈中位于 pam_systemd.so 之前的模块,能够使用 PAM 上下文对象设置会话 scope 限制。 这些对象的数据以NULL结尾的C风格字符串提供,并直接映射到对应单元的资源控制指令。 注意,这些限制作用于用户的每一个会话,而不是用户的全部进程(可能分属不同的会话)的整体。 特别地,运行每个用户的 systemd --user 管理进程及其子进程、并且在任何会话之外跟踪、被所有用户会话共享的 user@.service 服务实例,是不在限制范围之内的。
详见 systemd.resource-control(5) 以了解资源控制。 详见 pam_set_data(3) 以了解如何设置上下文对象。
其他 PAM 模块提供的数据示例:
pam_set_data(handle, "systemd.memory_max", (void *)"200M", cleanup); pam_set_data(handle, "systemd.tasks_max", (void *)"50", cleanup); pam_set_data(handle, "systemd.cpu_weight", (void *)"100", cleanup); pam_set_data(handle, "systemd.io_weight", (void *)"340", cleanup);
#%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