UNIX 和 Linux 系統上的初始化程序
Init 是所有程序的父程序,由核心在系統引導過程中執行。它的主要作用是從儲存在/etc/inittab檔案中的指令碼建立程序。它通常包含條目,這些條目會導致 init 在使用者可以登入的每一行上生成 getty。它控制任何特定系統所需的自主程序。
讀取此檔案後,init 將確定每次執行級別中系統應如何設定,並設定預設執行級別。init 在為系統設定預設執行級別後啟動所有後臺程序。
執行級別
執行級別是系統的軟體配置,它只允許選定的程序組存在。為每個執行級別由 init 生成的程序在/etc/inittab檔案中定義。
Init 可以處於這八個執行級別之一:0-6 和S 或s。特權使用者可以透過執行telinit來更改執行級別,該命令向init傳送適當的訊號,告訴它要更改到哪個執行級別。
這裡:
0,1,6 - 保留的執行級別。
S 或 s 相同。
7-9 是有效的執行級別,儘管它們並沒有真正作為“傳統”Unix 變體記錄在案,因為它們未使用。執行級別 S 和 s 事實上是相同的。在內部,它們是同一執行級別的別名。
執行級別 | 功能 |
---|---|
0 | 停止系統 |
1 | 使系統進入單使用者模式 |
2 | 進入無網路的多使用者模式 |
3 | 進入有網路的多使用者模式 |
4 | 未使用 |
5 | 進入帶有網路和 X 視窗的多使用者模式 |
6 | 重啟系統 |
S 或 s | 不直接使用。 |
啟動
在核心引導序列的最後一步呼叫 init 後,它會檢視檔案/etc/inittab中是否存在型別為initdefault的條目。initdefault條目確定系統的初始執行級別。如果沒有這樣的條目(或根本沒有/etc/inittab),則必須在系統控制檯中輸入執行級別。
更改執行級別
指定所有程序後,init 將等待其子程序之一死亡、電源故障訊號或直到telinit發出訊號以更改系統的執行級別。當上述三個條件之一發生時,它會重新檢查/etc/inittab檔案。
init 仍然等待上述三個條件之一發生。為了提供即時響應,telinit Q 或q 命令可以喚醒init以重新檢查/etc/inittab檔案。
如果 init 不處於單使用者模式並收到電源故障訊號 (SIGPWR),它將讀取檔案/etc/powerstatus。然後,它將根據此檔案的內容啟動命令:
標籤 | 描述 |
---|---|
F(AIL) | 電源即將失效,UPS 正在供電。執行powerwait和powerfail條目。 |
O(K) | 電源已恢復,執行powerokwait條目。 |
L(OW) | 電源即將失效,並且 UPS 電池電量不足。執行powerfailnow條目。 |
如果/etc/powerstatus包含除字母F、O或L之外的任何內容,或者不存在,則 init 將表現得好像它讀取了字母F。
不鼓勵使用SIGPWR和/etc/powerstatus。如果有人想要與init互動,應該使用/dev/initctl控制通道——有關此方面的更多文件,請參閱sysvinit包的原始碼。
當請求 init 更改執行級別時,它會向在新執行級別中未定義的所有程序傳送警告訊號SIGTERM。然後,它等待 5 秒鐘,然後再透過SIGKILL訊號強制終止這些程序。
Init 假設所有這些程序及其子程序都保留在 init 最初為它們建立的同一程序組中。如果任何程序更改其程序組關聯,則它將不會接收這些訊號。此類程序需要單獨終止。
TELINIT
/sbin/telinit連結到/sbin/init,它接受一個字元引數,並向init發出訊號以執行相應的操作。以下引數作為telinit的指令:
標籤 | 描述 |
---|---|
0,1,2,3,4,5 或 6 | 告訴init切換到指定的執行級別。 |
a, b, c | 告訴init僅處理/etc/inittab檔案中具有執行級別a、b或c的條目。 |
Q 或 q | 告訴init重新檢查/etc/inittab檔案。 |
S 或 s | 告訴init切換到單使用者模式。 |
U 或 u | 告訴init重新執行自身(保留狀態)。不會重新檢查/etc/inittab檔案。如果執行級別不是Ss12345之一,則請求將被靜默忽略。 |
它還可以告訴init在向程序傳送 SIGTERM 和 SIGKILL 訊號之間應等待多長時間。預設值為 5 秒,但這可以使用-t sec選項更改。
只有具有相應許可權的使用者才能呼叫telinit。
透過檢視其程序 ID,init 二進位制檔案檢查它是否是init或telinit;真正的 init 程序 ID 始終為1。因此,作為快捷方式,可以只使用init代替telinit。