2009年1月13日 星期二

啟動系統服務與相關啟動設定檔 (/etc/rc.d/rc.n & /etc/sysconfig)

載入核心讓整個系統準備接受指令來工作,然後再經過 /etc/rc.d/rc.sysinit 的系統模組與相關硬體資訊的初始化後,你的 FC4 系統應該已經順利工作了。 只是,我們還得要啟動系統所需要的各項『服務』啊!這樣主機才能提供我們相關的網路或者是主機功能嘛! 這個時候,依據我們在 /etc/inittab 裡面提到的 run level 設定值,就可以來決定啟動的服務項目了。 舉例來說,使用 run level 3 當然就不需要啟動 X Window 的相關服務囉,您說是吧?

那麼各個不同的 run level 服務啟動的各個 shell script 放在哪?還記得 /etc/inittab 裡面提到的:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
上面提到的就是各不同 run level 放置的目錄啦!舉例來說, run level 3 的啟動目錄就是放在 /etc/rc.d/rc3.d 目錄當中囉~當然啦,不同的 distributions 這個目錄可能會有差異, 所以,您還是得要自行到 /etc/inittab 裡面瞧一瞧先!那麼在這個目錄當中有什麼咚咚啊? 我們先以鳥哥自己的宿舍的 FC4 主機裡頭的 run level 3 的啟動目錄瞧一瞧:
[root@linux ~]# ls -l /etc/rc.d/rc3.d
lrwxrwxrwx 1 root root 13 Jun 29 01:05 K01yum -> ../init.d/yum
lrwxrwxrwx 1 root root 19 Jun 29 01:05 K02haldaemon -> ../init.d/haldaemon
.....中間省略......
lrwxrwxrwx 1 root root 17 Sep 16 14:09 S01sysstat -> ../init.d/sysstat
lrwxrwxrwx 1 root root 17 Jun 29 01:05 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 16 Jun 29 01:05 S12syslog -> ../init.d/syslog
.....中間省略......
lrwxrwxrwx 1 root root 11 Jun 25 08:27 S99local -> ../rc.local
在這個目錄下的檔案很有趣,全部都是以 S 或者是 K 為開頭的檔案,而且全部都是連結檔, 連結到 /etc/rc.d/init.d 裡面的 shell script 呢!而在 /etc/rc.d/init.d 這個目錄其實與 /etc/init.d 是一樣的,因為這兩個目錄是連結檔啊!要注意的是,在 /etc/rc.d/init.d/ 底下的 shell scripts 都使用 case.....esac 的語法,而且支援的變數 ($1) 主要有 start 及 stop , 相關的 shell script 請您回到第三篇去複習。所以,一般來說,如果我們想要啟動一些系統服務,例如啟動 atd , 需要使用:
    /etc/rc.d/init.d/atd start (也可以用 /etc/init.d/atd start)
如果是關閉該服務,就是使用:
    /etc/rc.d/init.d/atd stop
瞭解鳥哥想要表達的東西了嗎?是的~如果我想要在 run level 3 的環境下執行某個服務, 當然就得要將該服務寫入 /etc/rc.d/rc3.d 裡面去,而既然我們的服務已經在 /etc/rc.d/init.d 裡面建立好了, 自然可以使用連結的方式連結到 /etc/rc.d/init.d/ 內的相關的 shell script 啦。不過,為了解決 start 或 stop 這個變數,因此就有了 S 與 K 開頭的檔名了。

另外,各不同的服務其實還是互有關係的,舉例來說,如果要啟動 WWW 服務,總是得要有網路吧? 所以囉, /etc/rc.d/init.d/network 就會比較先被啟動啦!那麼您就會知道在 S 或者是 K 後面接的數字是啥意思了吧?嘿嘿,那就是執行的順序啦!所以說:
  • 在 /etc/rc.d/rc3.d 內的,以 S 為開頭的檔案,為開機時,需要『啟動, start』的服務;
  • 在該目錄內的 K 為開頭的檔案,為『關機時需要關閉的服務, stop』的檔案連結;
  • 在 S 與 K 後面接的數字,代表該檔案被執行的順序。
舉例來說,在上表當中, S10network 指向 ../init.d/network ,代表:開機時,執行『 /etc/rc.d/init.d/network start 』的意思,而 S12syslog 則代表開機時執行『 /etc/rc.d/init.d/syslog start 』的意思,且 S10network 要比 S12syslog 還要早執行喔! 所以囉,看到最後一個被執行的項目是啥?呵呵!沒錯,就是 S99local ,亦即是: /etc/rc.d/rc.local 這個檔案啦!

好了,那麼問題來了,我要如何建立 /etc/rc.d/init.d 裡面的檔案呢? 很簡單啊,看一下 /etc/rc.d/init.d/atd 的內容就知道了,而更多的 services 啟動與相關說明,我們會在後續的 認識系統服務 詳談。 而將 /etc/rc.d/init.d/ 連結到 /etc/rc.d/rc3.d 的方法,除了手動建立外, 其實我們都是以 chkconfig 這個程式來進行管理的呢!更多的 chkconfig 請參考認識系統服務那一章。