關於Ubuntu執行級別、開機啟動指令碼的說明
1.1介紹Ubuntu下面的自啟動指令碼目錄
1.2 Linux作業系統執行級別的概念
1.3關於作業系統自啟指令碼的啟動順序
1.4 Linux作業系統執行級別的概念
1.5 自啟和關閉自啟服務
1.6 對於init [number]命令
Content:
1.1 介紹Ubuntu作業系統關於自啟動指令碼的幾個目錄
其中rc0.d~rc.6.d資料夾下分別對應的是作業系統0-6級執行的狀態下需要執行的指令碼。此外還有rcS.d資料夾和rc.local檔案,而在這些資料夾下的檔案,都是軟鏈檔案,指向指定位置的指令碼,有圖為證:
經檢視,發現這些軟鏈都是指向同一個資料夾../init.d/的指令碼檔案,
我們檢視其它的資料夾,發現情況都是這樣子。因此所有開機自啟動的指令碼檔案都是放在/etc/init.d/目錄下面的:
那麼這些rcN.d分別代表什麼意義?或者是說是不是按照0~6的順序依次執行?肯定不是。因為我們檢視rc0.d folder
發現,在該資料夾下,居然有halt(關機)指令碼,因此開啟作業系統的時候,肯定不可能執行這個。因此證明rcN.d這幾個folders之間是相互獨立的,沒有什麼本質的聯絡。
那麼為什麼會有這幾個資料夾的區別呢?這就引入了linux作業系統的執行級別(run-level)概念。
1.2 Linux作業系統執行級別的概念
根據前面學習的內容,我們知道有rc0~6在加 rcS.d & rc.local,後面這兩個我們先不看,至少存在0-6共七種執行級別。這裡的執行級別的概念被稱為System V的執行機制。這七種執行級別的含義如下(僅僅針對Ubuntu,其他系統定義可能不完全一樣):
我們可以通過runlevel檢視當前系統的執行狀態
也就是說我們系統的執行級別目前是2,該引數的配置檔案/etc/init/rc-sysinit.conf
因此我們開機自啟動的指令碼在rc2.d資料夾下,所有的軟鏈指向/etc/init.d/中的指令碼檔案:
這些就是我們預設開機狀態下,要啟動的服務,如果我們將自己的指令碼放在/etc/init.d/目錄下,同時在rcN.d中建立軟鏈,指向該檔案(軟鏈的名稱應該是S<num><service name>,便可以開機自啟這些服務。同時我們還可以修改配置檔案/etc/init/rc-sysinit.conf中的DEFAULT_RUNLEVEL的值,修改作業系統預設的執行級別。
1.3 關於作業系統自啟指令碼的啟動順序
假設我們的作業系統執行級別是2,那麼在/etc/rc2.d/資料夾下的指令碼執行順序是怎樣的?因為有些服務需要先啟動,有些服務需要後啟動,他們之間存在先後關係,即有向圖的關係。
我們檢視該資料夾下的軟鏈名稱(見上圖),軟鏈的名稱有一定的規則:
S[number][service name] --> ../init.d/servicename
S 表示 Start,開啟服務
[number]表示的是該指令碼的執行優先順序,number越小,指令碼的執行優先順序就越高
[service name]表示的是服務的名稱。
因此我們如果需要定義一個服務啟動的優先順序(順序),則需指定指令碼的number即可。
根據此規則,我們檢視rc6.c資料夾(重啟執行級別):
按照number的順序,顯示Kill服務,之後再Start一些服務,最後重新啟動S90reboot.
1.4 關於rcS.d rc.local資料夾的意義
該指令碼是在rc0~6.d資料夾下的指令碼執行之前執行rcS.d資料夾下的指令碼命令。
1.5 自啟和關閉自啟服務
在理解了自啟服務的原理之後,我們可以手動新增指令碼連結檔案到指定的rcN.d目錄下,但是這種純手工的方式比較複雜,因此我們可以使用簡單的命令來實現這種功能,或者是指定的工具來實現。
命令版本# update-rc.d來自動實現System V 的RunLevel的啟動指令碼服務,前提是這些服務的啟動指令碼位於/etc/init.d/目錄下。
update-rc.d <service name> start|stop| <order number> <run levels>
eg:
sudo update-rc.d rinetd start 20 2
sudo update-rc.d rinetd stop 20 0
update-rc.d <service name> enable|disable <runlevels> # 開啟或者是禁止
eg:
sudo update-rc.d rinetd disable 2 在runlevel2中暫時禁止該服務
update-rc.d <service name> default [NN | SS KK]
eg:
sudo update-rc.d rinetd default 80 80 # default 表示在2 3 4 5 中新增80(the first 80)順序的Start,在0 6 中新增80(the second 80)順序的Kill服務
注意實現去對應的資料夾檢視該服務的ordernumber
從啟動裡面刪除
sudo update-rc.d -f <service name> remove
這樣在所有的執行級別中就會刪除掉關於該service的自啟和關閉服務連結(刪除的僅僅是連結,而不是/etc/init.d/資料夾中的指令碼檔案)
1.6 對於init [number]命令
我們在命令列中關閉作業系統或者是重新啟動,使用的是
在本質上呼叫的是:
rc0.d 表示的關機 rc6.d表示的是重新啟動
因此我們還可以在不重新啟動作業系統的前提下,切換作業系統的RunLevel
sudo init <num>