systemd-logind 是 Linux 系统中 systemd 组件套件的一部分,它是一个守护进程(Service),专门用于管理用户登录、用户会话(Sessions)以及席位(Seats)。
核心功能
在现代 Linux 发行版(如 Ubuntu, Fedora, CentOS 7+, Debian 8+)中,它取代了旧的 ConsoleKit,成为管理用户会话和电源事件的核心组件。
systemd-logind 主要负责以下几项工作:
跟踪用户会话 (Session Tracking)
- 它记录当前系统中谁登录了、从哪里登录的(本地 TTY、图形界面、SSH 远程等)。
- 它为每个用户分配一个 User ID 范围的 systemd scope。
- 它维护会话的状态(活动、非活动、锁定等)。
席位管理 (Seat Management)
- 概念: “Seat”(席位)是指一组硬件设备的集合(通常包括显示器、键盘、鼠标)。
- 功能: logind 负责将硬件设备分配给特定的席位。
- 单席位(Seat0): 大多数个人电脑只有一个席位,即主显示器和输入设备。
- 多席位(Multi-seat): 一台主机可以连接多套显示器和键鼠,供多人同时使用,logind 可以管理这种复杂的硬件分配。
电源管理与硬件事件 (Power Management)
- 这是普通用户感知最强的功能。它监听硬件输入事件,并根据配置执行操作:
- 按下电源键(Power Button)
- 合上笔记本盖子(Lid Switch)
- 按下休眠/挂起键(Suspend/Hibernate Key)
- 它还管理抑制锁(Inhibitor Locks):防止系统在特定操作(如烧录光盘、系统升级)期间自动休眠或关机。
设备访问控制 (Device Access)
- 它与内核和 udev 配合,动态地授予当前**活动会话(Active Session)**的用户对特定硬件(如声卡、摄像头、显卡)的访问权限。当用户切换会话(例如 Fast User Switching)时,权限会自动转移给新用户。
关键概念
理解 logind 需要理解以下三个层级:
- User (用户): 操作系统中的用户账号。
- Session (会话): 用户登录系统的一次特定实例。
- 例如:用户 A 在 TTY1 登录是一个会话,同时通过 SSH 登录是另一个会话。
- Seat (席位): 用户操作的物理位置(硬件集合)。
- 本地登录通常在
seat0。
- SSH 远程登录通常没有分配 Seat。
管理工具:loginctl
loginctl 是与 systemd-logind 交互的命令行工具。
常用命令:
- 查看所有会话:
- 查看所有用户:
- 查看特定会话的状态:
loginctl session-status [SESSION_ID]
- 强制锁定当前会话(如果桌面环境支持):
- 强制终止某个用户的会话:
loginctl kill-user [USERNAME]
配置文件:logind.conf
服务的行为可以通过编辑 /etc/systemd/logind.conf 文件来修改。这在服务器和笔记本电脑配置中非常有用。
常见配置项说明:
[Login]
# 处理笔记本合盖事件
# 选项: ignore(忽略), poweroff(关机), reboot(重启), halt(挂起), suspend(休眠), hibernate(冬眠)
# HandleLidSwitch=suspend <-- 默认通常是休眠
HandleLidSwitch=ignore <-- 服务器或作为家用服务器的笔记本常用,合盖不休眠
# 处理电源键按下事件
HandlePowerKey=poweroff <-- 默认按下关机
# HandlePowerKey=ignore <-- 防止误触关机
# 处理长按电源键
HandlePowerKeyLongPress=reboot
# 系统空闲多久后自动操作
# IdleAction=ignore
# IdleActionSec=30min
修改配置后,需要重启服务生效:
sudo systemctl restart systemd-logind
为什么它很重要?
- 统一性: 它提供了一个标准接口(通过 D-Bus),供显示管理器(如 GDM, SDDM)和桌面环境(GNOME, KDE)查询用户状态和请求电源操作(关机/重启)。
- 无特权运行: 桌面环境不需要 root 权限就可以请求关机或挂起,它们只需向
systemd-logind 发送请求,由 logind 根据 PolicyKit 策略决定是否执行。
- Cgroups 集成: 它利用 Linux Control Groups (cgroups) 来组织用户进程。如果你运行
systemd-cgls,你会看到 user slice 下面清晰地按用户和会话分类。
总结
systemd-logind 是 Linux 系统幕后的管家。它不仅负责记录谁在登录,还掌管着笔记本合盖、电源键响应以及确保当前坐在电脑前的用户能听到声音、看到画面。对于系统管理员来说,它是配置电源行为和管理用户进程的重要入口。