轉載linux
1、Linux的引導過程windows
系統啓動以後,在進入init.d以前,咱們先來看看系統都作了什麼工做。系統加電以後,首先進行的硬件自檢,而後是bootload對系統的初始化,加載內核。網絡
內核被加載到內存以後,就開始執行了。一旦內核啓動運行,對硬件的檢測就會決定須要對哪些設備驅動進行初始化。數據結構
從這開始,內核就可以掛裝根文件系統(這個過程相似於Windows識別並存取C盤的過程)。內核掛裝了根文件系統,並已初始化全部的設備驅動程序和數據結構等以後,就經過啓動一個叫init的用戶級程序,完成引導進程。rest
2、 運行級別(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,不然將一直在重啓 )blog
3、 /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裏的腳本。排序
到這裏,估計你們可能都比較清楚了,我開始也覺得是這樣的。但是後來我仔細看過和比較這些連接文件和init.d裏真正被執行的腳本的文件名以後,一直有幾個問題沒弄明白。藉着寫這個文章的機會,我作了一些功課,總算是大概解開了那些疑惑。
一、這些連接文件前面爲何會帶一個Kxx或者Sxx呢?
是這樣的,帶K的表示中止(Kill)一個服務,S表示開啓(Start)的意思
二、K和S後面帶的數字呢?幹什麼用的
這個我開始的時候還覺得是排列起來好看或者數數用呢。後來發現不是的。它的做用是用來排序,就是決定這些腳本執行的順序,數值小的先執行,數值大的後執行。不少時候這些執行順序是很重要的,好比要啓動Apache服務,就必須先配置網絡接口,否則一個沒有IP的機子來啓動http服務那豈不是很搞笑。。。
三、無心中我發現同一個服務帶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了。接口
4、/etc/init.d 是 指向 /etc/rc.d/init.d 的軟連接。進程