ubuntu的init與系統服務設置

init

Init是位於/sbin/init的一個程序,它是在linux下,在系統啓動過程當中,初始化全部的設備驅動程序和數據結構等以後,由內核啓動的一個用戶級程序,並由此init程序進而完成系統的啓動過程。 linux

ubuntu與傳統的linux略有不一樣,使用upstart完成系統的啓動,但表面上仍維持init程序的形式。 apache


運行級別

傳統上,linux有幾種不一樣的運行級別,包括以下幾種: ubuntu

# 0 - 停機
# 1 - 單用戶模式
# 2 - 多用戶,沒有 NFS
# 3 - 徹底多用戶模式(標準的運行級)
# 4 – 系統保留的
# 5 – X11 (x window)
# 6 - 從新啓動 服務器

系統啓動後處於哪種級別由init讀取/etc/inittab文件中的缺省級別設置來肯定,一半圖形界面的系統是進入級別3。 網絡

可是ubuntu與傳統的不太同樣,默認狀況下是找不到/etc/inittab文件的,並且運行級別也有差異,具體分這樣幾個級別: 數據結構

# 0 – 關閉系統 工具

# 1 – 單用戶模式 spa

# 2~5 – 完整的多用戶模式 rest

# 6 – 從新啓動 rem

也就是說,默認狀況下級別二、三、四、5都是同樣的,同時系統的默認級別設定也不是在inittab文件中,而是寫在/etc/init/rc-sysinit.conf文件中。打開此文件,能夠找到下面一句:

env DEFAULT_RUNLEVEL=2

這代表系統當前默認是進入級別2。


另外,在此文見中還有一段以if [ -r /etc/inittab ] 開始的代碼,這裏保留了使用inittab指定系統默認運行級別的功能,也就是說,若是用戶手動建立了/etc/inittab,那麼init將以 /etc/inittab中指定的默認運行級別進行系統的啓動。好比說用戶但願系統以級別3爲默認運行級別,則只需在inittab文件中加入以下一行:

id:3:initdefault:

在通過/etc/init/rc-sysinit.conf肯定運行級別後,init將進一步運行/etc/init.d/rc,而後根據級別進入/etc/rc[?].d啓動或關閉相應的服務。


服務的啓動與關閉腳本

ubuntu下啓動與關閉服務的腳本存放與/etc/rc[?].d目錄下。其中[x]表示0~6,分別對應級別0~6,如/etc目錄下的 rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d。假設rc-sysinit.conf或inittab中指定的默認級別是2,那麼init將執行/etc/rc2.d目錄下的腳本啓動或關 閉相應服務。

若是打開/etc/rc[?].d目錄,會發現這些目錄下的文件都是形如SnnxxxxKnnxxxx符號連接,並且都是指向/etc /init.d。也就是說不一樣運行級別下服務的啓動或關閉腳本均是放在/etc/init.d下,只不過根據不一樣級別的須要,在對應/etc /rc[?].d目錄下放一個連接,不一樣的級別會須要不一樣的服務,所以不一樣/etc/rc[?].d目錄下的連接文件也不盡相同以此區分。

其中連接文件中以S開頭的表示在調用/etc/init.d目錄中對應腳本的時候會傳遞一個start參數,也就是啓動對應服務,而以K開頭的則是傳遞一個stop參數,由此關閉此服務,此處的K表示kill。

S和K後面的nn是一個數字,表示本腳本被執行的前後順序,小號在前大號在後,這樣以解決不一樣服務之間可能存在的前後依賴關係。好比說ftp服務依賴於網絡服務的啓動,因此ftp服務的編號就要大於網絡服務的編號,在網絡服務啓動後再行啓動。

最後的xxxx則是服務的名字。

另外,除了/etc/rc[0~6].d文件外,還有一個/etc/rcS.d目錄,這個目錄下的服務腳本與/etc/rc[0~6].d格式相似,也爲指向/etc/init.d中的腳本的連接,可是會在/etc/rc[0~6].d中的腳本執行前首先被執行。


服務的安裝

根據上面的介紹,如何將一個軟件安裝爲服務也就比較清楚了,那就是在/etc/init.d添加一個服務的啓動腳本,而後在須要啓動服務的對應級別的/etc/rc[0~6].d中按照文件名格式添加一個指向/etc/init.d中腳本的符號連接

以apache2爲例,默認狀況下,apache2編譯安裝在/usr/local/apache2,apache2的服務器啓動腳本是/usr /local/apache2/bin/apachectl,那麼安裝服務就是要把此apachectl拷貝到須要啓動apache2服務器的運行級別對 應的/etc/rc[?].d目錄下,一半來講ubuntu是運行在級別2下,因此也就是拷到/etc/rc2.d下,命令以下:

sudo cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd

在這裏,咱們把拷貝的腳本文件名改成慣用的httpd,那麼在系統服務中apache2的名稱也就是httpd。

手動添加服務的話,就是要在/etc/rc2.d裏爲httpd做一個形如Snnxxxx的連接。假定啓動順序咱們定爲80,那麼就是要創建一個指向/etc/init.d/httpd的連接/etc/rc2.d/S80httpd,命令以下:

sudo ln -s /etc/init.d/httpd /etc/rc2.d/S80httpd

而後用sysv-rc-conf或者chkconfig –list檢查一下就能看到已經在運行級別2下創建的名爲httpd的服務,重啓後,系統會自動啓動apache2。

如今要手動啓動、關閉或重啓httpd服務器可使用service命令+服務名+參數的形式,以下三句分別是啓動、關閉和重啓apache2服務器的命令:

service httpd start

service httpd stop

service httpd restart

要安裝服務除了以上手動做連接外,還可使用一些工具軟件來實現,好比經常使用的有update-rc.d、chkconfig和sysv-rc-conf等。

這裏主要以update-rc.d爲例

update-rc.d

如用update-rc.d在運行級別2,3,4,5中都添加httpd服務啓動命令,並指定啓動序號是80,能夠以下(注意命令最後的那個點號不能少):

sudo update-rc.d httpd start 80 2 3 4 5 .

若是要在運行級別2,3,4,5中都添加httpd服務關閉命令,並指定關閉序號是80,則能夠以下(注意命令最後的那個點號不能少):

sudo update-rc.d httpd stop 80 2 3 4 5 .

而若是要刪除httpd服務,則用如下命令就刪掉/etc/rc[?].d中全部存在的指向/etc/init.d/httpd的連接:

sudo update-rc.d httpd remove

另外,還能夠用帶有defaults參數的形式同時向運行級別2,3,4,5中添加啓動服務命令,即Start命令,並同時向運行級別0,1,6添加關閉命令,即Kill命令,其中start命令的序號是80,kill命令的序號是90:

sudo update-rc.d httpd defaults 80 90

這條命令也等同於(注意命令stop前面和最後的那兩個點號不能少):

sudo update-rc.d httpd start 80 2 3 4 5 . stop 90 0 1 6 .

以上兩條命令的效果就是做了以下幾個連接:

/etc/rc0.d/K90httpd -> ../init.d/httpd

/etc/rc1.d/K90httpd -> ../init.d/httpd

/etc/rc6.d/K90httpd -> ../init.d/httpd

/etc/rc2.d/S80httpd -> ../init.d/httpd

/etc/rc3.d/S80httpd -> ../init.d/httpd

/etc/rc4.d/S80httpd -> ../init.d/httpd

/etc/rc5.d/S80httpd -> ../init.d/httpd

chkconfig

查看全部服務在全部級別下的狀況:

chkconfig –list

查看某服務的狀況,以下將查看httpd服務在哪些級別下是被啓動的:

chkconfig httpd

在此,若是httpd在2,3,4,5下是被啓動,將返回信息:

httpd 2345

sysv-rc-conf

這個軟件是有圖形界面的,比較直觀簡單,就很少說了,看看就明白了。

rc.local

在/etc/rc[2~5].d目錄下都會有一個S99rc.local,這是一個指向/etc/init.d/rc.local的連接,能夠看 出,在正常的2~5級別啓動的最後都會調用這個rc.local腳本,而/etc/init.d/rc.local中又會檢查是否存在/etc /rc.local,並運行之,所以,咱們就能夠在/etc/rc.local中寫入代碼,來隨系統啓動某些程序,實現相似服務的功能。

系統的啓動過程

綜上,能夠看到,系統的啓動調用過程就以下過程:

內核 → /etc/init/rc-sysinit.conf → [/etc/inittab] → /etc/init.d/rc → /etc/rc[?].d → /etc/init.d/rc.local → /etc/rc.local

其餘linux系統

在其餘系統下以上的文件結構和過程略有不一樣,以Redhat系的CentOS5爲例,系統中默認init是使用/etc/inittab文件的,而後讀取/etc/rc.sysinit,再根據運行級別進入/etc/rc[?].d。

其中,/etc/rc.sysinit是指向/etc/rc.d/rc.sysinit的連接,/etc/rc[?].d是指向/etc/rc.d /rc[?].d的連接,/etc/rc.local是指向/etc/rc.d/rc.local的連接,因此係統啓動的順序就變成以下:

內核 → /etc/inittab → /etc/ rc.sysinit(/etc/rc.d/rc.sysinit) → /etc/rc[?].d(/etc/rc.d/rc[?].d) → /etc/rc.local(/etc/rc.d/rc.local)

相關文章
相關標籤/搜索