Linux中的tty与login之间的关系

[复制链接]
发表于 2025-7-30 23:47:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
agetty 进程和 login 进程之间的关系:

一、简要概括


  •         agetty 是登录前的终端初始化程序。
  •         login 是处理用户登录认证的程序。
  •         关系:agetty 启动后等待用户输入用户名,然后调用 login 进程进行用户认证。

二、具体过程

1. agetty 的作用


  •         agetty 是 getty(get tty)程序的一个实现,通常由 systemd 或传统的 init 进程启动。
  •         它监听某个终端(如 /dev/tty1、ttyS0、ttyUSB0);
  •         等待用户输入;
  •         当用户开始交互时,它表现雷同:
    1. CentOS release 7.9 (Final)
    2. tty1 login:
    复制代码
  •         然后它捕获用户名,并执行下一步:
2. agetty 启动 login


  •         一旦 agetty 捕获了用户名,它就调用 /bin/login 或 /usr/bin/login(体系依靠不同)。
  •         agetty 通过 exec() 系列函数 替换自身,将控制权交给 login 程序。
3. login 的作用


  •         login 接手终端控制;
  •         提示用户输入密码;
  •         验证用户名和密码;
  •         验证通过后,设置用户环境(如 $HOME, $SHELL, $PATH),并执行用户 shell(如 bash);
  •         登录完成后,用户就拥有一个登录 shell。

三、进程关系图(简化)
  1. systemd/init
  2.     └── /sbin/agetty /dev/tty1
  3.             └── exec -> /bin/login
  4.                   └── exec -> /bin/bash (登录成功后)
复制代码

四、总结

项目/sbin/agettylogin角色启动登录界面、捕获用户名用户身份认证,启动用户 shell运行时机体系启动后由 systemd/init 启动由 agetty 调用,完成认证替换关系agetty 被 login 替换login 被用户的 shell 替换如果你使用 ps 或 pstree 检察,会看到 agetty 和 login 不会同时存在于同一个终端上。

联合 ps 和 systemd 配置文件举例

我们通过两个部分来举例说明:

  •         systemd 配置如何启动 agetty
  •         ps / pstree 实际表现 agetty 和 login 的进程关系

一、systemd 中如何启动 agetty

在基于 systemd 的体系(如 CentOS 7、RHEL 7+、Ubuntu 16.04+)中,agetty 是由 systemd 的 getty@.service 单元管理的。
示例文件:/usr/lib/systemd/system/getty@.service
  1. [Service]
  2. ExecStart=-/sbin/agetty --noclear %I $TERM
  3. Type=idle
  4. Restart=always
复制代码
解释:

  •         %I 会被替换为终端设备(如 tty1)。
  •         $TERM 是终端范例(如 linux)。
  •         --noclear 表示不清屏。
启动方式

systemd 会为每个终端生成实例:
  1. systemctl start getty@tty1.service
复制代码
开机自动启动:
  1. systemctl enable getty@tty1.service
复制代码

二、实际进程关系(使用 ps 或 pstree)

示例命令一:pstree -p
  1. pstree -p
复制代码
部分输出大概如下:
  1. systemd(1)─┬─agetty(1234)───login(1256)───bash(1270)
  2.            └─...
复制代码
解释:

  •         agetty(1234) 是在 /dev/tty1 上运行的;
  •         用户开始交互后,agetty 被 login(1256) 替换;
  •         登录成功后,login 被用户 shell(如 bash(1270))替换。
示例命令二:ps -ef | grep tty1
  1. ps -ef | grep tty1
复制代码
在登录前,看到:
  1. root 1234 1 0 10:00 tty1 00:00:00 /sbin/agetty --noclear tty1 linux
复制代码
当你输入用户名并登录时,agetty 会被 login 替换,然后再被 shell 替换。此时你大概看到:
  1. root 1270 1256 0 10:01 tty1 00:00:00 -bash
复制代码

增补知识:agetty 替换 login 的方式

agetty 最终通过调用雷同下面的代码来运行 login:
  1. execl("/bin/login", "login", (char *)NULL);
复制代码
这个调用会用 login 进程替换 agetty 的镜像,因此它们不会同时存在。

如你希望看到你自己体系上的实际效果,可以:
  1. # 查看所有 agetty 相关的进程
  2. ps -ef | grep agetty
  3. # 查看当前终端是 tty 几(如果是本地)
  4. tty
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表