1、Terminal Logins
Fig.1 Terminal Logins
注1:终端登录的简略过程,不在乎终端是字符,图形模拟字符还是图
形终端
注2:系统启动程序结束后,内核创建进程ID为1的init进程。init
读取终端配置文件,为每一个终端做1个fork,跟随一个exec
启动getty允许登录
注3:getty打开终端进行读写(设置fd0,1,2),输出类似login:
的字符等待用户输入用户名。最后getty读取/etc/inittab
触发login程序,有点像: execle(“/bin/login",
"login", "-p", username, (char *)0, envp); 并读
取/etc/inittab初始化环境变量
注4:因为原始的init拥有超级用户权限ID为1,所以init,getty,
login也继承了这些特性
注5:login程序,它有了用户名之后,会调用getpwnam获取密码
文件入口;调用getpass在终端显示字符串 Password: 并读取
输入的密码;调用crypt加密密码与shadow密码的pw_passwd比
较;
如果登录错误,login会调用exit(1),终端会通知父进程init
init会做另外一个fork,exec,getty再来一次
如果登录成功,login会
调用chdir登录到home目录
调用chown把终端归属给该用户,并改变终端的访问权限供用户
读写
调用setgid和initgroups设置group IDs
初始化环境变量$HOME $SHELL $USER $LOGINAME $PATH等
调用setuid改变到登录用户ID并触发login shell
(execl("/bin/sh", "-sh", (char *)0);)
注6:login shell读取自启动文件.bashrc等改变和设置环境变量
2、Network Logins
Fig.2 Network Logins
注1:通过serial terminal和通过network登录系统最大的不同是
终端和计算机之间不是点到点的;通过网络的时候,login只是
一个可以获取的服务,就像其他FTP STMP服务一样
注2:网络登录时,所有的登录都是通过内核的network interface
drivers(e.g.,The Ethernet driver);为了让相同的软件
既能通过网络,也能通过终端登录,一个叫pseudo terminal
的软件驱动被用于模仿serial terminal的behavior并映射终
端操作和网络操作
注3:系统启动时,init触发shell并执行shell脚本/etc/rc,
/etc/rc脚本中会触发叫xinetd的daemon,脚本结束xinetd
的父进程就是init
注4:xinetd等待到达该主机的TCP/IP连接请求,有连接的时候用
fork和exec处理并启动相应程序
阅读(773) | 评论(0) | 转发(0) |