Linux中的tty与login之间的关系
agetty
进程和 login
进程之间的关系:
一、简要概括
-
agetty
是登录前的终端初始化程序。 -
login
是处理用户登录认证的程序。 -
关系:
agetty
启动后等待用户输入用户名,然后调用login
进程进行用户认证。
二、详细过程
1. agetty
的作用
-
agetty
是getty
(get tty)程序的一个实现,通常由systemd
或传统的init
进程启动。 -
它监听某个终端(如
/dev/tty1
、ttyS0
、ttyUSB0
); -
等待用户输入;
-
当用户开始交互时,它显示类似:
CentOS release 7.9 (Final) tty1 login:
-
然后它捕获用户名,并执行下一步:
2. agetty
启动 login
-
一旦
agetty
捕获了用户名,它就调用/bin/login
或/usr/bin/login
(系统依赖不同)。 -
agetty
通过exec()
系列函数 替换自身,将控制权交给login
程序。
3. login
的作用
-
login
接手终端控制; -
提示用户输入密码;
-
验证用户名和密码;
-
验证通过后,设置用户环境(如
$HOME
,$SHELL
,$PATH
),并执行用户 shell(如bash
); -
登录完成后,用户就拥有一个登录 shell。
三、进程关系图(简化)
systemd/init └── /sbin/agetty /dev/tty1 └── exec -> /bin/login└── exec -> /bin/bash (登录成功后)
四、总结
项目 | /sbin/agetty | login |
---|---|---|
角色 | 启动登录界面、捕获用户名 | 用户身份认证,启动用户 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
[Service]
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
解释:
-
%I
会被替换为终端设备(如tty1
)。 -
$TERM
是终端类型(如linux
)。 -
--noclear
表示不清屏。
启动方式
systemd 会为每个终端生成实例:
systemctl start getty@tty1.service
开机自动启动:
systemctl enable getty@tty1.service
二、实际进程关系(使用 ps
或 pstree
)
示例命令一:pstree -p
pstree -p
部分输出可能如下:
systemd(1)─┬─agetty(1234)───login(1256)───bash(1270) └─...
解释:
-
agetty(1234)
是在/dev/tty1
上运行的; -
用户开始交互后,
agetty
被login(1256)
替换; -
登录成功后,
login
被用户 shell(如bash(1270)
)替换。
示例命令二:ps -ef | grep tty1
ps -ef | grep tty1
在登录前,看到:
root 1234 1 0 10:00 tty1 00:00:00 /sbin/agetty --noclear tty1 linux
当你输入用户名并登录时,agetty
会被 login
替换,然后再被 shell 替换。此时你可能看到:
root 1270 1256 0 10:01 tty1 00:00:00 -bash
补充知识:agetty
替换 login
的方式
agetty 最终通过调用类似下面的代码来运行 login
:
execl("/bin/login", "login", (char *)NULL);
这个调用会用 login
进程替换 agetty
的镜像,因此它们不会同时存在。
如你希望看到你自己系统上的实际效果,可以:
# 查看所有 agetty 相关的进程
ps -ef | grep agetty
# 查看当前终端是 tty 几(如果是本地)
tty