Linux在完成核內引導(已經被載入內存,開始運行,並已初始化所有的設備驅動程序和數據結構等)之后,就通過啟動一個用戶級程序init的方式來啟動其他用戶級的進程或服務.所以,init始終是第一個進程,其PID始終為1(ps -aux | less),它是系統所有進程的父進程.
內核會在過去曾使用過init的幾個地方查找它,它的正確位置(對Linux系統來說)是/sbin/init.如果內核找不到init,它就會試着運行/bin/sh,如果運行失敗,系統的啟動也會失敗.
init程序需要讀取配置文件/etc/inittab.inittab是一個不可執行的文本文件,它有若干行指令所組成.
本文就是在此前提下,來簡單分析一下inittab文件.
/etc/inittab文件中每個登記項的結構都是一樣的,共分為以冒號“:”分隔的4個字段.具體如下:
identifier : run_level : action : process
其中,各字段以及與其相關的說明如下:
identifier 登記項標識符,最多為4個字符.用於惟一地標識/etc/inittab文件中的每一個登記項
run_level 系統運行級,即執行登記項的init級別.用於指定相應的登記項適用於哪一個運行級,即在哪一個運行級中被處理.如果該字段為空,那么相應的登記項將適用於所有的運行級.在該字段中,可以同時指定一個或多個運行級,其中各運行級分別以數字0.1.2.3.4.5.6或字母a、b、c表示,且無需對其進行分隔.
action 動作關鍵字.用於指定init(M)命令或進程對相應進程(在“process”字段定義)所實施的動作.具體動作包括:
- boot:只有在引導過程中,才執行該進程,但不等待該進程的結束;當該進程死亡時,也不重新啟動該進程.
- bootwait:只有在引導過程中,才執行該進程,並等待進程的結束:當該進程死亡時,也不重新啟動該進程.實際上,只有在系統被引導后,並從單用戶方式進入多用戶方式時,這些登記項才被處理;如果系統的默認運行級設置為2(即多用戶方式),那么這些登記項在系統引導后將馬上被處理.
- initdefault:指定系統的默認運行級.系統啟動時,init將首先查找該登記項.如果存在init將據此決定系統最初要進入的運行級.具體來說,init將指定登記項“run_level"字段中的最大數字(即最高運行級)為當前系統的默認運行級;如果該字段為空,那么將其解釋為“0123456”,並以“6”作為默認運行級.如果不存在該登記項,那么init將要求用戶在系統啟動時指定一個最初的運行級.
- off:如果相應的進程正在運行,那么就發出一個警告信號,等待20秒后,再通過殺死信號強行終止該進程.如果相應的進程並不存在那么就忽略該登記項.
- once:啟動相應的進程,但不等待該進程結束便繼續處理/etc/inittab文件中的下一個登記項;當該進程死亡時,init也不重新啟動該進程.注意:在從一個運行級進入另一個運行級時,如果相應的進程仍然在運行,那么init就不重新啟動該進程.
- ondemand:與“respawn”的功能完全相同,但只用於運行級為a、b或c的登記項.
- powerfail:只在init接收到電源失敗信號時執行相應的進程,但不等待該進程結束.
- powerwait:只在init接收到電源失敗信號時執行相應的進程,並在繼續對/etc/inittab文件進行任何處理前等待該進程結束.
- respawn:如果相應的進程還不存在,那么init就啟動該進程,同時不等待該進程的結束就繼續掃描/etc/inittab文件;當該進程死亡時,init將重新啟動該進程.如果相應的進程已經存在,那么init將忽略該登記項並繼續掃描/etc/inittab文件.
- sysinit:只有在啟動或重新啟動系統並首先進入單用戶時,init才執行這些登記項.而在系統從運行級1-6進入單用戶方式時,init並不執行這些登記項."action”字段為“sysinit”的登記項在“run_level”字段不指定任何運行級.
- wait:啟動進程並等待其結束,然后再處理/etc/inittab文件中的下一個登記項.
process 所要執行的shell命令.任何合法的shell語法均適用於該字段.