本文包括3部分內容
1、 Linux的引導過程
2、 運行級別
3、 /etc/rc.d/ 與/etc/rc.d/init.d的關系
?
? ? “/etc/rc.d/init.d/目錄下的腳本就類似與windows中的注冊表,在系統啟動的時候某些指定腳本將被執行”。在進入init.d之前,我們一起來做兩個準備工作,linux的引導過程和運行級別的概念。
?
一、 Linux的引導過程
?
系統啟動之后,在進入init.d之前,我們先來看看系統都做了什么工作,先看看一個圖
從這個圖中,我們從比較高的角度去看開始引導的整個過程,比較清晰明了。系統加電之后,首先進行的硬件自檢,然后是bootloader對系統的初始化,加載內核。
內核被加載到內存中之后,就開始執行了。一旦內核啟動運行,對硬件的檢測就會決定需要對哪些設備驅動程序進行初始化。從這里開始,內核就能夠掛裝根文件系統(這個過程類似于Windows識別并存取C盤的過程)。內核掛裝了根文件系統,并已初始化所有的設備驅動程序和數據結構等之后,就通過啟動一個叫init的用戶級程序,完成引導進程。
?
二、 運行級別(run level)
?
Init進程是系統啟動之后的第一個用戶進程,所以它的pid(進程編號)始終為1。init進程上來首先做的事是去讀取/etc/目錄下inittab文件中initdefault id值,這個值稱為運行級別(run-level)。它決定了系統啟動之后運行于什么級別。運行級別決定了系統啟動的絕大部分行為和目的。這個級別從0到6 ,具有不同的功能。不同的運行級定義如下:?
# 0 - 停機(千萬別把initdefault設置為0,否則系統永遠無法啟動)
# 1 - 單用戶模式
# 2 - 多用戶,沒有 NFS
# 3 - 完全多用戶模式(標準的運行級)
# 4 – 系統保留的
# 5 - X11 (x window)
# 6 - 重新啟動 (千萬不要把initdefault 設置為6,否則將一直在重啟 )
這是兩個表較常用運行級別(后期補上),左圖redhat9 級別3啟動的將是文本界面,右圖fc7級別5啟動的將是圖形界面。
?
三、 /etc/rc.d/與/etc/rc.d/init.d的關系
?
寫到這里,應該差不多要進入init.d了,可是我覺得單寫/etc/rc.d/init.d的話不一定能說得清楚明白,就拿它跟/etc/rc.d這個它上一級的目錄一起來討論,可能比較合適一些,因為他們之間有著千絲萬縷的關系。
在這里先解釋一下init.d里面放的都是什么東西。這個目錄存放的是一些腳本,一般是linux以rpm包安裝時設定的一些服務的啟動腳本。系統在安裝時裝了好多rpm包,這里面就有很多對應的腳本。執行這些腳本可以用來啟動,停止,重啟這些服務。
前面說到,/etc/rc.d/init.d這個目錄下的腳本就類似與windows中的注冊表,在系統啟動的時候執行。程序運行到這里(init進程讀取了運行級別),相信從命名的角度大家也能猜到該運行/etc/rc.d/init.d里面的腳本了,不然它為什么也叫init(.d)呢是吧。沒錯,是該運行init.d里的腳本了,但是并不是直接運行,而是有選擇的因為系統并不需要啟動所有的服務。
那么,系統是如何選擇哪些需要啟動哪些不要呢?這時剛才說的運行級別就起作用了。在決定了系統啟動的run level之后,/etc/rc.d/rc這個腳本先執行。在RH9和FC7的源碼中它都是一上來就check_runlevel()(雖然實現的代碼不一樣,也大同小異),知道了運行級別之后,對于每一個運行級別,在rc.d下都有一個子目錄分別是rc0.d,rc1.d ….. rc6.d。每個目錄下都是到init.d目錄的一部分腳本一些鏈接。每個級別要執行哪些服務就在相對應的目錄下,比如級別5要啟動的服務就都放在rc5.d下,但是放在這個rc5.d下的都是一些鏈接文件,鏈接到init.d中相對應的文件,真正干活到init.d里的腳本。
?
四、rcn.d(n為數字)文件名稱介紹
可是后來我仔細看過和比較這些鏈接文件和init.d里真正被執行的腳本的文件名之后,一直有幾個問題沒弄明白。借著寫這個文章的機會,我做了一些功課,總算是大概解開了那些疑惑。
?
lrwxrwxrwx. 1 root root 14 10月 29 00:55 K 99rngd -> ../init.d/rngd
lrwxrwxrwx. 1 root root 17 10月 29 00:54 S 01sysstat -> ../init.d/sysstat
?
1、這些鏈接文件前面為什么會帶一個Kxx或者Sxx呢?
是這樣的,帶 K的表示停止(Kill)一個服務,S表示開啟(Start)的 意思
?
2、K和S后面帶的數字呢?干什么用的
這個我開始的時候還以為是排列起來好看或者數數用呢。后來發現不是的。它的作用是用來排序,就是決定這些腳本執行的順序, 數值小的先執行,數值大的后執行 。很 多時候這些執行順序是很重要的,比如要啟動Apache服務,就必須先配置網絡接口,不然一個沒有IP的機子來啟動http服務那豈不是很搞笑 ...
?
3、無意中我發現同一個服務帶S的和帶K的鏈接到init.d之后是同一個腳本。我就納悶了,為什么會是執行同一個腳本呢?
這個時候真是S和K的妙用了,原來S和K并不止是用來看起來分的清楚而已。S給和K還分別給init.d下面的腳本傳遞了start和stop的參數。哦,是這樣的(煥然大悟的樣子,呵呵)!這時我才想起來原來曾經無數用過的/etc/rc.d/init.d/network restart命令。原來傳S時相當于執行了/etc/rc.d/init.d/xxx start這條命令,當然K就相當于/etc/rc.d/init.d/xxx stop了
?
?
rc.d的內容如下:?
init.d/ :各種服務器和程序的二進制文件存放目錄。?
rcx.d/: 各個啟動級別的執行程序連接目錄。里頭的東西都是指向init.d/的一些軟連接。具體的后邊敘述。?
還有三個腳本 :rc.sysinit, rc, rc.local?
?
redhat的啟動方式和執行次序是:?
加載內核?
執行init程序?
/etc/rc.d/rc.sysinit ? ? ? ? ? ?# 由init執行的第一個腳本?
/etc/rc.d/rc $RUNLEVEL ? ? ? ? ? # $RUNLEVEL為缺省的運行模式?
/etc/rc.d/rc.local ? ? ? ? ? ? ? ? # 類似于開機啟動運行的腳本了
/sbin/mingetty # 等待用戶登錄?
?
?
五、添加服務
service xxx啟動 /etc/init.d/ 目錄下的xxx腳本
如一個腳本名為 mysvc保存在/etc/init.d/下可以用 service mysvc 運行mysvc腳本
echo passed in option $0 $1
?
if [ $1 = "start" ]
then
? ? ? ? echo myservice started........................................
elif [ $1 = "stop" ]
then
? ? ? ? echo myservice stoped........................................
else
? ? ? ? echo myservice not supported option........................................
fi ?www.2cto.com ?
?
[root@localhost init.d]# service mysvc start
passed in option /etc/init.d/mysvc start
myservice started........................................
?
[root@localhost init.d]# service mysvc stop
passed in option /etc/init.d/mysvc stop
myservice stoped........................................
?
[root@localhost init.d]# service mysvc xxx
passed in option /etc/init.d/mysvc xxx
myservice not supported option........................................
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
