Contents

systemd

loginctl

在 loginctl 的世界里,User(用户)、Session(会话)和 Seat(座位)这三个概念共同构成了 systemd 对用户登录和硬件资源的管理框架。

可以把它们的关系理解为:一个 User 在一个 Seat 上,可以开启一个或多个 Session

下面为你逐一详细解释。

1. Seat(座位)

核心定义:一个物理意义上的硬件组合,至少包含一个键盘和一个显示器。简单说,就是一台能让人坐下来的“电脑”终端。

  • 最小单位:一个 Seat 至少必须连接一个键盘和一个鼠标/显示器。只有串口的设备不算。

  • 命名规则:通常命名为 seat0(本地座位)。多座位时可以是 seat1seat2

  • 主要作用:解决“多用户同时使用一台主机”的问题。例如,一台主机上插了两套键盘鼠标、接了两个显示器,你就可以用 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 一次登录活动 c1c22 登录到登出 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 在为你服务。