马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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/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
- [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
部分输出大概如下:- systemd(1)─┬─agetty(1234)───login(1256)───bash(1270)
- └─...
复制代码 解释:
- agetty(1234) 是在 /dev/tty1 上运行的;
- 用户开始交互后,agetty 被 login(1256) 替换;
- 登录成功后,login 被用户 shell(如 bash(1270))替换。
示例命令二: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
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |