You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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会继承这些变量,让后续进程能感知当前会话的归属。
  • 执行logoutsystemctl suspend等操作时,shell或工具会通过D-Bus调用logind的接口,logind会通知相关getty或会话进程处理。

四、命令行登录到bash的交互流程

  1. 系统启动完成后,systemd根据getty@.service模板,为每个虚拟终端(如tty1)启动对应的getty进程。此时getty绑定/dev/tty1,输出登录提示符(login:)等待用户输入,这一步仅getty工作,未与logind交互
  2. 用户输入用户名和密码,getty调用PAM进行验证。PAM中的pam_systemd模块向systemd-logind发送信号,请求创建新用户会话,此时首次与logind交互
  3. logind收到请求后,创建会话记录、分配会话ID,设置好会话的资源限制和环境变量,随后通知PAM验证通过。
  4. getty收到PAM的验证成功信号后,启动用户默认shell(如bash),并将logind设置的环境变量传递给bash,此时bash继承会话信息,后续若需访问特定设备等操作,会间接与logind交互
  5. 用户在bash中操作直到执行exitlogout,bash进程终止。getty收到shell退出信号后,再次通过PAM通知logind销毁该会话,第二次与logind交互
  6. logind清理会话资源、更新在线用户列表,getty重新输出登录提示符,等待下一次登录。

内容的提问来源于stack exchange,提问作者Experiments Bel'

火山引擎 最新活动