當系統啟動時,首先啟動內核,內核調用init來完成引導進程.init啟動時,它會在/etc/inittab內查找默認的運行級別:如id:2:initdefault:運行/etc/rc.d/init.d中運行級別為2的啟動腳本。由於init.d中的運行級別的這些腳本都用ln 命令連接到/etc/rc.d/rcn.d目錄.例如/etc/rc.d/rc2.d/S10network對應/etc/rc.d/init.d下的network腳本的.因此運行/etc/rc.d/rc2.d下的腳本.
如/etc/rc.d/rc2.d/S10network或/etc/rc.d/rc2.d/K45named等,則在第10個啟動network,在第45個終止named
init詳解
1、什么是init進程
init進程,是一個由內核啟動的用戶級進程,內核自行啟動后,就通過啟動init來完成引導進程。所以,init始終是第一個進程(其進程編號始終為1)
2、文件位置
/sbin/init。如果內核找不到init,它就會試着運行/bin/sh
3、運行級別
運行級就是操作系統當前正在運行的功能級別。這個級別從1到6 ,具有不同的功能。
# 0 - 停機(千萬不能把initdefault 設置為0 )
# 1 - 單用戶模式
# 2 - 多用戶,沒有 NFS
# 3 - 完全多用戶模式(標准的運行級)
# 4 - 沒有用到
# 5 - X11 (xwindow)
# 6 - 重新啟動 (千萬不要把initdefault 設置為6 )
1)、運行級別的配置是在/etc/inittab 文件里配置的。最先運行的服務是/etc/rc.d 下的文件。啟動腳本都是位於
/etc/rc.d/init.d中的。這些腳本被用ln 命令連接到 /etc/rc.d/rcn.d 目錄。(這里的n 就是運行級0-6)
運行級別的配置
如下所示:
12 : 2 : wait : /etc/init.d/rc2
12:是一個任意指定的標簽;
2:表示這一行適用於運行那個級別(這里是2);
wait:進入運行級別時,init應該等待第四個字段內的命令結束。
/etc/init.d/rc2:Linux版本的不同,采用的具體命令也不同,運行級別的配置也有差別。
2)、init啟動時,它會在/etc/inittab內查找一個代碼行,這一行指定了默認的運行級別:
id : 2 : initdefault :
3)、rcn.d與inittab的關系
rcn.d目錄和運行級別n相關。/ect/rc.d/rcn.d是用ln命令和/etc/rc.d/init.d中的腳本關聯的,例如:
rc2.d 目錄下面的文件就是和運行級別2 相關的。
/etc/rc.d/rc2.d/S10network對應/etc/rc.d/init.d下的network 腳本的
文件開頭的S 代表start 就是啟動服務的意思,后面的數字10 就是啟動的順序
/etc/rc.d/rc2.d/S80postfix,80 就是順序在10 以后,因為沒有啟動網絡的情況下,啟動postfix是沒有任何作用的
/etc/rc.d/rc3.d/S60nfslock,NFS 要用到這個文件,一般用在多用戶環境下,所以放在rc3.d 目錄下
/etc/rc.d/rc2.d/K45named ,K 代表 kill
標准的Linux運行級為3 或者5 ,如果是3 的話,系統就在多用戶狀態。如果是5的話,則是運行着X Window 系統。如果目前正在3或5,而你把運行級降低到2的話,init 就會執行 K45named 腳本。
不同的運行級有不同的用處,例如,如果丟失了root 口令,那么可以讓機器啟動進入單用戶狀態來設置。在啟動后的 lilo 提示符下輸入:init=/bin/sh rw就可以使機器進入運行級1 ,並把 root 文件系統掛為讀寫。他會跳過所有系統認證, 讓你使用passwd 程序來改變root口令,然后啟動到一個新的運行級。
4、/etc/inittab中的特殊配置
/etc/inittab中,有幾個特殊的特性,允許init重新激活特殊事件。這些特殊特性都是用第三個字段中的特殊關鍵字標記出來的。比如:
1. powerwait
允許init在電源被切斷時,關閉系統。其前提是具有U P S和監視U P S並通知init電源已被切斷的軟件。
2. ctrlaltdel
允許init在用戶於控制台鍵盤上按下Ctrl+Alt+Del組合鍵時,重新啟動系統。注意,如果該系統放在一個公共場所,系統管理員可將Ctrl+Alt+Del組合鍵配置為別的行為,比如忽略等。
3. sysinit
系統啟動時准備運行的命令。比如說,這個命令將清除/tmp。
其他的關鍵字及其使用詳情,可參考inittab手冊頁。
運行級別補充
1、確定當前的運行級別
本章不是針對系統管理員的,但是作為shell編程者,應當了解rc.scripts是什么,它們是被怎樣放置到運行級別配置目錄中的。順便說一下,如果想知道當前的運行級別,可以用下面的命令:
who -r
在‘run level’后面的數字就是當前的運行級別。后面的時間是系統最近一次重啟動的時間。
如果是LINUX系統,那么
$ runlevel
2 3
第一列表示系統的前一個運行級別,第二列表示系統當前的運行級別,在這里是3。
2、inittab
inittab文件所包含的域具有嚴格的格式。該文件中每個條目的格式為:
id:rstart:action:process
其中,id域是相應進程的唯一標識。
rstart域所包含的數字表示運行該進程的級別。
action域告訴init進程如何對待process所對應的進程。這里可以有很多種動作,但是最常見的是wait和respawnwait意味着當進程啟動后等待它結束。respawn則意味着如果該進程不存在,則啟動相應的進程,如果它存在,那么只要它一掉下來就立即重新啟動它。
process域包含了實際要運行的命令。
該文件的第一行是系統缺省的運行級別,這里是級別3,一般都是這樣。
以數字10到16開始的行啟動或停止該運行級別所對應的全部運行級別腳本。例如,該文件中有這樣一行:
15:5:wait:/etc/rc.d/rc 5
它的意思是,在運行級別5應該以參數5執行腳本/etc/rc.d/rc,即/etc/rc.d/rc執行/etc/rc.d/rc5.d目錄中的所有腳本。
在上述文件的最后一行,在運行級別2、3、4和5,該進程將會始終存在,即使暫時掉下來,大概也不會超過1s。這一始終存在的進程是串口ttyS1上的mingetty。該命令含有一個參數,即終端類型為vt100。
3、運行級別腳本的格式
rcN.d目錄中的腳本都是一些鏈接,這樣是為了省去不必要的副本。這些鏈接的格式為:
Snnn.script_name
Knnn.script_name
其中,
S:代表啟動相應的進程
K:代表殺死相應的進程
nn:是00至99的兩位數字,不過在有些系統中是000至999三位數字。在不同目錄中的鏈接應采用同一數字。例如,如果某個服務在rc3.d中啟動時名為S45.myscript,那么如果希望它在rc2.d中啟動,應當使用鏈接名S45.myscript。
script_name:相應腳本的文件名,根據所在操作系統的不同,它們可能位於下列目錄中:
/usr/sbin/init.d/etc/rc.d/etc/init.d
當init進程調用相應的運行級別腳本時,殺進程按照從高到低的K序號進行,即K23,myscript K12.named;而啟動進程按照從低到高的序號進行。如果使用的是LINUX系統,K序號將按照從高到低的順序執行。
安裝運行腳本
1、安裝運行級別腳本
如果想要安裝自己的運行級別腳本,必須:
• 編寫該腳本,確保它符合調用標准。
• 確信它能夠啟動或終止相應的服務。
• 將該腳本放置於(取決於操作系統) /etc/init.d或/usr/sbin/init.d或/etc/rc.d中。
• 在相應的rcN.d目錄中按照合理的命名方式創建鏈接。
下面的腳本能夠啟動或停止一個名為rc.audit的審核應用程序。該服務運行於級別3、5、4,停止於級別6、2、1。通過查看rcN.d中的條目,我們發現序號35空閑,於是就使用該序號。實際上,系統並不對使用已占用的序號作任何檢查。
讓我們假定該腳本已經通過了測試。它能夠正確地啟動和停止審核服務。現在我們把該腳本放置在相應的運行級別目錄中。
在本系統中,rcN.d目錄位於/etc/rc.d目錄下,而我的運行級別腳本保存在/etc/rc.d/init.d目錄下。如果系統目錄結構與上面的不同,那么需要對下面的命令作相應的調整。
我們首先啟動該腳本—記住啟動腳本所使用的鏈接名是以S打頭的。
$pwd
/etc/rc.d/rc3.d
$ln -s ../init.d/rc.audit S35rc.audit
$ls -l
....
lrwxrwxrws 1 root root .....S35rc.audit -> ../init.d/rc.audit
.......
我們已經創建了相應的鏈接。ls -l命令的結果顯示該鏈接指向/etc/init.d/rc.audit文件。現在只要進入其他的相關目錄(rc4.d和rc5.d )使用同樣的命令就可以啟動其他相應的服務。
如果希望停止某個腳本的運行,可以使用如下命令:
$pwd
/etc/rc.d/rc6.d
$ln -s ../init.d/rc.audit K35rc.audit
$ls -l
...
lrwxrwxrwx 1 root root ... K35rc.audit -> ../init.d/rc.audit
...
在其他相關目錄中,也可以如法炮制,停止相應的審核服務。現在當系統重啟動時(運行級別6 ),它將被停止;在運行級別切換到2或1時也是如此。該服務在運行級別4或5中同樣也會被啟動。
2、使用inittab來啟動應用程序
我們還可以用其他的方法來啟動應用程序。可以通過在inittab文件中加入相應的條目來做到這一點。
系統運行在級別3時運行我的一個磁盤鏡像檢查腳本。
首先我確定該腳本能夠正確運行,然后對inittab文件做備份。
$ cp /etc/initab /etc/inittab.bak
接下來編輯inittab文件,在該文件末尾加入這樣一個條目:
rc.diskchecker:3:once:/usr/local/etc/rc.diskchecker > /dev/console 2>&1
保存並退出。
上面的一條意思是:
行首的rc.diskchecker是該進程在運行級別3中的唯一標識。該進程只運行一次。
所要運行的腳本是/usr/local/etc/rc.diskchecker,所有的輸出都被送到控制台。
3、啟動和停止服務的其他方法:rc.local
如果不想把/etc/inittab文件弄得過於雜亂,還有其他的方法可以實現啟動和停止服務的功能。大多數系統都含有一個名為rc.local的文件,一般來說也是位於/etc目錄下。該腳本文件將在inittab和運行級別腳本之后運行。可以在該文件中加入任何命令,或從中調用最習慣用的啟動腳本。有些系統還在/bin目錄下(更多的是在/usr/sbin目錄下)含有一個名為shutdown的腳本文件。可以使用它來關閉某些服務。