loginctl
在 loginctl 的世界里,User(用户)、Session(会话)和 Seat(座位)这三个概念共同构成了 systemd 对用户登录和硬件资源的管理框架。
可以把它们的关系理解为:一个 User 在一个 Seat 上,可以开启一个或多个 Session。
下面为你逐一详细解释。
1. Seat(座位)
核心定义:一个物理意义上的硬件组合,至少包含一个键盘和一个显示器。简单说,就是一台能让人坐下来的“电脑”终端。
-
最小单位:一个 Seat 至少必须连接一个键盘和一个鼠标/显示器。只有串口的设备不算。
-
命名规则:通常命名为
seat0(本地座位)。多座位时可以是seat1,seat2。 -
主要作用:解决“多用户同时使用一台主机”的问题。例如,一台主机上插了两套键盘鼠标、接了两个显示器,你就可以用
loginctl attach命令把特定显卡和输入设备分配给seat0,另一些设备分配给seat1,这样两个人可以同时独立地登录并使用这台电脑,互不干扰。
你可以如何用它:查看当前座位 loginctl seat-status seat0;或者将设备分配给某个座位 loginctl attach seat1 /sys/devices/...。
2. User(用户)
核心定义:登录到系统的用户账户实例。同一个用户账户,即使登录多次,在 loginctl 中也只对应一个 User 对象。
-
生命周期:从该用户的第一个会话开始时创建,到该用户的最后一个会话结束时销毁。
-
用户管理器:每个
User背后,systemd 会启动一个独立的user@<UID>.service用户级 systemd 实例,用于管理该用户的专属进程(如systemd --user)。
你可以如何用它:查看所有用户 loginctl list-users;终止某个用户的所有会话 loginctl terminate-user <用户名>。
3. Session(会话)
核心定义:用户的一次具体的登录活动。它是 User 和 Seat(如果存在)之间的一个“连接”实例。
-
主要特征:
-
类型:通常分为
tty(本地文本控制台)、x11(传统图形会话)、wayland(新式图形会话)、remote(远程登录,如 SSH)。 -
状态:分为
active(该会话是当前正在用的,Seat 的焦点)和online(后台会话,没有键盘焦点)。 -
Idle 状态:会话空闲一段时间后(例如键盘鼠标没动),可变为空闲状态。
-
-
Service:每个会话对应一个
session-<ID>.scope单元,用于管理该会话下的所有进程。
你可以如何用它:查看当前所有会话 loginctl list-sessions;锁定会话屏幕 loginctl lock-session <ID>;终止会话 loginctl terminate-session <ID>。
总结与对比
为了方便你快速区分,可以用下面这个表格来对比它们的核心特点:
| 概念 | 核心含义 | 关键标识 | 生命周期 | 举例 |
|---|---|---|---|---|
| Seat | 物理硬件集合 | seat0 |
开机到关机 | 一套键鼠+显示器 |
| User | 登录账户 | UID (1000) | 首次登录到最后一次登出 | 用户 alice |
| Session | 一次登录活动 | c1, c2, 2 |
登录到登出 | alice 在 seat0 上登录了图形界面 |
一个直观的类比
想象一下你去一家网吧(Seat):
-
Seat:网吧里的一个机位。它包含一套固定的设备:一台电脑、一台显示器、一副键盘和鼠标。
-
User:你(网吧会员)。你有自己的会员卡号(用户ID)。
-
Session:你的一次上机过程。你刷卡开机(创建Session),开始上网打游戏(Active Session)。中途你可能切到后台去点个外卖(进程仍在运行,但不是焦点),但还没下机。最后你下机结账(Session结束)。
特殊的SSH情况:
如果通过 ssh 远程登录,因为没有使用本地的键盘和显示器,所以这个 Session 不属于任何 Seat(Seat 字段为空)。但它仍然必须属于一个 User。
常用命令速查
# 查看当前所有座位、用户、会话的状态概览
loginctl
# 查看特定座位的详细信息(包含该座位下的所有会话)
loginctl seat-status seat0
# 查看特定用户的所有会话
loginctl user-status <用户名>
# 查看当前会话的详细信息
loginctl session-status
# 切换到另一个会话(使该会话成为 Active 状态)
loginctl activate <会话ID>
# 杀死某个会话的所有进程
loginctl kill-session <会话ID>
理解 Seat 的关键在于它是为了支持多席位而存在的硬件抽象。对绝大多数普通用户(单用户、单机位)来说,你只需要知道:
-
User 是你自己。
-
Session 是你当前这一次登录(比如图形界面下的一个终端)。
-
你背后有一个默认的 Seat0 在为你服务。