2009年1月13日 星期二

第一支程式 init 及設定檔 /etc/inittab 與 runlevel

在核心載入完畢之後,此時系統應該就已經準備妥當,等待程式的執行了。而整個 Linux 系統當中第一支被執行的程式就是『 /sbin/init 』囉~這也是我們在前一章使用 ps aux |more 時, 看到第一行所顯示的程序內容 (PID 為 1 的那行啦) ! init 這支程式所做的工作相當的多, 他除了利用設定檔『 /etc/inittab 』來取得開機的等級 ( Run level ) 之外,還會經由這個 run level 的設定值來進行不同的開機服務項目的啟動。

那麼什麼是 run level 呢?他有什麼功用啊?其實很簡單啦, Linux 就是藉由設定 run level 來規定系統使用不同的服務來啟動,讓 Linux 的使用環境不同。基本上,依據有無網路與有無 X Window 而將 run level 分為六個等級,分別是:
  • 0 - halt (系統直接關機)
  • 1 - single user mode (單人維護模式,用在系統出問題時的維護)
  • 2 - Multi-user, without NFS (類似底下的 runlevel 3,但無 NFS 服務)
  • 3 - Full multi-user mode (完整的含有網路功能的純文字模式)
  • 4 - unused (系統保留功能)
  • 5 - X11 (與 runlevel 3 類似,但使用 X Window)
  • 6 - reboot (重新開機)
由於 run level 0, 4, 6 不是關機、重新開機就是系統保留的,所以:『 您當然不能將預設的 run level 設定為這三個值 』, 否則系統就會不斷的自動關機或自動重新開機....

好了,那麼我們開機時,到底是如何取得系統的 run level 的?呵呵!當然是 /etc/inittab 所設定的囉! 那麼 /etc/inittab 到底有什麼資訊呢?我們先來看看這個檔案的內容好了:
[root@linux ~]# vi /etc/inittab
# 設定系統開機預設的 run level 設定項目:
id:3:initdefault:

# 開始進行 run level 的服務啟動前,使用來偵測與初始化系統環境的設定檔:
si::sysinit:/etc/rc.d/rc.sysinit

# 7 個不同 run level 的,需要啟動的服務的 scripts 放置路徑:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# 是否允許按下 [ctrl]+[alt]+[del] 就重新開機的設定項目:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# 本機端終端機啟動的個數:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# 在 X Window (run level 5) 環境下的啟動 script 設定項目:
x:5:once:/etc/X11/prefdm -nodaemon
這個檔案的語法是這樣的:
[設定項目]:[run level]:[init 的動作行為]:[指令項目]
1. 設定項目:
最多四個字元,代表 init 的主要工作項目,只是一個簡單的代表說明。
2. run level:
該項目在哪些 run level 底下進行的意思。如果是 35 則代表 runlevel 3 與
5 都會執行。
3. init 的動作項目:
主要可以進行的動作項目意義有:
initdefault :代表預設的 run level 設定值;
sysinit :代表系統初始化的動作項目;
ctrlaltdel :代表 [ctrl]+[alt]+[del] 三個按鍵是否可以重新開機的設定;
wait :代表後面接的指令項目必須要執行完畢才能繼續後面的動作;
respawn :代表後面接的, init 仍會主動的『重新』啟動。
更多的設定項目請參考 man inittab 的說明。
4. 指令項目:
亦即應該可以進行的指令,通常是一些 script 囉。

所以我們可以得到這樣的結論:
  • 如果不想讓使用者利用 [crtl]+[alt]+[del] 來重新啟動系統,可以將底下這一行註解掉:
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now

  • 規定開機的預設 run level 是純文字 (3) 或者是具有圖形介面 (X Window, 5) ,可經由 『 id:3:initdefault: 』那個數字來決定! 以鳥哥自己這個檔案為例,我是使用純文字喔!
所以說,你現在會自行修改登入時的預設 run level 設定值了嗎?夠簡單的吧? 一般來說,我們預設都是 3 或者是 5 來作為預設的 run level 的。但有時後可能需要進入 run level 1, 也就是單人維護模式的環境當中。這個 run level 1 有點像是 Windows 系統當中的『安全模式』啦, 專門用來處理當系統有問題時的操作環境。此外,當系統發現有問題時,舉例來說,不正常關機造成 filesystem 的不一致現象時,系統會主動的進入單人維護模式呢!

好了, init 在取得 run level 之後,接下來要幹嘛? 上面 /etc/inittab 檔案內容不是有提到 sysinit 嗎?嘿嘿!準備初始化系統了吧!