Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567111
  • 博文数量: 287
  • 博客积分: 27
  • 博客等级: 民兵
  • 技术积分: 547
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-01 20:20
文章分类

全部博文(287)

文章存档

2015年(1)

2014年(95)

2013年(90)

2012年(101)

分类:

2012-05-21 21:50:19

原文地址:Linux login 过程浅析 作者:今生路人甲

    本文只关注用户login过程。我相信做每件事情都有原因,有时候很单纯,有时候很复杂。我写这篇博客不是为了学习,而是为了工作。工作才是驱动我做这件事情的动力。我的原因是我添加了个用户,出现了一个情形,有的添加用户home目录下有.bashrc等相关文件,有的则没有,机型基本一样,添加命令是同一个,真是个懊恼的问题。
    系统启动过程,略去我们关注一个文件/etc/inittab,这里我们关注这几行:

点击(此处)折叠或打开

  1. # Run gettys in standard runlevels
  2. 1:2345:respawn:/sbin/mingetty tty1
  3. 2:2345:respawn:/sbin/mingetty tty2
  4. 3:2345:respawn:/sbin/mingetty tty3
  5. 4:2345:respawn:/sbin/mingetty tty4
  6. 5:2345:respawn:/sbin/mingetty tty5
  7. 6:2345:respawn:/sbin/mingetty tty6
这里告诉我们有6个字符终端,可以供我们使用,从tty1到tty6,第一个字段是终端序号,第二个代表系统运行级别,我现在运行在3下面,那我ps就可以看到可以登录的终端:

点击(此处)折叠或打开

  1. root 3385 0.0 0.0 1664 472 tty1 Ss+ 19:31 0:00 /sbin/mingetty
  2. root 3386 0.0 0.0 1664 472 tty2 Ss+ 19:31 0:00 /sbin/mingetty
  3. root 3387 0.0 0.0 1664 468 tty3 Ss+ 19:31 0:00 /sbin/mingetty
  4. root 3388 0.0 0.0 1664 476 tty4 Ss+ 19:31 0:00 /sbin/mingetty
  5. root 3389 0.0 0.0 1664 476 tty5 Ss+ 19:31 0:00 /sbin/mingetty
  6. root 3390 0.0 0.0 1664 476 tty6 Ss+ 19:31 0:00 /sbin/mingetty
当我们使用终端登录进去后我们发现其中的一个进程消失了。

点击(此处)折叠或打开

  1. root 3993 1 0 May14 tty2 00:00:00 /sbin/mingetty tty2
  2. root 3994 1 0 May14 tty3 00:00:00 /sbin/mingetty tty3
  3. root 3995 1 0 May14 tty4 00:00:00 /sbin/mingetty tty4
  4. root 3996 1 0 May14 tty5 00:00:00 /sbin/mingetty tty5
  5. root 3997 1 0 May14 tty6 00:00:00 /sbin/mingetty tty6
tty1哪去了,实际上tty1 进程掉用了login程序,tty1退出了,我们通过ps我们可以看到login进程。

点击(此处)折叠或打开

  1. root 7735 1 0 11:09 ? 00:00:00 login -- root
  2. root 7781 7735 0 11:17 tty1 00:00:00 \_ -bash
我们看到login使用root用户,并且产生了子进程bash。
首先login的过程中,如果我们输入的用户名或者密码错误,那登陆就不会成功,这是显而易见的。
所以登陆过程分为3步:
  1. 验证用户名密码
  2. 获取初始化环境
  3. 为用户启动shell
  4. 初始化shell环境
初始化shell环境主要做的事情:
  1. 转到我们的home目录(chdir)
  2. 把终端的所有权改成用户的(chown)
  3. 改变终端的访问权限,以使用户可以读写
  4. 通过setgid和initgroup来设置用户的group IDs
  5. 用login所有的信息初始化环境: HOME, SHELL, USER LOGNAME, PATH
  6. 改变我们的user ID(通过setuid), 同时触发登录的shell------execl("/bin/sh", "-sh", (char *)0);
到此登陆完成。
阅读(434) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~