1. 程式人生 > >【轉】/etc/rc.d/rc與/etc/rc.d/init.d的關係介紹

【轉】/etc/rc.d/rc與/etc/rc.d/init.d的關係介紹

/etc/rc.d/init.d這個目錄下的指令碼就類似與windows中的登錄檔,在系統啟動的時候執行。程式執行到這裡(init程序讀取了執行級別),相信從命名的角度大家也能猜到該執行/etc/rc.d/init.d裡面的指令碼了,不然它為什麼也叫init(.d)呢是吧。沒錯,是該執行init.d裡的指令碼了,但是並不是直接執行,而是有選擇的,因為系統並不需要啟動所有的服務。 
複製程式碼

程式碼如下: 
[[email protected] rc.d]pwd/etc/rc.d[jianbao@localhostrc.d]

pwd/etc/rc.d[[email protected]] ll 
drwxr-xr-x. 2 root root 4096 5月 2 14:53 init.d 
-rwxr-xr-x. 1 root root 2617 6月 23 2012 rc 
drwxr-xr-x. 2 root root 4096 5月 2 14:53 rc0.d 
drwxr-xr-x. 2 root root 4096 5月 2 14:53 rc1.d 
drwxr-xr-x. 2 root root 4096 5月 2 14:53 rc2.d 
drwxr-xr-x. 2 root root 4096 5月 2 15:35 rc3.d 
drwxr-xr-x. 2 root root 4096 5月 2 14:53 rc4.d 
drwxr-xr-x. 2 root root 4096 5月 2 14:53 rc5.d 
drwxr-xr-x. 2 root root 4096 5月 2 14:53 rc6.d 
-rwxr-xr-x. 1 root root 220 6月 23 2012 rc.local 
-rwxr-xr-x. 1 root root 19370 6月 23 2012 rc.sysinit 
[
[email protected]
rc.d]$

那麼,系統是如何選擇哪些需要啟動哪些不要呢?這時剛才說的執行級別就起作用了。

在決定了系統啟動的run level之後,先執行 /etc/rc.d/rc 這個指令碼。在CentOS6.X的原始碼中它都是一上來就check_runlevel(),知道了執行級別之後,對於每一個執行級別,在rc.d下都有一個子目錄分別是rc0.d,rc1.d ….. rc6.d。每個目錄下都是到init.d目錄的一部分指令碼的一些連結。每個級別要執行哪些服務就在相對應的目錄下,比如級別5要啟動的服務就都放在 rc5.d下,但是放在這個rc5.d下的都是一些連結檔案,連結到init.d中相對應的檔案,真正幹活的是init.d裡的指令碼。 
複製程式碼

程式碼如下: 
[[email protected] rc5.d]pwd/etc/rc.d/rc5.d[jianbao@localhostrc5.d]pwd/etc/rc.d/rc5.d[[email protected]] ll 
lrwxrwxrwx. 1 root root 16 4月 11 14:52 K01smartd -> ../init.d/smartd 
lrwxrwxrwx. 1 root root 17 4月 11 14:40 K02oddjobd -> ../init.d/oddjobd 
lrwxrwxrwx. 1 root root 17 4月 11 14:52 K05wdaemon -> ../init.d/wdaemon 
lrwxrwxrwx. 1 root root 16 4月 11 14:52 K10psacct -> ../init.d/psacct 
lrwxrwxrwx. 1 root root 19 4月 11 14:40 K10saslauthd -> ../init.d/saslauthd 
lrwxrwxrwx. 1 root root 15 4月 11 14:40 K15httpd -> ../init.d/httpd 
lrwxrwxrwx. 1 root root 13 4月 11 14:44 K60nfs -> ../init.d/nfs 
lrwxrwxrwx. 1 root root 20 4月 11 14:44 K69rpcsvcgssd -> ../init.d/rpcsvcgssd 
lrwxrwxrwx. 1 root root 16 4月 11 14:55 K73ypbind -> ../init.d/ypbind 
lrwxrwxrwx. 1 root root 14 4月 11 15:11 K74ntpd -> ../init.d/ntpd 
lrwxrwxrwx. 1 root root 17 4月 11 14:40 K75ntpdate -> ../init.d/ntpdate 
lrwxrwxrwx. 1 root root 24 4月 11 14:40 S23NetworkManager -> ../init.d/NetworkManager 
lrwxrwxrwx. 1 root root 21 4月 11 16:27 S30vboxadd-x11 -> ../init.d/vboxadd-x11 
lrwxrwxrwx. 1 root root 25 4月 11 16:27 S35vboxadd-service -> ../init.d/vboxadd-service 
lrwxrwxrwx. 1 root root 19 4月 11 14:49 S50bluetooth -> ../init.d/bluetooth 
lrwxrwxrwx. 1 root root 14 4月 11 14:52 S55sshd -> ../init.d/sshd 
lrwxrwxrwx. 1 root root 13 4月 11 14:39 S95atd -> ../init.d/atd 
lrwxrwxrwx. 1 root root 15 5月 2 14:53 S95jexec -> ../init.d/jexec 
lrwxrwxrwx. 1 root root 20 4月 11 14:40 S99certmonger -> ../init.d/certmonger 
lrwxrwxrwx. 1 root root 11 4月 11 14:39 S99local -> ../rc.local 
[[email protected] rc5.d]$

到這裡,估計大家可能都比較清楚了,我開始也以為是這樣的。可是後來我仔細看過和比較這些連結檔案和init.d裡真正被執行的指令碼的檔名之後,一直有幾個問題沒弄明白。藉著寫這個文章的機會,我做了一些功課,總算是大概解開了那些疑惑。

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.local達到自啟動的目的,但是rc.local是最後執行的自啟動配置檔案。