前面說到,/etc/rc.d/init.d這個目錄下的腳本就類似與windows中的注冊表,在系統啟動的時候執行。程序運行到這裡(init進程讀取了運行級別),相信從命名的角度大家也能猜到該運行/etc/rc.d/init.d裡面的腳本了,不然它為什麼也叫init(.d)呢是吧。沒錯,是該運行init.d裡的腳本了,但是並不是直接運行,而是有選擇的,因為系統並不需要啟動所有的服務。
復制代碼代碼如下:
[jianbao@localhost rc.d]$ pwd
/etc/rc.d
[jianbao@localhost rc.d]$ 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
[jianbao@localhost 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裡的腳本。
復制代碼代碼如下:
[jianbao@localhost rc5.d]$ pwd
/etc/rc.d/rc5.d
[jianbao@localhost rc5.d]$ 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
[jianbao@localhost 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是最後執行的自啟動配置文件。