4. 起始程序(Initscripts)
4.a. 執行階段(Runlevels)
啟用您的系統
當您開啟您的系統,您將會看到很多文字跳過。如果您注意一點,您將會發現那些文字都是一樣的。這些動作叫做固定式的 開機序列。
首先,您的開機程式將會載入您所定義到設定檔內的核心映像檔,並且將他放到記憶體內。這是為了要告訴 CPU 該執行核心。當核心載入完畢開始執行後,它將會起始核心相關的架構和程序然後開始 init 的程序。
這個步驟是為了確保所有的檔案系統(被定義在 /etc/fstab)有被載入並且可以使用。然後將執行一些放在 /etc/init.d 的給個程序,將啟用所有您打算開啟的服務。
最後,當所有的程序都執行後,init 將會啟用終端(在大多的例子裡,只是幾個藏在 Alt-F1 下的虛擬終端,Alt-F2,等等。)包含著一個特別的程序叫做 agetty。然後這個程序將會使用 login 讓您可以登入到這些終端內。
Init 程序
現在 init 不只是執行 /etc/init.d 裡面的程序。更多的是,他還會依照 /etc/runlevels 來選擇要執行的程序。
首先,init 將執行所有 /etc/runlevels/boot 內的連接,這些連接將會連到 /etc/init.d 裡面的程序。大部份來說,這些將會按照字母排列分別起始,但是有些會因為相依性的關係而先執行其他的程序。
當 /etc/runlevels/boot 內的程序都被執行後,init 將繼續執行 /etc/runlevels/default 內的連接。在一次,這些將會按照字母排列分別起始,但是有些會因為相依性的關係而先執行其他的程序。
Init 是如何執行的
當然 init 不能自己決定所有的選擇。他需要一個設定檔來告訴要有那些動作。這個設定檔為 /etc/inittab。
如果您記得剛剛解釋過的開機序列,您將會記得 init 的第一個動作就是掛載所有的檔案系統。這將會按照以下的方式定義在 /etc/inittab:
原始碼 1: /etc/inittab 的系統起始 |
si::sysinit:/sbin/rc sysinit |
這行將告訴 init 一定要執行 /sbin/rc sysinit來起始系統。 /sbin/rc 的程序將掌管起始的動作,您也可以說 init 的工作其實不多 -- 它只是指派起始系統的工作給另外一個程序。
第二,init 將執行 /etc/runlevels/boot 內所有的連接。將按照以下定義:
原始碼 2: 繼續系統起始 |
rc::bootwait:/sbin/rc boot |
rc 程序再一次的執行相關工作。但是這是是 rc (boot)將會去執行 /etc/runlevels 的相關目錄。
現在 init 將檢察他的設定檔然後查看他應該執行那個階段。要決定這個,它將會從 /etc/inittab 取以下這行:
原始碼 3: init預設(initdefault) |
id:3:initdefault: |
在這個例子(大多數的 Gentoo 使用者也會使用),將會從第三個執行階段開始。使用這個資訊,init 將會從 執行階段 3 開始:
原始碼 4: 定義執行階段 |
l0:0:wait:/sbin/rc shutdown l1:S1:wait:/sbin/rc single l2:2:wait:/sbin/rc nonetwork l3:3:wait:/sbin/rc default l4:4:wait:/sbin/rc default l5:5:wait:/sbin/rc default l6:6:wait:/sbin/rc reboot |
這行將定義第三階段,然後執行 rc 程序來選擇要啟用的服務(現在則是更改為 default)。這個 rc 後面的參數將會合 /etc/runlevels 內的子目錄一樣。
當 rc 完成的時候,init 將會決定應該要啟用那些虛擬終端和在各終端應該執行什麼指令:
原始碼 5: 虛擬終端定義 |
c1:12345:respawn:/sbin/agetty 38400 tty1 linux c2:12345:respawn:/sbin/agetty 38400 tty2 linux c3:12345:respawn:/sbin/agetty 38400 tty3 linux c4:12345:respawn:/sbin/agetty 38400 tty4 linux c5:12345:respawn:/sbin/agetty 38400 tty5 linux c6:12345:respawn:/sbin/agetty 38400 tty6 linux |