天天看點

詳細分析 /etc/inittab 檔案

/etc/inittab 檔案控制着初始化過程。

/etc/inittab 檔案為 init 指令提供腳本作為一個普通程序排程程式。構成 init 指令程序排程活動的主要(多數)程序是 /etc/getty 線程序(line process),發起(啟動)專用線程序。被 init 指令特别排程的其他程序為背景程序(Daemon)和shell。

/etc/inittab 檔案由 位置相關[position-dependent ]的條目組成,格式如下:

Identifier:RunLevel:Action:Command

每一個條目都被一個換行字元分隔。一個換行字元前面一個反斜杠 (\) 表示一個條目的延續。/etc/inittab 檔案中的條目數目沒有限制(而不是指條目的最大長度)。條目的最大長度是 1024 個字元。

條目字段有:

Identifier: 辨別唯一對象的一個 1-4 位字元的字段。

RunLevel: 該條目運作的級别。

運作級别有下列屬性:

- 運作級别有效地符合系統程序的配置。

- 由 init 指令啟動的每一個程序都被配置設定一個或多個該程序可存在于之的運作級别。

- 運作級别由 0-9 的數字來表示。例如,如果系統運作于級别 1,隻有在運作級别字段有 1 的那些條目被啟動。

- 請求 init 指令改變運作級别時,條目中運作級别字段與目标運作級别不比對的所有程序都會收到一條警告信号 (SIGTERM),在程序被删除符号[kill signal (SIGKILL)]強行終止前,有20秒的寬限期。

- 運作級别字段可為一個程序定義多個運作級别,可以0-9的任意組合。如果沒有指定運作級别,程序假定在所有的運作級别有效。

- 還有其他四個值會出現在運作級别字段,即使他們并不是真正的運作級别:a, b, c 和 h。在運作級别字段有這些字元的條目僅僅在telinit 指令請求時才運作(與目前的系統運作級别無關)。他們不同于init指令的運作級别,init指令永遠不能進入a, b, c, h 運作級别。并且,所有這些程序的運作請求都不改變目前的運作級别。此外,init 指令改變級别時,由a, b, c 指令啟動的程序并不斷開(killed)。隻有當 /etc/inittab 檔案中他們的行在action字段标記為 off,他們的行從 /etc/inittab 檔案中完全删除,或者init 指令進入單使用者模式,這些程序才會被中斷(killed)。

Action: 告知 init 指令如何處理在 process 字段指定的程序。init 指令可識别的 actions 如下:

respawn: 如果程序不存在,則啟動程序。卻不等待程序終止(繼續掃描 /etc/inittab 檔案)。如程序死掉,則重新開機該程序。如程序存在,繼續掃描 /etc/inittab 檔案。

wait: 當 init 指令進入比對某條目的運作級别時,啟動該程序并等待該程序的終止。當 init 指令處于同樣的運作級别時,所有對 /etc/inittab 檔案随後的讀取都會導緻 init 指令忽略該條目。

once: 當 init 指令進入比對某條目的運作級别時,啟動該程序,并且不等待終止。當程序死掉時,也不重新開機該程序。當系統進入一個新的運作級别時,該程序仍然從之前運作級别的變化運作,程式也不重新開機。

boot: 隻在系統引導過程中運作的條目,這些程序是系統啟動過程中,init 指令從 /etc/inittab 檔案中讀取的。啟動該程序,不等待程序終止,并且程序死掉時,也不重新開機程序。有意義的指導依次為,運作級别應為預設,或者必須與系統引導時 init 指令的運作級别比對。此 action 對于系統硬體重新開機後的初始化功能非常有用。

bootwait: 系統引導後,init 指令從單使用者到多使用者狀态,第一次運作的條目。啟動該程序,并等其終止,程序死時,不重新開機該程序。如果 initdefault 為 2 ,則系統引導後直接運作該程序。

powerfail: 隻有當 init 指令收到一個電源故障信号(SIGPWR)的時候,才執行與此條目相關的程序。

powerwait: 隻有當 init 指令收到一個電源故障信号(SIGPWR)的時候,才執行與此條目相關的程序。并等該程序終止,才繼續處理 /etc/inittab 檔案。

off: 如果與該條目相關的程序目前正在運作,發送一個警告信号(SIGTERM),然後等待 20 秒才用 kill 信号(SIGKILL)終止該程序。如果程序不在運作,忽略該條目。

ondemand: 功能上與 respawn 相同,不過,此 action 應用 a, b, 或 c 值,而不用運作級别。

initdefault: init 指令隻在 最初調用時才掃描與此 action 相關的條目。如果存在,init 指令使用該條目來決定初始進入的運作級别。一般情況下,使用run-level 字段中指定的最高運作級别來作為初始狀态。如果運作級别字段為空,則認作0123456789;是以,init 指令進入運作級别 9 。另外,如果 init 指令在 /etc/inittab 檔案中找不到 initdefault 條目,則在引導時向使用者請求一個初始的運作級别。

sysinit: 此類型的條目在登入前 init 指令正要通路控制台之前被執行。該條目隻被用來初始化裝置,init 指令可能會針對這些裝置詢問運作級别。這些條目被執行,并等待完成後才繼續。

Command: 可執行的殼(shell)指令。整個 command 字段以 exec 為字首,并傳給一個 forked sh成為 sh -c exec 指令。任何合法的 sh 指令文法都可出現在該字段。并可用 # 插入注釋。

 getty 指令覆寫 /etc/inittab 檔案中出現在它之前所有指令的輸出。要在引導日志中記錄這些指令的輸出,可輸送這些輸出到 alog -tboot 指令。

當 init 指令正在處理 inittab 條目時,stdin, stdout, 和 stderr 這些檔案描述符(file descriptors)可能是不可用的。所有寫入 stdout 或 stderr 的條目不起作用,除非把輸出重定向到一個檔案或者到 /dev/console。

下列指令是唯一支援在 /etc/inittab 檔案中修改記錄的方法:

mkitab: 把記錄添加到 /etc/inittab 檔案。

lsitab: 列出 /etc/inittab 檔案中的記錄。

chitab: 修改 /etc/inittab 檔案中的記錄。

rmitab: 從 /etc/inittab 檔案中删除記錄。

例如,想在 /etc/inittab 檔案中添加一條記錄,以運作級别2(run level 2)運作 find 指令并使之一旦完成就再次啟動。

1. 運作 ps 指令,隻顯示包含 find 的程序:

# ps -ef | grep find

root 19750 13964 0 10:47:23 pts/0 0:00 grep find

#

2. 使用 mkitab 指令,在 /etc/inittab 檔案中添加一個名為 xcmd 的記錄:

# mkitab "xcmd:2:respawn:find / -type f > /dev/null 2>&1"

3. 使用 lsitab 指令顯示新記錄:

# lsitab xcmd

xcmd:2:respawn:find / -type f > /dev/null 2>&1

#

4. 檢視程序:

# ps -ef | grep find

root 25462 1 6 10:56:58 - 0:00 find / -type f

root 28002 13964 0 10:57:00 pts/0 0:00 grep find

#

5. 取消 find 指令程序:

# kill 25462

6. 檢視程序:

# ps -ef | grep find

root 23538 13964 0 10:58:24 pts/0 0:00 grep find

root 28966 1 4 10:58:21 - 0:00 find / -type f

#

本例中,由于 action 字段被配置 respawn,故而每一次該指令一完成,一個新程序就會啟動。

該程序将繼續再生 (re-spawning),除非修改 action 字段,例如:

1. 把記錄 xcmd 的 action 字段由 respawn 修改為 once:

# chitab "xcmd:2:once:find / -type f > /dev/null 2>&1"

2. 檢視程序:

# ps -ef | grep find

root 20378 13964 0 11:07:20 pts/0 0:00 grep find

root 28970 1 4 11:05:46 - 0:03 find / -type f

3. 取消 find 指令程序:

# kill 28970

4. 檢視程序:

# ps -ef | grep find

root 28972 13964 0 11:07:33 pts/0 0:00 grep find

#

要從 /etc/inittab 檔案中删除該記錄,可使用 rmitab 指令。例如:

# rmitab xcmd

# lsitab xcmd

#

/etc/inittab 條目的次序

/etc/inittab 檔案中的基本程序條目次序安裝如下:

1. initdefault

2. sysinit

3. Powerfailure Detection (powerfail)

4. Multiuser check (rc)

5. /etc/firstboot (fbcheck)

6. System Resource Controller (srcmstr)

7. Start TCP/IP daemons (rctcpip)

8. Start NFS daemons (rcnfs)

9. cron

10.pb cleanup (piobe)

11.getty for the console (cons)

系統資源控制器 (SRC)必須在 /etc/inittab 檔案的開頭附近就被啟動,因為啟動其他的程序需要SRC程序(Daemon)。

由于NFS需要TCP/IP程序(Daemon)才能正常運作,是以TCP/IP程序必須在NFS程序之前被啟動。

/etc/inittab 檔案中的條目按互相依賴性排序,就是說,如果一個程序(process2)需要另外一個程序(process1)存在才能正常運作,那麼在 /etc/inittab檔案中,process1的條目應該在process2的條目之前。