linux etc rc d 目錄的詳解

2021-07-14 05:20:07 字數 3260 閱讀 7938

本文包括3部分內容

1、        linux的引導過程

2、        執行級別

3、        /etc/rc.d/ 與/etc/rc.d/init.d的關係

都僅限於自身的理解,如有差錯和不足的地方請指正和補充!一起學習,一起進步。

「/etc/rc.d/init.d/目錄下的指令碼就類似與windows中的登錄檔,在系統啟動的時候某些指定指令碼將被執行」。開始之前,先引用李善明經理昨天晚上總結時的乙個理解,讓大家先對init.d目錄有個大概的印象。在進入init.d之前,我們一起來做兩個準備工作,linux的引導過程和執行級別的概念。

一、        linux的引導過程

系統啟動之後,在進入init.d之前,我們先來看看系統都做了什麼工作,先看看乙個圖(此圖來自網路)

從這個圖中,我們從比較高的角度去看開始引導的整個過程,比較清晰明了。系統加電之後,首先進行的硬體自檢,然後是bootloader對系統的初始化,載入核心。

核心被載入到記憶體中之後,就開始執行了。一旦核心啟動執行,對硬體的檢測就會決定需要對哪些裝置驅動程式進行初始化。從這裡開始,核心就能夠掛裝根檔案系統(這個過程類似於windows識別並訪問c盤的過程)。核心掛裝了根檔案系統,並已初始化所有的裝置驅動程式和資料結構等之後,就通過啟動乙個叫init的使用者級程式,完成引導程序。

二、        執行級別(run level)

init程序是系統啟動之後的第乙個使用者程序,所以它的pid(程序編號)始終為1。init程序上來首先做的事是去讀取/etc/目錄下inittab檔案中initdefault id值,這個值稱為執行級別(run-level)。它決定了系統啟動之後執行於什麼級別。執行級別決定了系統啟動的絕大部分行為和目的。這個級別從0到6 ,具有不同的功能。不同的執行級定義如下: 

# 0 - 停機(千萬別把initdefault設定為0,否則系統永遠無法啟動)

# 1 - 單使用者模式

# 2 - 多使用者,沒有 nfs

# 3 - 完全多使用者模式(標準的執行級)

# 4 – 系統保留的

# 5 - x11 (x window)

# 6 - 重新啟動 (千萬不要把initdefault 設定為6,否則將一直在重啟 )

這是兩個表較常用執行級別,左圖redhat9 級別3啟動的將是文字介面,右圖fc7級別5啟動的將是圖形介面。

三、        /etc/rc.d/與/etc/rc.d/init.d的關係

寫到這裡,應該差不多要進入init.d了,可是我覺得單寫/etc/rc.d/init.d的話不一定能說得清楚明白,就拿它跟/etc/rc.d這個它上一級的目錄一起來討論,可能比較合適一些,因為他們之間有著千絲萬縷的關係。

在這裡先解釋一下init.d裡面放的都是什麼東西。這個目錄存放的是一些指令碼,一般是linux以rpm包安裝時設定的一些服務的啟動指令碼。系統在安裝時裝了好多rpm包,這裡面就有很多對應的指令碼。執行這些指令碼可以用來啟動,停止,重啟這些服務。

前面說到,/etc/rc.d/init.d這個目錄下的指令碼就類似與windows中的登錄檔,在系統啟動的時候執行。程式執行到這裡(init程序讀取了執行級別),相信從命名的角度大家也能猜到該執行/etc/rc.d/init.d裡面的指令碼了,不然它為什麼也叫init(.d)呢是吧。沒錯,是該執行init.d裡的指令碼了,但是並不是直接執行,而是有選擇的因為系統並不需要啟動所有的服務。

那麼,系統是如何選擇哪些需要啟動哪些不要呢?這時剛才說的執行級別就起作用了。

在決定了系統啟動的run level之後,/etc/rc.d/rc這個指令碼先執行。在rh9和fc7的原始碼中它都是一上來就check_runlevel()(雖然實現的**不一樣,也大同小異),知道了執行級別之後,對於每乙個執行級別,在rc.d下都有乙個子目錄分別是rc0.d,rc1.d ….. rc6.d。每個目錄下都是到init.d目錄的一部分指令碼一些鏈結。每個級別要執行哪些服務就在相對應的目錄下,比如級別5要啟動的服務就都放在rc5.d下,但是放在這個rc5.d下的都是一些鏈結檔案,鏈結到init.d中相對應的檔案,真正幹活的init.d裡的指令碼。

redhat9    ls

fc7          ls -l

這樣看的就很清楚了。

到這裡,估計大家可能都比較清楚了,我開始也以為是這樣的。可是後來我仔細看過和比較這些鏈結檔案和init.d裡真正被執行的指令碼的檔名之後,一直有幾個問題沒弄明白。藉著寫這個文章的機會,我做了一些功課,總算是大概解開了那些疑惑。

1、這些鏈結檔案前面為什麼會帶乙個kxx或者sxx呢?

是這樣的,帶k的表示停止(kill)乙個服務,s表示開啟(start)的意思

2、k和s後面帶的數字呢?幹什麼用的

這個我開始的時候還以為是排列起來好看或者數數用呢(是不是很幼稚?)。後來發現不是的。它的作用是用來排序,就是決定這些指令碼執行的順序,數值小的先執行,數值大的後執行。很多時候這些執行順序是很重要的,比如要啟動apache服務,就必須先配置網路介面,不然乙個沒有ip的機子來啟動http服務那豈不是很搞笑。。。

3、無意中我發現同乙個服務帶s的和帶k的鏈結到init.d之後是同乙個指令碼。我就納悶了,為什麼會是執行同乙個指令碼呢?

這個時候真是s和k的妙用了,原來s和k並不止是用來看起來分的清楚而已。s給和k還分別給init.d下面的指令碼傳遞了start和stop的引數。哦,是這樣的(煥然大悟的樣子,呵呵)!這時我才想起來原來曾經無數用過的/etc/rc.d/init.d/network restart命令。原來傳s時相當於執行了/etc/rc.d/init.d/*** start這條命令,當然k就相當於/etc/rc.d/init.d/*** stop了。

最後自己補充一些:

1. 許多網路服務都由超級服務/etc/rc.d/init.d/xinetd啟動,這些服務的配置檔案在/etc/xinetd.d/目錄下,

如telnet就是由xinetd啟動的,其配置檔案如下(fc7)

1 # default: on

2 # description: the telnet server serves telnet sessions; it uses /

3 #   unencrypted username/password pairs for authentication.

4 service telnet

5 修改配置檔案以後,重啟xinetd服務即可.

2. 除了直接呼叫指令碼外(如/etc/rc.d/init.d/xinetd),還可以用service命令來控制init.d目錄下的服務,

如 service xinetd restart,

**: 

linux etc rc d 目錄的詳解

rc.d的內容如下 init.d 各種伺服器和程式的二進位制檔案存放目錄。rcx.d 各個啟動級別的執行程式連線目錄。裡頭的東西都是指向init.d 的一些軟連線。具體的後邊敘述。還有三個指令碼 rc.sysinit,rc,rc.local redhat的啟動方式和執行次序是 載入核心 執行init...

linux etc rc d 目錄的詳解

最後自己補充一些 1.許多網路服務都由超級服務 etc rc.d init.d xinetd啟動,這些服務的配置檔案在 etc xinetd.d 目錄下,如telnet就是由xinetd啟動的,其配置檔案如下 fc7 1 default on 2 description the telnet ser...

linux etc rc d目錄的詳解

rc.d的內容如下 init.d 各種伺服器和程式的二進位制檔案存放目錄。rcx.d 各個啟動級別的執行程式連線目錄。裡頭的東西都是指向init.d 的一些軟連線。具體的後邊敘述。還有三個指令碼 rc.sysinit,rc,rc.local redhat的啟動方式和執行次序是 載入核心 執行init...