UNIX 和 Linux 系統上的初始化程序


Init 是所有程序的父程序,由核心在系統引導過程中執行。它的主要作用是從儲存在/etc/inittab檔案中的指令碼建立程序。它通常包含條目,這些條目會導致 init 在使用者可以登入的每一行上生成 getty。它控制任何特定系統所需的自主程序。

讀取此檔案後,init 將確定每次執行級別中系統應如何設定,並設定預設執行級別。init 在為系統設定預設執行級別後啟動所有後臺程序。

執行級別

執行級別是系統的軟體配置,它只允許選定的程序組存在。為每個執行級別由 init 生成的程序在/etc/inittab檔案中定義。

Init 可以處於這八個執行級別之一:0-6 和Ss。特權使用者可以透過執行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 Qq 命令可以喚醒init以重新檢查/etc/inittab檔案。

如果 init 不處於單使用者模式並收到電源故障訊號 (SIGPWR),它將讀取檔案/etc/powerstatus。然後,它將根據此檔案的內容啟動命令:

標籤描述
F(AIL)
電源即將失效,UPS 正在供電。執行powerwaitpowerfail條目。
O(K)
電源已恢復,執行powerokwait條目。
L(OW)
電源即將失效,並且 UPS 電池電量不足。執行powerfailnow條目。

如果/etc/powerstatus包含除字母FOL之外的任何內容,或者不存在,則 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、bc的條目。
Q 或 q
告訴init重新檢查/etc/inittab檔案。
S 或 s
告訴init切換到單使用者模式。
U 或 u
告訴init重新執行自身(保留狀態)。不會重新檢查/etc/inittab檔案。如果執行級別不是Ss12345之一,則請求將被靜默忽略。

它還可以告訴init在向程序傳送 SIGTERM 和 SIGKILL 訊號之間應等待多長時間。預設值為 5 秒,但這可以使用-t sec選項更改。

只有具有相應許可權的使用者才能呼叫telinit

透過檢視其程序 ID,init 二進位制檔案檢查它是否是inittelinit;真正的 init 程序 ID 始終為1。因此,作為快捷方式,可以只使用init代替telinit

更新於:2019年10月11日

7K+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告