天天看點

init, telinit - 程序處理初始化

/sbin/init [ -a ] [ -s ] [ -b ] [ -z xxx ] [ 0123456Ss ]

/sbin/telinit [ -t 秒 ] [

0123456sSQqabcUu ]

Init 是所有程序的父程序。它的首要任務是從一個存儲在檔案 /etc/inittab (參閱

inittab(5))裡面的腳本裡建立程序。這個檔案通常有一些令 init 在每條使用者可登入的線上派生

getty 的記錄.它同時也控制着各獨特系統所要求的獨立程序。

所謂 運作級别 是一種系統軟體環境配置,在此特定的環境中隻允許某一組標明的程序存在。 init

給不同的運作級别派生的程序在 /etc/inittab 檔案中定義。 Init 可以啟動到8個不同的運作級别上:

0-6 和 S 或 s。運作級别可以由超級使用者通過 telinit

指令來轉換,此指令可以将轉換信号傳遞給 init,告訴它切換到哪個運作級别。

運作級别 0,1,和 6 為系統保留的專用運作級别。運作級别 0 用來關機,運作級别 6

用來重新開機計算機,運作級别 1 用來使計算機進入單使用者模式。運作級别 S 不是給我們直接使用的,更多是為進入運作級别 1

時運作某些可執行腳本時被調用。如果想得到更多相關的資訊,請參閱手冊頁 shutdown(8) 和

inittab(5)。

運作級别 7-9 雖然在文檔中說明,但也可以使用。不使用它們的原因隻是因為"傳統" Unix 變種不使用這些運作級别。另外,運作級别 S

和運作級别 s 實際上是相同的,它們隻是系統内同一運作級别的兩個不同的别名而己。

當系統核心引導到最後一步時, init 程序被啟動,它會自動查找 /etc/inittab 檔案,看看是否有類型為

initdefault (參閱 inittab(5))的記錄. initdefault

記錄決定系統初始運作級别。如果沒有這條記錄(或者根本就沒有 /etc/inittab ),那麼,你必須在系統控制台輸入想要進入的運作級别。

運作級别 S 或 s 把系統帶入單使用者模式,此模式不需要 /etc/initttab 檔案。單使用者模式中,

/sbin/sulogin 會在 /dev/console 這個裝置上打開。

當進入單使用者模式後, init 會從檔案 /etc/ioctl.save 中讀取控制台的

ioctl(2) 狀态。如果該檔案不存在, init 則把線路設定為 9600 baud 并且帶有

CLOCAL。當 init 退出單使用者模式時,它會自目前的控制台的 ioctl 設定存儲到這個檔案供下次使用。

當第一次進入多使用者模式時,init 會執行boot 和 bootwait

記錄以便在使用者可以登入之前挂載檔案系統。然後再執行相應運指定的各程序。

當啟動一個新的程序時, init 會檢查是否存在 /etc/initscript

檔案。如果存在該檔案,則使用該腳本來啟動該程序。

如果系統中存在檔案 /var/run/utmp 和 /var/log/wtmp,那麼當每個子程序終止時,init

會将終止資訊和原因記錄進這兩個檔案中。

當 init 啟動了所有指定的子程序後,它會不斷地偵測系統程序情況,如:它的某個子程序被終止、電源失效、或由 telinit

發出的改變運作級别的信号。當它接受到以上的這些信号之一時,它會自動重新掃描 /etc/inittab

檔案,并執行相應操作。是以,新的記錄可以随時加入到此檔案中。并且, init

仍然等待系統發出了上述信号。在更新了各種系統檔案後,如果你希望得到即時的更新,你可以使用telinit Q 或 q 指令來喚醒

init 讓它即刻重新檢測/etc/inittab 檔案。

如果 init 不是在單使用者模式并且接收到了一個電源失效信号(SIGPWR),它會讀取檔案

/etc/powerstatus,并執行該檔案中指定的各種操作:

<dl></dl>

<dt>F(AIL)</dt>

<dd>電源失效,由 UPS 提供電力。執行 powerwait 和 powerfail 記錄。</dd>

<dt>O(K)</dt>

<dd>電源恢複,執行 powerokwait 記錄。</dd>

<dt>L(OW)</dt>

<dd>電源失效并且 UPS 電壓也太低。執行 powerfailnow 記錄。 </dd>

如果檔案 /etc/powrestatus 不存在或其中的内容并不包含有以上所示的字母 F,O 或 L ,則

init 會當做讀到了字母 F。

我們不贊成使用 SIGPWR 和 /etc/powerstatus 。有些使用者希望與 init

進行互動,那麼可以使用 /dev/initctl 控制通道。關于此點的描述請參閱 sysvinit 包的源代碼。

當 init 得到更新運作級别的請求, init會向所有沒有在新運作級别中定義的程序發送一個警告信号 SIGTERM 。在等待 5 秒鐘之後,它會發出強制中斷所有程序的運作的信号 SIGKILL 。注意, init 假設所有的這些程序(包括它們的後代)都仍然在

init 最初建立它們的同一程序組裡。如果有任何程序改變了它們的程序組,那麼它就收不到這些信号。這樣的程序,你需要分别進行手工的終止。

/sbin/telinit 是一個到 /sbin/init 的軟連結。它用一個單字元參數來通知

init 執行相應的操作。下面是相關的參數:

<dt></dt>

0,1,2,3,4,5 或 6

<dd>通知 init 将運作級别切換到指定的運作級别</dd>

a,b,c

<dd>告訴 init 隻運作那些 /etc/inittab 檔案中運作級别是 a,b 或</dd>

c 的記錄

Q 或 q

<dd>通知 init 重新檢測 /etc/inittab 檔案</dd>

S 或 s

<dd>通知 init 将運作級别切換到單使用者模式下</dd>

U 或 u

<dd>通知 init 自動重新開機(保留狀态),此操作不會對檔案/etc/inittab 進行重新檢測。執行此操作時,運作級别必須處在</dd>

Ss12345 之一,否則,該請求将被忽略

telinit 還可以告訴 init 兩次發送 SIGTERM 和 SIGKILL 信号的時間間隔。預設值是 5

秒,你可以通過使用 -t sec 的選項來修改。

telinit 隻能由具有恰當權限的使用者執行。

init 通過檢查自己的 程序号 來判斷自己是 init 還是 telinit ;真的

init 的程序号永遠都是 1。從這一點來看,我們在調用 telinit 時也可以隻使用 init

來少敲幾個鍵.

Init 為所有的子程序設定下列環境變量

PATH

<dd></dd>

/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin

INIT_VERSION

<dd>如名字表示的那樣.在決定一個腳本是否直接來自 init 時很有用</dd>

RUNLEVEL

<dd>目前系統的運作級别</dd>

PREVLEVEL

<dd>前次運作的運作級别(僅當改變運作級别時有用)</dd>

CONSOLE

<dd>系統控制台。此變量是由核心繼承而來,如果沒有此環境變量的定義, init 會使用 /dev/console 做為預設的控制台</dd>

在啟動系統時可以通過引導管理器(比如,LILO)傳遞一些啟動标志給 init , Init 接受下面幾個:

-s, S, single

<dd>以單使用者模式啟動系統。按這種模式啟動時, /etc/inittab 需要被檢查,并在單使用者模式 shell 啟動之前會執行引導 rc</dd>

腳本。

1-5

<dd>定義需要啟動的運作級别 </dd>

-b, emergency

<dd>不運作任何啟動腳本而直接進入單使用者模式 shell </dd>

-a, auto 如果用預設指令行從核心引導(沒有使用者幹預), LILO 引導管理器向指令行增加了單詞 如果是這樣的話,

init 把環境變量 請注意你不能将這個東西用于任何安全評測 - 使用者當然可以在指令行上手工輸入

-z xxx -z 參數被忽略.你可以用這個選項略微擴充指令行,這樣它可以在堆棧裡獲得更多空間.然後 Init

就可以操作指令行,好讓 ps(1) 顯示目前運作級别.

init監聽 /dev 裡的一個 fifo ,/dev/initctl,從中擷取資訊。

Telinit 也使用這些和 init 進行通信。該界面沒有完整的文檔。如果對 init 有興趣,則可以學習 src/ 目錄中

init 源檔案包中的 initreq.h 檔案。

init 對以下信号産生響應

SIGHUP

<dd>當接收到該信号後,init會對 /etc/initrunlvl 和 /var/log/inirunlvl</dd>

檔案進行檢查。如果這兩個檔案之一存在而且檔案中有 ASCII 字元的運作級别, init 會轉換到相應的新的運作級别。 此特性隻用于向後相容!

.通常的情況是該檔案并不存在,是以 init 執行類似于 telinit q 這樣的操作。

SIGUSR1

<dd>當接收到這個信号量,init 會關閉并重新打開它的控制 fifo,/dev/initctl。此操作對 /dev</dd>

被重新挂載後的啟動腳本有用。

SIGINT

<dd>通常,當使用者按了 CTRL-ALT-DEL 鍵後,核心會向 init 傳遞此信号。它所執行的操作與 ctrlaltdel 相同。</dd>

SIGWINCH

<dd>當鍵盤有 KeyboardSignal 按鍵按下時,核心向 init 傳遞此信号,它激活 kbrequest 動作.  </dd>