主要參考文檔:
http://www.ibm.com/developerworks/cn/aix/redbooks/test222/boot-process/test222-bootprocess1.html
啟動過程上電自檢(power on self test,post)。ROS載入引導程式
系統唯讀記憶體(system read only storage,ROS)。它是獨立於作業系統的,我的理解就是相當於pc中的bios,它的作用就是定位和載入引導代碼。引導代碼也就是引導程式(initial program loading, IPL)。這段程式做一些準備工作,比如在記憶體中建立一種名為RAMFS的檔案系統等。
引導程式定位BLV
之後就定位、載入並將控制權交給BLV(boot logical volume)。
BLV接管控制權,載入核心。調用3此rc.boot指令碼
3次分別傳遞參數1、2、3完成系統啟動。Rc.boot指令碼在系統引導完成後的位置在/sbin目錄下,若想詳細瞭解3次rc.boot調用的過程可直接查看指令碼內容。
三次rc.boot調用Rc.boot 1
BLV從RAMFS啟動init進程,執行啟動指令碼rc.boot 1。這個過程中的操作有:把ODM中的部分鏡像從BLV複製到RAMFS。然後調用cfgmgr -f命令從這個ODM中讀取一些基礎裝置的設定項,並完成這些基礎裝置的初始化。這些基礎裝置就是訪問rootvg所需的所有的裝置,把基礎裝置初始化從而使2階段中啟用rootvg可以順利進行。在1階段最後,還將調用bootinfo -b命令確定最後的啟動裝置。
Rc.boot 2
啟用rootvg檔案系統,並檢查裝載/usr、/var檔案系統。
Rc.boot 3
啟動/etc/init進程,它將讀取/etc/inittab檔案。
/etc/inittab中的首先將執行rc.boot 3.。這一過程主要完成裝入/tmp檔案系統、對rootvg進行同步,調用cfgmgr命令來初始化裝置,調用cfgcon命令配置控制台,使用savebase命令同步BLV中的ODM和/根檔案系統中的ODM。以及啟動sysncd守護進程和errdemon。
之後,init將繼續執行inittab檔案中的內容,以最終完成系統的初始化。
BLV
BLV中包含的內容可在/usr/lib/boot目錄下進行查看,主要包括系統AIX核心、ODM的一個簡化版本,以及一些基礎裝置的配置方法。系統預設BLV=hd5.
Inittab檔案
在執行完三次rc.boot後,ODM就已經被載入到記憶體,裝置已初始化完成,檔案系統也掛載完畢,作業系統基本的準備工作已經就緒。
之後就是完成作業系統的定製部分,比如啟動cron、tcpip等的守護進程。這些之後的操作都是根據inittab檔案中的內容進行的。
Inittab檔案中每行的格式為:
Identifier:RunLevel:Action:Command
Identifier就是一個標示,就是起個名字,無實質意義。要求在整個inittab檔案內唯一。
Runlevel指名該句執行的運行層級,內容為0-9的數位任意組合。
Action為告訴init程式如何執行該行中的命令。
Command就是要執行的命令內容。
其中action可用的選項及意義有:
respawn:如果進程不存在,則啟動該進程。不需要等待它的結束(繼續掃描 /etc/inittab 檔案)。當進程中止時,重新啟動該進程。如果該進程已經存在,則什麼也不做,繼續掃描 /etc/inittab 檔案。
wait:當 init 命令進入到與該條目的運行層級相匹配的運行層級時,啟動該進程,並等待它的結束。當 init 命令處於相同的運行層級時,所有後續對 /etc/inittab 檔案的讀取操作都將導致 init 命令忽略這個條目。
once:當 init 命令進入到與該條目的運行層級相匹配的運行層級時,啟動該進程,並且不需要等待它的結束。當它中止時,不重新啟動該進程。當系統進入一個新的運行層級,並且該進程的運行來自前一個運行層級更改時,不重新啟動該程式。
boot:僅在系統啟動時(即在系統啟動的過程中當 init 命令讀取 /etc/inittab 檔案的時候)處理該條目。啟動該進程,不需要等待它的結束,並且當它中止時,不重新啟動該進程。為了使得該指令有意義,運行層級應該為預設值,或者它必須與啟動時 init 命令的運行層級相匹配。對於系統硬體重新啟動之後的初始化功能來說,這種操作是非常有價值的。
bootwait:在系統啟動之後,當 init 命令第一次從單使用者進入到多使用者狀態時,處理該條目。啟動該進程,等待它的結束;並且當它中止時,不重新啟動該進程。如果 initdefault 為 2,那麼在啟動之後運行該進程。
powerfail:僅當 init 命令接收到電源故障訊號 (SIGPWR) 時,才執行與這個條目相關聯的進程。
powerwait:僅當 init 命令接收到電源故障訊號 (SIGPWR) 時,才執行與這個條目相關聯的進程,並且在繼續處理 /etc/inittab 檔案之前,必須等待它結束。
off:如果與這個條目相關聯的進程目前正在運行,那麼發送警告訊號 (SIGTERM),等待 20 秒鐘,然後使用刪除訊號 (SIGKILL) 終止該進程。如果該進程沒有運行,則忽略這個條目。
ondemand:從功能上看,與 respawn 是相同的,但是這個操作適用於 a、b 或者 c 值,而不是運行層級。
initdefault:僅在 init 命令最初被調用時,才掃描包含這個操作的條目。init 命令使用這個條目(如果它存在的話)來確定最初要進入的運行層級。通過使用運行層級欄位中所指定的最高運行層級,就可以實現這一點,並使用它作為其初始狀態。如果運行層級欄位為空白,那麼將其解釋為“0123456789”:因此,init 命令將進入運行層級 9。另外,如果 init 命令在 /etc/inittab 檔案中沒有找到 initdefault 條目,那麼將要求使用者在啟動時指定一個最初的運行層級。
sysinit:當 init 命令在登入之前嘗試存取控制台時,將執行這種類型的條目。在正常情況下,這個條目僅用於初始化裝置(init 命令可能會對這些裝置詢問有關運行層級的問題)。執行這些條目,並等待它們結束,然後再繼續。
若想設定自己的指令碼開機自啟動,可直接修改此檔案,
在此檔案中加上一行。不過一般要加在檔案的末尾,因為此檔案的系統啟動部分,有些程式之間有嚴格的依賴關係,故不能修改順序。
此外,一般不建議修改此檔案。若想把自己的程式設定成開機自啟動,可直接在/etc/rc.d/rc2.d目錄下,增加一個開機檔案。這個目錄下以S開頭的為開機執行的指令碼,並向指令碼傳遞start參數。以K開頭的為關機時執行的指令碼,並向指令碼傳遞stop參數。
這些指令碼在inittab檔案中安排的執行順序為
l2:2:wait:/etc/rc.d/rc 2
即通過向rc指令碼傳遞runlevel參數執行該檔案夾下的內容。
一些其他命令
顯示當前運行層級
Cat /etc/.init.state
更改當前運行層級(此命令要在終端中執行)
Telinit 3(運行層級的數字)
顯示當前可用的啟動列表
Bootlist -m normal -o
-m參數為指定模式,有normal、service、both 或者 prevboot。
-o參數為執行了指定改變後,顯示啟動列表。
更改當前的啟動順序
Bootlist -m normal cd0 hdisk0(後面直接接啟動順序)
修改inittab檔案的幾個命令
Mkitab增加記錄,lsitab列出記錄,chitab更改記錄,rmitab刪除記錄。