linux終端啓動過程

首先,每一個進程都有一個父進程(初始化內核進程一般是本身的父進程);
當子進程終止時會通知父進程, 從而父進程能夠獲取子進程的退出狀態.
系統管理員建立一個文件, 一般叫/etc/ttys, 每行一個終端設備.每行都包含了設備的名字和傳給getty的參數(好比波特率).當系統引導時,內核建立進程ID 1, 即init進程. 它把系統帶到多用戶狀態.
init進程讀取/etc/ttys, 並對每一個終端設備都容許一個登陸, 經過getty的exec進行一個fork, 如上圖所示.
getty(包括getty)之上的進程,其real user ID和effective user ID都是0.
getty負責對終端設備調用open. 一旦設備唄打開, 文件描述符0, 1, 2就相應地設置了. 同時getty輸出像login:   這樣的字符,等待用戶輸入用戶名.  若是終端支持多種速率, getty能夠經過偵測特殊字符來告訴終端改變波特率.
當咱們輸入用戶名,getty的工做就完成了,它將會觸發login程序(默認爲login, 可在gettytab文件中修改), 有點像:
execle("/bin/login", "login", "-p", username, (char *)0, envp);
init所觸發的getty是空環境的,因此getty必須爲login建立一個帶有終端名字的環境(envp變量), 其環境參數都列舉在gettytab文件中.  "-p"用於告訴login保存被傳遞的環境參數,增長上去, 而不是取代.
由於exec不會改變進程ID, 因此除了原始的init,其餘的進程都有一個ID爲1的父進程
login程序在有用用戶名以後, 它能告訴getpwnam來獲取密碼文件的入口. 而後, login調用getpass來顯示Password: 同時讀取密碼(固然得關閉echoing). 而後login調用crypt來加密密碼並把加密的結果與shadow密碼文件的pw_passwd域像比較; 若發生錯誤, login調用exit(經過getty的exec作一個fork), 重啓程序.
以上所說是傳統的UNIX系統認證過程, 現代的UNIX系統已經演化到支持多認證過程. 好比FreeBSD, Linux, Mac OS X, 和Solaris都支持PAM(pluggable Authentication Module). 管理員經過使用PAM庫來對訪問的服務配置相應的認證方法.
若是登陸成功,login將會:
  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);
固然login還作了不少其餘的工做, 好比打印message-of-the-day文件, 檢查新郵件等等.
shell的父進程是最初的init(進程ID爲1). 因此當shell關閉時, init會收到一個SIGCHLD的信號.
而後shell讀取啓動文件.profile .bash_profile. 這些啓動文件一般會改變一些環境變量並增長一些環境變量.
最終咱們獲得了shell的提示符, 從而可以輸出命令
LINUX與之不一樣的是/etc/inittab包含了init啓動一個getty進程所需的配置信息,跟SYSTEM V相似. 根據不一樣版本的getty, 終端特性由命令行(用agetty時)指定或者由文件/etc/gettydefs指定(用mgetty時).
相關文章
相關標籤/搜索