歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> ubuntu的init與系統服務設置

ubuntu的init與系統服務設置

日期:2017/2/27 16:03:15   编辑:Linux教程
init
Init是位於/sbin/init的一個程序,它是在linux下,在系統啟動過程中,初始化所有的設備驅動程序和數據結構等之後,由內核啟動的一個用戶級程序,並由此init程序進而完成系統的啟動過程。
ubuntu與傳統的linux略有不同,使用upstart完成系統的啟動,但表面上仍維持init程序的形式。

運行級別
傳統上,linux有幾種不同的運行級別,包括如下幾種:
# 0 - 停機
# 1 - 單用戶模式
# 2 - 多用戶,沒有 NFS
# 3 - 完全多用戶模式(標准的運行級)
# 4 – 系統保留的
# 5 – X11 (x window)
# 6 - 重新啟動

系統啟動後處於哪一種級別由init讀取/etc/inittab文件中的缺省級別設置來確定,一半圖形界面的系統是進入級別3。
但是ubuntu與傳統的不太一樣,默認情況下是找不到/etc/inittab文件的,而且運行級別也有差別,具體分這樣幾個級別:

# 0 – 關閉系統
# 1 – 單用戶模式
# 2~5 – 完整的多用戶模式
# 6 – 重新啟動

也就是說,默認情況下級別2、3、4、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目錄,會發現這些目錄下的文件都是形如Snnxxxx或Knnxxxx的符號鏈接,而且都是指向/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)
Copyright © Linux教程網 All Rights Reserved