Linux系统中getty与systemd-logind的协作及架构问题问询
Linux下getty与systemd-logind的区别、关联及交互流程
一、核心职能差异
- getty:终端会话的前端处理程序,负责绑定物理/虚拟终端(如
tty1-tty6),输出登录提示符,接收用户名密码,验证通过后启动用户shell。它是终端层面的会话入口,每个终端对应一个独立的getty实例。 - systemd-logind:系统级的会话管理中枢,负责全系统所有用户登录会话的生命周期管理(涵盖本地终端、远程SSH、图形会话等),处理用户权限切换、会话锁定/解锁、设备访问控制、电源管理关联等,是全局会话状态的管理者。
二、架构特点
getty的架构
- 在systemd环境中,getty以模板服务(
getty@.service)的形式存在,针对每个终端(如tty1)实例化为独立的服务进程。 - 直接绑定对应的终端设备文件(
/dev/ttyX),无需监听网络或套接字,核心工作是与终端设备交互,等待用户输入。 - 验证用户名密码时会调用
pam模块,通过pam间接与systemd-logind通信。
systemd-logind的架构
- 作为常驻系统服务(
systemd-logind.service),监听D-Bus系统总线(org.freedesktop.login1接口),所有需要会话管理的进程(getty、sshd、图形登录管理器等)都通过D-Bus向它发送请求或接收通知。 - 维护系统中所有会话、用户、seat(对应一套物理输入输出设备)的状态数据库,提供查询、操作接口。
- 无需直接与终端设备交互,仅通过D-Bus接收来自getty等程序的会话创建/销毁通知。
三、关联与协作方式
- getty启动后,用户成功登录时,会通过PAM模块中的
pam_systemd向systemd-logind发送会话创建请求,logind会记录该会话的所属用户、终端、seat等信息,并分配会话ID。 - 用户退出shell时,getty进程终止,会再次通过PAM通知logind销毁该会话,logind随即清理相关状态,比如释放用户资源、更新在线用户列表。
- logind会为会话设置资源限制、环境变量(如
XDG_SESSION_ID),getty启动的shell会继承这些变量,让后续进程能感知当前会话的归属。 - 执行
logout、systemctl suspend等操作时,shell或工具会通过D-Bus调用logind的接口,logind会通知相关getty或会话进程处理。
四、命令行登录到bash的交互流程
- 系统启动完成后,systemd根据
getty@.service模板,为每个虚拟终端(如tty1)启动对应的getty进程。此时getty绑定/dev/tty1,输出登录提示符(login:)等待用户输入,这一步仅getty工作,未与logind交互。 - 用户输入用户名和密码,getty调用PAM进行验证。PAM中的
pam_systemd模块向systemd-logind发送信号,请求创建新用户会话,此时首次与logind交互。 - logind收到请求后,创建会话记录、分配会话ID,设置好会话的资源限制和环境变量,随后通知PAM验证通过。
- getty收到PAM的验证成功信号后,启动用户默认shell(如bash),并将logind设置的环境变量传递给bash,此时bash继承会话信息,后续若需访问特定设备等操作,会间接与logind交互。
- 用户在bash中操作直到执行
exit或logout,bash进程终止。getty收到shell退出信号后,再次通过PAM通知logind销毁该会话,第二次与logind交互。 - logind清理会话资源、更新在线用户列表,getty重新输出登录提示符,等待下一次登录。
内容的提问来源于stack exchange,提问作者Experiments Bel'




