ubuntu的init與系統服務設定

2021-06-08 12:55:51 字數 4608 閱讀 3464

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目錄,會發現這些目錄下的檔案都是形如snn***x或knn***x的符號鏈結,而且都是指向/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服務的編號就要大於網路服務的編號,在網路服務啟動後再行啟動。

最後的***x則是服務的名字。

另外,除了/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下,命令如下:

在這裡,我們把拷貝的指令碼檔名改為慣用的httpd,那麼在系統服務中apache2的名稱也就是httpd。

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

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

要安裝服務除了以上手動作鏈結外,還可以使用一些工具軟體來實現,比如常用的有update-rc.d、chkconfig和sysv-rc-conf等。

這裡主要以update-rc.d為例

update-rc.d

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

如果要在執行級別2,3,4,5中都新增httpd服務關閉命令,並指定關閉序號是80,則可以如下(注意命令最後的那個點號不能少):

另外,還可以用帶有defaults引數的形式同時向執行級別2,3,4,5中新增啟動服務命令,即start命令,並同時向執行級別0,1,6新增關閉命令,即kill命令,其中start命令的序號是80,kill命令的序號是90:

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

檢視所有服務在所有級別下的情況:

chkconfig –list

檢視某服務的情況,如下將檢視httpd服務在哪些級別下是被啟動的:

在此,如果httpd在2,3,4,5下是被啟動,將返回資訊:

這個軟體是有圖形介面的,比較直觀簡單,就不多說了,看看就明白了。

在/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

在其他系統下以上的檔案結構和過程略有不同,以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)

ubuntu的init與系統服務設定

init是位於 sbin init的乙個程式,它是在linux下,在系統啟動過程中,初始化所有的裝置驅動程式和資料結構等之後,由核心啟動的乙個使用者級程式,並由此init程式進而完成系統的啟動過程。ubuntu與傳統的linux略有不同,使用upstart完成系統的啟動,但表面上仍維持init程式的...

ubuntu的init與系統服務設定

init是位於 sbin init的乙個程式,它是在linux下,在系統啟動過程中,初始化所有的裝置驅動程式和資料結構等之後,由核心啟動的乙個使用者級程式,並由此init程式進而完成系統的啟動過程。ubuntu與傳統的linux略有不同,使用upstart完成系統的啟動,但表面上仍維持init程式的...

ubuntu的init與系統服務設定

init是位於 sbin init的乙個程式,它是在linux下,在系統啟動過程中,初始化所有的裝置驅動程式和資料結構等之後,由核心啟動的乙個使用者級程式,並由此init程式進而完成系統的啟動過程。ubuntu與傳統的linux略有不同,使用upstart完成系統的啟動,但表面上仍維持init程式的...