NAME¶
init, telinit - 進程處理初始化
/sbin/init [
-a ] [
-s ] [
-b ] [
-z xxx ]
[
0123456Ss ]
/sbin/telinit [
-t 秒 ] [
0123456sSQqabcUu ]
Init¶
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,並執行該檔案中指定的各種操作:
- F(AIL)
- 電源失效,由 UPS
提供電力。執行 powerwait
和 powerfail 記錄。
- O(K)
- 電源恢復,執行
powerokwait 記錄。
- L(OW)
- 電源失效並且 UPS
電壓也太低。執行
powerfailnow 記錄。
如果檔案 /etc/powrestatus
不存在或其中的內容並不包含有以上所示的字母
F,
O 或
L ,則 init
會當做讀到了字母
F。
我們不讚成使用
SIGPWR 和
/etc/powerstatus 。
有些使用者希望與
init
進行交互,那麼可以使用
/dev/initctl
控制通道。關於此點的描述請參閱
sysvinit 包的原始碼。
當
init
得到更新運行級別的請求,
init會向所有沒有在新運行級別中定義的進程發送一個警告信號
SIGTERM 。 在等待 5
秒鐘之後,它會發出強制中斷所有進程的運行的信號
SIGKILL 。 注意,
init
假設所有的這些進程(包括它們的後代)都仍然在
init
最初創建它們的同一進程組裏。
如果有任何進程改變了它們的進程組,那麼它就收不到這些信號。
這樣的進程,你需要分別進行手動的終止。
TELINIT¶
/sbin/telinit 是一個到
/sbin/init
的軟鏈接。
它用一個單字符參數來通知
init 執行相應的操作。
下面是相關的參數:
- 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
之一,否則,該請求將被忽略
telinit 還可以告訴
init
兩次發送 SIGTERM 和 SIGKILL
信號的時間間隔。
預設值是 5
秒,你可以通過使用
-t
sec 的選項來修改。
telinit
只能由具有恰當權限的使用者執行。
init 通過檢查自己的
進程號 來判斷自己是
init 還是
telinit ;真的
init 的進程號永遠都是
1。
從這一點來看,我們在調用
telinit 時也可以只使用
init 來少敲幾個鍵.
環境變量¶
Init
為所有的子進程設定下列環境變量
- PATH
- /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
- INIT_VERSION
- 如名字表示的那樣.在決定一個稿本是否直接來自
init 時很有用
- RUNLEVEL
- 當前系統的運行級別
- PREVLEVEL
- 前次運行的運行級別(僅當改變運行級別時有用)
- CONSOLE
- 系統控制台。此變量是由核心繼承而來,如果沒有此環境變量的定義,
init 會使用 /dev/console
做為預設的控制台
啟動標誌¶
在啟動系統時可以通過引導管理器(比如,LILO)傳遞一些啟動標誌給
init ,
Init
接受下面幾個:
- -s, S, single
- 以單使用者模式啟動系統。按這種模式啟動時,
/etc/inittab 需要被檢查,
並在單使用者模式 shell
啟動之前會執行引導
rc 稿本。
- 1-5
- 定義需要啟動的運行級別
- -b, emergency
- 不運行任何啟動稿本而直接進入單使用者模式
shell
- -a, auto
- 如果用預設命令行從核心引導(沒有使用者幹預),
LILO
引導管理器向命令行增加了單詞
如果是這樣的話,
init 把環境變量
請注意你不能將這個東西用於任何安全評測
-
使用者當然可以在命令行上
手動輸入
- -z xxx
- -z
參數被忽略.你可以用這個選項略微擴展命令行,
這樣它可以在堆棧裏獲得更多空間.然後
Init
就可以操作命令行,
好讓 ps(1)
顯示當前運行級別.
init監聽 /dev 裏的一個
fifo
,
/dev/initctl,從中獲取信息。
Telinit 也使用這些和 init
進行通信。
該界面沒有完整的文件。
如果對 init
有興趣,則可以學習
src/ 目錄中
init
源檔案包中的
initreq.h
檔案。
init 對以下信號產生響應
- SIGHUP
- 當接收到該信號後,init會對
/etc/initrunlvl 和 /var/log/inirunlvl
檔案進行檢查。如果這兩個檔案之一存在而且檔案中有
ASCII 字符的運行級別,
init
會轉換到相應的新的運行級別。
此特性只用於向後相容!
.
通常的情況是該檔案並不存在,所以
init 執行類似於 telinit q
這樣的操作。
- SIGUSR1
- 當接收到這個信號量,init
會關閉並重新打開它的控制
fifo, /dev/initctl。 此操作對
/dev
被重新掛載後的啟動稿本有用。
- SIGINT
- 通常,當使用者按了
CTRL-ALT-DEL 鍵後,核心會向 init
傳遞此信號。
它所執行的操作與
ctrlaltdel 相同。
- SIGWINCH
- 當鍵盤有 KeyboardSignal
按鍵按下時,核心向
init 傳遞此信號,
它激活 kbrequest 動作.
Init 與 System V 的 init 相相容。
它與
/etc/init.d 和
/etc/rc{runlevel}.d
目錄下的稿本緊密地工作在一起。
如果你的系統使用這種慣例,在
/etc/init.d
目錄下應該有一個
README
檔案,它可以很好地解釋了這些稿本是如何工作的。
相關檔案¶
/etc/inittab
/etc/initscript
/dev/console
/etc/ioctl.save
/var/run/utmp
/var/log/wtmp
/dev/initctl
Init
假設進程和進程的後代同屬於最初創建它們的進程組.
如果進程改變了它們的進程組,
init
就無法中止它們,因此,你可能會有兩個進程讀取一條終端線.
如果
init
發現它的重啟次數在最近
2 分鐘裏超過了 10 次,
它就會認為程式命令串出錯了。在系統控制台輸出出錯信息,並拒絕重新啟動,
只有等到 5
分鐘以後或使用者給 init
一個特定的信號,
它才會重新響應。
這可以防止由於使用者在編輯
/etc/inittab
檔案時可能出現的輸入錯誤
或由於相關程式被無意刪除後導致的大量佔用系統資源。
Miquel van Smoorenburg (miquels@cistron.nl)
原始幫助手冊頁作者:Michael
Haardt (u31b3hs@pool.informatik.rwthaachen.de).
getty(1),
login(1),
sh(1),
who(1),
shutdown(8), kill(1),
inittab(5),
initscript(5),
utmp(5)
[中文版維護人]¶
所羅門 <solomen@email.com.cn>
[中文版最新更新]¶
2000/11/26
[中國 Linux 論壇 man 手冊頁翻譯計劃]¶
http://cmpp.linuxforum.net