本文只关注用户login过程。我相信做每件事情都有原因,有时候很单纯,有时候很复杂。我写这篇博客不是为了学习,而是为了工作。工作才是驱动我做这件事情的动力。我的原因是我添加了个用户,出现了一个情形,有的添加用户home目录下有.bashrc等相关文件,有的则没有,机型基本一样,添加命令是同一个,真是个懊恼的问题。
系统启动过程,略去我们关注一个文件/etc/inittab,这里我们关注这几行:
- # Run gettys in standard runlevels
- 1:2345:respawn:/sbin/mingetty tty1
- 2:2345:respawn:/sbin/mingetty tty2
- 3:2345:respawn:/sbin/mingetty tty3
- 4:2345:respawn:/sbin/mingetty tty4
- 5:2345:respawn:/sbin/mingetty tty5
- 6:2345:respawn:/sbin/mingetty tty6
这里告诉我们有6个字符终端,可以供我们使用,从tty1到tty6,第一个字段是终端序号,第二个代表系统运行级别,我现在运行在3下面,那我ps就可以看到可以登录的终端:
- root 3385 0.0 0.0 1664 472 tty1 Ss+ 19:31 0:00 /sbin/mingetty
- root 3386 0.0 0.0 1664 472 tty2 Ss+ 19:31 0:00 /sbin/mingetty
- root 3387 0.0 0.0 1664 468 tty3 Ss+ 19:31 0:00 /sbin/mingetty
- root 3388 0.0 0.0 1664 476 tty4 Ss+ 19:31 0:00 /sbin/mingetty
- root 3389 0.0 0.0 1664 476 tty5 Ss+ 19:31 0:00 /sbin/mingetty
- root 3390 0.0 0.0 1664 476 tty6 Ss+ 19:31 0:00 /sbin/mingetty
当我们使用终端登录进去后我们发现其中的一个进程消失了。
- root 3993 1 0 May14 tty2 00:00:00 /sbin/mingetty tty2
- root 3994 1 0 May14 tty3 00:00:00 /sbin/mingetty tty3
- root 3995 1 0 May14 tty4 00:00:00 /sbin/mingetty tty4
- root 3996 1 0 May14 tty5 00:00:00 /sbin/mingetty tty5
- root 3997 1 0 May14 tty6 00:00:00 /sbin/mingetty tty6
tty1哪去了,实际上tty1 进程掉用了login程序,tty1退出了,我们通过ps我们可以看到login进程。
- root 7735 1 0 11:09 ? 00:00:00 login -- root
- root 7781 7735 0 11:17 tty1 00:00:00 \_ -bash
我们看到login使用root用户,并且产生了子进程bash。
首先login的过程中,如果我们输入的用户名或者密码错误,那登陆就不会成功,这是显而易见的。
所以登陆过程分为3步:
- 验证用户名密码
- 获取初始化环境
- 为用户启动shell
- 初始化shell环境
初始化shell环境主要做的事情:
- 转到我们的home目录(chdir)
- 把终端的所有权改成用户的(chown)
- 改变终端的访问权限,以使用户可以读写
- 通过setgid和initgroup来设置用户的group IDs
- 用login所有的信息初始化环境: HOME, SHELL, USER LOGNAME, PATH
- 改变我们的user ID(通过setuid), 同时触发登录的shell------execl("/bin/sh", "-sh", (char *)0);
到此登陆完成。
阅读(12802) | 评论(2) | 转发(1) |