/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>