Linux啟動指令碼執行順序
1.一般核心啟動後。
①先識別儲存器分割槽,根據root=/dev/block/mtd/mmcblk0p6這樣的的引數掛載檔案系統
②執行檔案系統中的init=/sbin/init執行啟動指令碼
③一般這個時候指令碼中可能會有分割槽識別指令碼,將分割槽再識別一次,或者重新掛載nfs(當然,直接在root=nfs,讓核心去掛載網路檔案系統也是可以的)
2.一般Linux的RunLevel
Linux系統有7個執行級別(runlevel)
執行級別0:系統停機狀態,系統預設執行級別不能設為0,否則不能正常啟動
執行級別1:單使用者工作狀態,root許可權,用於系統維護,禁止遠端登陸
執行級別2:多使用者狀態(沒有NFS)
執行級別3:完全的多使用者狀態(有NFS),登陸後進入控制檯命令列模式
執行級別4:系統未使用,保留
執行級別5:X11控制檯,登陸後進入圖形GUI模式
執行級別6:系統正常關閉並重啟,預設執行級別不能設為6,否則不能正常啟動
3.Ubuntu的RunLevel
執行級別0:系統停機狀態,系統預設執行級別不能設為0,否則不能正常啟動
執行級別1:單使用者工作狀態,root許可權,用於系統維護,禁止遠端登陸
執行級別2:多使用者GUI
執行級別3:多使用者GUI
執行級別4:多使用者GUI
執行級別5:多使用者GUI
執行級別6:系統正常關閉並重啟,預設執行級別不能設為6,否則不能正常啟動
4.舊式System V initialization啟動流程:
①執行第一個程序/sbin/init,找到/etc/inittab;
②根據inittab首先執行/etc/rcS.d/;
③隨後根據“id:5:initdefault”,設定runlevel(這裡為5),並根據runlevel執行/etc/init.d/rc 5,這個命令會找到/etc/rc5.d/,執行其中的指令碼,這些指令碼實際是/etc/init.d/目錄下指令碼的軟連線,可能根據傳入的檔名作為引數執行相應動作,類似busybox,這些指令碼以S開頭的為啟動的意思,以K開頭的為停止。並且S/K後面的兩位數數字代表了服務的啟動順序。
5.Ubuntu啟動指令碼執行流程:
使用upstart啟動流程,並且相容System V初始化。
①.首先,/sbin/init程序首先找到/etc/init/目錄下的rc-sysinit.conf、rc.conf、、rcS.conf,rc-sysinit在startup事件發生時被啟動,rc在系統runlevel變化時被啟動,rcS在系統runlevel為S時啟動。
②.其中rc-sysinit.conf的主要工作是檢測是否存在/etc/inittab或核心命令列,若存在,則按核心命令列>/etc/inittab>預設runlevel的順序設定系統 runlevel,不存在則忽略。
③.隨後rc-sysinit.conf主動呼叫/etc/init.d/rcS,其作用就是呼叫/etc/rcS.d目錄下的指令碼;
④.之後rc-sysinit.conf設定系統預設runlevel(2),由於runlevel變化,rc.conf和rcS.conf服務啟動,其中rc.conf最後會執行“exec /etc/init.d/rc
綜合上述描述,系統登入之前的指令碼主要有:/etc/rcS.d -> /etc/rc2.d/ -> /etc/rc.local,這些目錄下的指令碼一般以數字開頭,數字越小越先被執行。
6.Ubuntu各個時間段執行的指令碼:
①.啟動過程最後會呼叫/etc/rc.local;
②.使用者登入先執行全域性登入指令碼/etc/enviroment->/etc/profile,然後在使用者目錄按順序查詢三個特殊檔案中的一個:.bash_profile、.bash_login、.profile;但只執行先找到的一個;
③.退出登入時執行使用者目錄的.bash_logout;