天天看點

Linux啟動init流程

當系統啟動時,首先啟動核心,核心調用init來完成引導程序.init啟動時,它會在/etc/inittab内查找預設的運作級别:如id:2:initdefault:運作/etc/rc.d/init.d中運作級别為2的啟動腳本。由于init.d中的運作級别的這些腳本都用ln 指令連接配接到/etc/rc.d/rcn.d目錄.例如/etc/rc.d/rc2.d/S10network對應/etc/rc.d/init.d下的network腳本的.是以運作/etc/rc.d/rc2.d下的腳本.

如/etc/rc.d/rc2.d/S10network或/etc/rc.d/rc2.d/K45named等,則在第10個啟動network,在第45個終止named

init詳解

1、什麼是init程序

init程序,是一個由核心啟動的使用者級程序,核心自行啟動後,就通過啟動init來完成引導程序。是以,init始終是第一個程序(其程序編号始終為1)

2、檔案位置

/sbin/init。如果核心找不到init,它就會試着運作/bin/sh

3、運作級别

運作級就是作業系統目前正在運作的功能級别。這個級别從1到6 ,具有不同的功能。

  # 0 - 停機(千萬不能把initdefault 設定為0 )

  # 1 - 單使用者模式

  # 2 - 多使用者,沒有 NFS

  # 3 - 完全多使用者模式(标準的運作級)

  # 4 - 沒有用到

  # 5 - X11 (xwindow)

  # 6 - 重新啟動 (千萬不要把initdefault 設定為6 )

1)、運作級别的配置是在/etc/inittab 檔案裡配置的。最先運作的服務是/etc/rc.d 下的檔案。啟動腳本都是位于

/etc/rc.d/init.d中的。這些腳本被用ln 指令連接配接到 /etc/rc.d/rcn.d 目錄。(這裡的n 就是運作級0-6)

運作級别的配置

  如下所示:

  12 : 2 : wait : /etc/init.d/rc2

  12:是一個任意指定的标簽;

  2:表示這一行适用于運作那個級别(這裡是2);

  wait:進入運作級别時,init應該等待第四個字段内的指令結束。

  /etc/init.d/rc2:Linux版本的不同,采用的具體指令也不同,運作級别的配置也有差别。

2)、init啟動時,它會在/etc/inittab内查找一個代碼行,這一行指定了預設的運作級别:

   id : 2 : initdefault :

3)、rcn.d與inittab的關系

rcn.d目錄和運作級别n相關。/ect/rc.d/rcn.d是用ln指令和/etc/rc.d/init.d中的腳本關聯的,例如:

rc2.d 目錄下面的檔案就是和運作級别2 相關的。

/etc/rc.d/rc2.d/S10network對應/etc/rc.d/init.d下的network 腳本的

檔案開頭的S 代表start 就是啟動服務的意思,後面的數字10 就是啟動的順序

/etc/rc.d/rc2.d/S80postfix,80 就是順序在10 以後,因為沒有啟動網絡的情況下,啟動postfix是沒有任何作用的

/etc/rc.d/rc3.d/S60nfslock,NFS 要用到這個檔案,一般用在多使用者環境下,是以放在rc3.d 目錄下

/etc/rc.d/rc2.d/K45named ,K 代表 kill

标準的Linux運作級為3 或者5 ,如果是3 的話,系統就在多使用者狀态。如果是5的話,則是運作着X Window 系統。如果目前正在3或5,而你把運作級降低到2的話,init 就會執行 K45named 腳本。

不同的運作級有不同的用處,例如,如果丢失了root 密碼,那麼可以讓機器啟動進入單使用者狀态來設定。在啟動後的 lilo 提示符下輸入:init=/bin/sh rw就可以使機器進入運作級1 ,并把 root 檔案系統挂為讀寫。他會跳過所有系統認證, 讓你使用passwd 程式來改變root密碼,然後啟動到一個新的運作級。

4、/etc/inittab中的特殊配置

  /etc/inittab中,有幾個特殊的特性,允許init重新激活特殊事件。這些特殊特性都是用第三個字段中的特殊關鍵字标記出來的。比如:

   1. powerwait

  允許init在電源被切斷時,關閉系統。其前提是具有U P S和監視U P S并通知init電源已被切斷的軟體。

  2. ctrlaltdel

  允許init在使用者于控制台鍵盤上按下Ctrl+Alt+Del組合鍵時,重新啟動系統。注意,如果該系統放在一個公共場所,系統管理者可将Ctrl+Alt+Del組合鍵配置為别的行為,比如忽略等。

3. sysinit

  系統啟動時準備運作的指令。比如說,這個指令将清除/tmp。

  其他的關鍵字及其使用詳情,可參考inittab手冊頁。

運作級别補充

1、确定目前的運作級别

本章不是針對系統管理者的,但是作為shell程式設計者,應當了解rc.scripts是什麼,它們是被怎樣放置到運作級别配置目錄中的。順便說一下,如果想知道目前的運作級别,可以用下面的指令:

who -r

在‘run level’後面的數字就是目前的運作級别。後面的時間是系統最近一次重新開機動的時間。

如果是LINUX系統,那麼

$ runlevel

2 3

第一清單示系統的前一個運作級别,第二清單示系統目前的運作級别,在這裡是3。

2、inittab

inittab檔案所包含的域具有嚴格的格式。該檔案中每個條目的格式為:

id:rstart:action:process

其中,id域是相應程序的唯一辨別。

rstart域所包含的數字表示運作該程序的級别。

action域告訴init程序如何對待process所對應的程序。這裡可以有很多種動作,但是最常見的是wait和respawnwait意味着當程序啟動後等待它結束。respawn則意味着如果該程序不存在,則啟動相應的程序,如果它存在,那麼隻要它一掉下來就立即重新啟動它。

process域包含了實際要運作的指令。

該檔案的第一行是系統預設的運作級别,這裡是級别3,一般都是這樣。

以數字10到16開始的行啟動或停止該運作級别所對應的全部運作級别腳本。例如,該檔案中有這樣一行:

15:5:wait:/etc/rc.d/rc 5

它的意思是,在運作級别5應該以參數5執行腳本/etc/rc.d/rc,即/etc/rc.d/rc執行/etc/rc.d/rc5.d目錄中的所有腳本。

在上述檔案的最後一行,在運作級别2、3、4和5,該程序将會始終存在,即使暫時掉下來,大概也不會超過1s。這一始終存在的程序是序列槽ttyS1上的mingetty。該指令含有一個參數,即終端類型為vt100。

3、運作級别腳本的格式

rcN.d目錄中的腳本都是一些連結,這樣是為了省去不必要的副本。這些連結的格式為:

Snnn.script_name

Knnn.script_name

其中,

S:代表啟動相應的程序

K:代表殺死相應的程序

nn:是00至99的兩位數字,不過在有些系統中是000至999三位數字。在不同目錄中的連結應采用同一數字。例如,如果某個服務在rc3.d中啟動時名為S45.myscript,那麼如果希望它在rc2.d中啟動,應當使用連結名S45.myscript。

script_name:相應腳本的檔案名,根據所在作業系統的不同,它們可能位于下列目錄中:

/usr/sbin/init.d/etc/rc.d/etc/init.d

當init程序調用相應的運作級别腳本時,殺程序按照從高到低的K序号進行,即K23,myscript K12.named;而啟動程序按照從低到高的序号進行。如果使用的是LINUX系統,K序号将按照從高到低的順序執行。

安裝運作腳本

1、安裝運作級别腳本

如果想要安裝自己的運作級别腳本,必須:

" 編寫該腳本,確定它符合調用标準。

" 确信它能夠啟動或終止相應的服務。

" 将該腳本放置于(取決于作業系統) /etc/init.d或/usr/sbin/init.d或/etc/rc.d中。

" 在相應的rcN.d目錄中按照合理的命名方式建立連結。

下面的腳本能夠啟動或停止一個名為rc.audit的稽核應用程式。該服務運作于級别3、5、4,停止于級别6、2、1。通過檢視rcN.d中的條目,我們發現序号35空閑,于是就使用該序号。實際上,系統并不對使用已占用的序号作任何檢查。

讓我們假定該腳本已經通過了測試。它能夠正确地啟動和停止稽核服務。現在我們把該腳本放置在相應的運作級别目錄中。

在本系統中,rcN.d目錄位于/etc/rc.d目錄下,而我的運作級别腳本儲存在/etc/rc.d/init.d目錄下。如果系統目錄結構與上面的不同,那麼需要對下面的指令作相應的調整。

我們首先啟動該腳本—記住啟動腳本所使用的連結名是以S打頭的。

$pwd

/etc/rc.d/rc3.d

$ln -s ../init.d/rc.audit S35rc.audit

$ls -l

....

lrwxrwxrws 1 root root .....S35rc.audit -> ../init.d/rc.audit

.......

我們已經建立了相應的連結。ls -l指令的結果顯示該連結指向/etc/init.d/rc.audit檔案。現在隻要進入其他的相關目錄(rc4.d和rc5.d )使用同樣的指令就可以啟動其他相應的服務。

如果希望停止某個腳本的運作,可以使用如下指令:

$pwd

/etc/rc.d/rc6.d

$ln -s ../init.d/rc.audit K35rc.audit

$ls -l

...

lrwxrwxrwx 1 root root ... K35rc.audit -> ../init.d/rc.audit

...

在其他相關目錄中,也可以如法炮制,停止相應的稽核服務。現在當系統重新開機動時(運作級别6 ),它将被停止;在運作級别切換到2或1時也是如此。該服務在運作級别4或5中同樣也會被啟動。

2、使用inittab來啟動應用程式

我們還可以用其他的方法來啟動應用程式。可以通過在inittab檔案中加入相應的條目來做到這一點。

系統運作在級别3時運作我的一個磁盤鏡像檢查腳本。

首先我确定該腳本能夠正确運作,然後對inittab檔案做備份。

$ cp /etc/initab /etc/inittab.bak

接下來編輯inittab檔案,在該檔案末尾加入這樣一個條目:

rc.diskchecker:3:once:/usr/local/etc/rc.diskchecker > /dev/console 2>&1

儲存并退出。

上面的一條意思是:

行首的rc.diskchecker是該程序在運作級别3中的唯一辨別。該程序隻運作一次。

所要運作的腳本是/usr/local/etc/rc.diskchecker,所有的輸出都被送到控制台。

3、啟動和停止服務的其他方法:rc.local

如果不想把/etc/inittab檔案弄得過于雜亂,還有其他的方法可以實作啟動和停止服務的功能。大多數系統都含有一個名為rc.local的檔案,一般來說也是位于/etc目錄下。該腳本檔案将在inittab和運作級别腳本之後運作。可以在該檔案中加入任何指令,或從中調用最習慣用的啟動腳本。有些系統還在/bin目錄下(更多的是在/usr/sbin目錄下)含有一個名為shutdown的腳本檔案。可以使用它來關閉某些服務。

繼續閱讀