1. 程式人生 > >IBM AIX 5.3 系統管理 -- 系統啟動過程詳解

IBM AIX 5.3 系統管理 -- 系統啟動過程詳解

. 啟動過程

啟動過程包含下面的一些步驟:

1.1啟動一個系統的初始步驟是上電自檢(Power On Self TestPOST)。其目的是驗證基本硬體是否處於正常的工作狀態。同時初始化記憶體、鍵盤、通訊,以及音訊裝置。您可以看到在螢幕上顯示了所有的這些裝置。在這個步驟中,您可以按下功能鍵,以選擇不同的啟動列表。這個階段中所顯示的 LED 值是模型特定的。硬體和軟體方面的問題都可能使得系統無法啟動。

注意:基於 MCI 體系結構的舊系統在這個步驟之前還將執行一個附加的步驟,即所謂的內建自檢(Built In Self TestBIST)。對於基於 PCI 體系結構的系統,不再需要執行這個步驟。

1.2 系統只讀儲存器(System Read Only StorageROS)對於每種型別的系統來說都是特定的。它是啟動 AIX 5L Version 5.3 所必需的,但是它並不為啟動工作構建所需的資料結構。它將定位和載入引導 (bootstrap) 程式碼。系統 ROS 中包含通用的啟動資訊,並且是獨立於作業系統的。

1.3 軟體 ROS(也稱為載入程式)構成了 IPL 控制塊,它與 AIX 5L Version 5.3 是相容的,用於接收控制和構建 AIX 5L 的特定啟動資訊。將在記憶體中定位一種特殊的檔案系統,並建立一種名為 RAMFS 的檔案系統。然後,軟體

ROS 定位、載入、並將控制權交給 AIX 5L 啟動邏輯卷 (BLV)。軟體 ROS 是基於計算機型別的 AIX 5L 資訊,並且負責完成計算機準備工作,以使得它能夠啟動 AIX 5L 核心。

1.4 可以從 /usr/lib/boot 目錄中獲得 BLV 中所包含的檔案的完整列表。其中最重要的元件包含以下內容:

1AIX 5L 核心

2)在啟動過程中呼叫的啟動命令,如 bootinfo cfgmgr

3ODM 的一個簡化的版本。在 hd4 可供使用之前,需要對許多裝置進行配置,所以它們的相應方法必須儲存在 BLV 中。這些裝置都被標記為預定義裝置

(PdDv) 中的基礎裝置。

4rc.boot 指令碼

1.5 載入 AIX 5L 核心,並接管控制權。系統將在 LED 面板上顯示 0299。前面所有的程式碼都是與硬體相關的。通過配置裝置和啟動 init 程序,核心將完成啟動過程。在這個階段中所顯示的 LED 程式碼都是通用的 AIX 5L 程式碼。

1.6 到此為止,系統對硬體進行了檢測、找到了 BLV、建立了 RAMFS,並且從 BLV 中啟動了 init 程序。但是尚未啟用 rootvg從現在開始,將呼叫三次 rc.boot 指令碼,並且每次都傳遞不同的引數。

1.6.1 啟動階段 1

在這個階段中,將執行下面的步驟:

1 RAMFS 啟動的 init 程序將執行啟動指令碼 rc.boot 1。如果出於某種原因,init 程序執行失敗,那麼將在 LED 顯示屏上顯示程式碼 c06

2在這個階段中,將呼叫 restbase 命令,以便將 ODM 的部分映象從 BLV 複製到 RAMFS。如果這個操作成功完成,那麼 LED 顯示屏將顯示 510;否則,將顯示 LED 程式碼 548

3在執行了該操作之後,cfgmgr -f 命令將從簡化的 ODM 中讀取 Config_Rules 類。在這個類中,將屬性 phase=1 的裝置認為是基礎裝置。基礎裝置是訪問 rootvg 所需的所有裝置。例如,如果 rootvg 位於某塊磁碟中,那麼必須對從主機板到磁碟之間的所有裝置進行初始化。呼叫相應的方法,以便能夠在啟動階段 2 中啟用 rootvg

4在啟動階段 1 結束後,將呼叫 bootinfo -b 命令以確定最後的啟動裝置。在這個階段中,LED 將顯示 511

1.6.2 啟動階段 2

在啟動階段 2 中,向 rc.boot 指令碼傳遞的引數為 2。在這個階段中,將執行下面的這些步驟:

1可以使用 varyonvg 命令(名為 ipl_varyon 命令)的特殊版本來啟用 rootvg 卷組。如果這個命令執行成功,那麼系統將顯示 517;否則,將顯示下面 LED 程式碼中的某一個:552554、或者 556,並且停止啟動過程。

2使用 fsck -f 命令來檢查根檔案系統 hd4。該操作將驗證在上一次關機之前是否已經乾淨地解除安裝了這個檔案系統。如果這個命令執行失敗,那麼系統將顯示程式碼 555

3將根檔案系統 (/dev/hd4) 裝入到 RAMFS 中的臨時裝入點 (/mnt)。如果這個操作執行失敗,那麼在 LED 顯示屏中將顯示 557

4使用 fsck -f 命令檢查 /usr 檔案系統,然後進行裝入。如果這個操作執行失敗,那麼 LED 將顯示 518

5使用 fsck -f 命令檢查 /var 檔案系統,然後進行裝入。使用 copycore 命令檢查是否發生了轉儲。如果發生了轉儲,那麼從預設轉儲裝置 /dev/hd6 複製到預設複製目錄 /var/adm/ras。然後,解除安裝 /var

6啟用 rootvg 的主分頁空間 /dev/hd6

7呼叫 mergedev 程序,並將 RAM 檔案系統的所有 /dev 檔案複製到磁碟。

8 RAM 檔案系統中所有自定義的 ODM 檔案複製到磁碟。對於 hd4 hd5 中的兩個 ODM 版本,現在進行同步。

9最後,將 rootvg(磁碟)中的根檔案系統裝入到 RAMFS 的根檔案系統。rootvg 檔案系統的裝入點已變得可用。現在,再次將 rootvg /var /usr 檔案系統裝入到它們的正常裝入點。

在這個階段中,不能使用控制檯,所以所有的啟動訊息都將複製到 alogalog 命令可以對日誌進行維護和管理。

1.6.3 啟動階段 3

在階段 2 完成之後,激活了 rootvg,並將執行下面的步驟:

1啟動 /etc/init 程序。它將讀取 /etc/inittab 檔案,並使用引數 3 呼叫 rc.boot

2裝入 /tmp 檔案系統。

3通過呼叫 syncvg 命令(將該命令啟動作為一個後臺程序)對 rootvg 進行同步。因此,將對 rootvg 中所有過時的分割槽進行更新。在這個階段中,將顯示 LED 程式碼 553

4在這個階段中,將呼叫 cfgmgr 命令;如果系統以正常模式進行啟動,那麼將使用選項 -p2 來呼叫 cfgmgr 命令;如果系統以服務模式進行啟動,那麼將使用選項 -p3 來呼叫 cfgmgr 命令。cfgmgr 命令將從 ODM 讀取 Config_rules 檔案,並且呼叫與 phase=2 或者 phase=3 相對應的所有方法。所有其他非基礎裝置的裝置,並不在這裡進行配置。

4接下來,通過呼叫 cfgcon 命令對控制檯進行配置。在配置了控制檯之後,如果沒有設定 STDOUT 重定向,那麼啟動訊息將傳送到控制檯。然而,可以在 /var/adm/ras/conslog 中找到所有遺漏的訊息。此時,可能顯示的 LED 程式碼包括:

1c31:控制檯尚未配置。提供相應的指令以選擇控制檯。

2c32:控制檯是 LFT 終端。

3c33:控制檯為 TTY

4c34:控制檯為磁碟中的檔案。

5最後,使用 savebase 命令對 BLV 中的 ODM / (root) 檔案系統中的 ODM 進行同步。

6啟動 syncd 守護程序和 errdemon

7LED 顯示屏將關閉。

8如果檔案 /etc/nologin 存在,則將其刪除。

9如果 CuDv 中有裝置被標記為缺失,那麼將在控制檯中顯示一條訊息。

10訊息“System initialization completed”傳送到控制檯。rc.boot 執行完成。程序 init 將繼續處理 /etc/inittab 中的下一條命令。

. 系統初始化

在系統啟動過程中,在預初始化過程中裝入根檔案系統之後,將發生下面這些事件:

1作為啟動過程中的最後一個步驟,執行 init 命令。

2init 命令嘗試讀取 /etc/inittab 檔案。

3如果 /etc/inittab 檔案存在,那麼 init 命令將嘗試在 /etc/inittab 檔案中查詢 initdefault 條目。

1)如果 initdefault 條目存在,那麼 init 命令使用指定的執行級別作為初始的系統執行級別。

2)如果 initdefault 條目不存在,那麼 init 命令將請求使用者從系統控制檯 (/dev/console) 輸入一個執行級別。

3)如果使用者輸入 SsM、或者 m 執行級別,那麼 init 命令將進入維護執行級別。只有這些執行級別不需要經過正確格式化的 /etc/inittab 檔案。

4如果 /etc/inittab 檔案不存在,那麼 init 命令在預設情況下將使系統進入維護執行級別。

5init 命令每隔 60 秒將再次讀取 /etc/inittab 檔案。如果在 init 命令上一次讀取 /etc/inittab 檔案之後,其中的內容發生了更改,那麼將執行 /etc/inittab 檔案中的新命令。

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

/etc/inittab 檔案提供了相應的指令碼,以使得 init 命令的角色成為通用的程序排程器。init 命令的程序排程活動中的主要程序是 /etc/getty 線路程序,它將啟動單獨終端線路。通常由 init 命令進行排程的其他程序包括守護程序和 Shell

/etc/inittab 檔案由一些與位置無關的條目組成,它們的格式如下所示:

Identifier:RunLevel:Action:Command

每個條目之間由一個換行符進行分隔。換行符前面加上一個反斜槓 (/) 表示繼續該條目。在 /etc/inittab 檔案中,對於條目的數目沒有任何限制(但不能超過最大的條目大小)。最大的條目大小為 1024 個字元。

條目欄位包括:

1Identifier,由一到十四個字元組成的欄位,唯一地標識一個物件。

2RunLevel,可以對該條目進行處理的執行級別。執行級別具有下面的屬性:

1執行級別有效地對應於系統中的程序配置。

2可以為每個由 init 命令啟動的程序分配一個或者多個執行級別(該程序可以存在於其中)。

3執行級別使用數字 0 9 進行表示。例如,如果系統處於執行級別 1,那麼只有那些在執行級別欄位中包含 1 的條目才會啟動。

4當您請求 init 命令更改執行級別時,在執行級別欄位中不包含匹配條目(對於目標執行級別)的所有程序都將接收到一個警告訊號 (SIGTERM)。在使用刪除訊號 (SIGKILL) 強行結束這些程序之前,有 20 秒鐘的過渡期。

5通過使用從 0 9 的任意組合,可以選擇多個執行級別,從而在執行級別欄位中為一個程序定義多個執行級別。如果沒有指定執行級別,那麼就假定該程序在所有的執行級別中都是有效的。

6在執行級別欄位中,還可能出現其他四種取值,即使它們並不是真正的執行級別:abc h。僅當使用 telinit 命令請求它們執行時(無論系統當前執行級別如何),才會處理那些執行級別欄位中包含這些字元的條目。它們與執行級別的不同之處在於,init 命令不可能進入到執行級別 abc 或者 h。另外,任何這些程序的執行請求都不會更改當前執行級別。而且,在 init 命令更改級別時,不會終止以 ab 或者 c 命令開頭的程序。只有在下面三種情況下才會終止它們:在 /etc/inittab 檔案中,它們所在行的操作欄位被標記為 off,從 /etc/inittab 中完全刪除它們所在的行,或者 init 命令進入到單使用者模式。

3Action,用於告訴 init 命令如何處理在程序欄位中指定的程序。init 命令能識別下列的操作:

1respawn如果程序不存在,則啟動該程序。不需要等待它的結束(繼續掃描 /etc/inittab 檔案)。當程序中止時,重新啟動該程序。如果該程序已經存在,則什麼也不做,繼續掃描 /etc/inittab 檔案。

2wait init 命令進入到與該條目的執行級別相匹配的執行級別時,啟動該程序,並等待它的結束。當 init 命令處於相同的執行級別時,所有後續對 /etc/inittab 檔案的讀取操作都將導致 init 命令忽略這個條目。

3once init 命令進入到與該條目的執行級別相匹配的執行級別時,啟動該程序,並且不需要等待它的結束。當它中止時,不重新啟動該程序。當系統進入一個新的執行級別,並且該程序的執行來自前一個執行級別更改時,不重新啟動該程式。

4boot僅在系統啟動時(即在系統啟動的過程中當 init 命令讀取 /etc/inittab 檔案的時候)處理該條目。啟動該程序,不需要等待它的結束,並且當它中止時,不重新啟動該程序。為了使得該指令有意義,執行級別應該為預設值,或者它必須與啟動時 init 命令的執行級別相匹配。對於系統硬體重新啟動之後的初始化功能來說,這種操作是非常有價值的。

5bootwait在系統啟動之後,當 init 命令第一次從單使用者進入到多使用者狀態時,處理該條目。啟動該程序,等待它的結束;並且當它中止時,不重新啟動該程序。如果 initdefault 2,那麼在啟動之後執行該程序。

6powerfail僅當 init 命令接收到電源故障訊號 (SIGPWR) 時,才執行與這個條目相關聯的程序。

7powerwait僅當 init 命令接收到電源故障訊號 (SIGPWR) 時,才執行與這個條目相關聯的程序,並且在繼續處理 /etc/inittab 檔案之前,必須等待它結束。

8off如果與這個條目相關聯的程序目前正在執行,那麼傳送警告訊號 (SIGTERM),等待 20 秒鐘,然後使用刪除訊號 (SIGKILL) 終止該程序。如果該程序沒有執行,則忽略這個條目。

9ondemand從功能上看,與 respawn 是相同的,但是這個操作適用於 ab 或者 c 值,而不是執行級別。

10initdefault僅在 init 命令最初被呼叫時,才掃描包含這個操作的條目。init 命令使用這個條目(如果它存在的話)來確定最初要進入的執行級別。通過使用執行級別欄位中所指定的最高執行級別,就可以實現這一點,並使用它作為其初始狀態。如果執行級別欄位為空,那麼將其解釋為“0123456789”:因此,init 命令將進入執行級別 9。另外,如果 init 命令在 /etc/inittab 檔案中沒有找到 initdefault 條目,那麼將要求使用者在啟動時指定一個最初的執行級別。

11sysinit init 命令在登入之前嘗試訪問控制檯時,將執行這種型別的條目。在正常情況下,這個條目僅用於初始化裝置(init 命令可能會對這些裝置詢問有關執行級別的問題)。執行這些條目,並等待它們結束,然後再繼續。

4Command要執行的 Shell 命令。整個命令欄位以 exec 作為字首,然後以 sh -c exec command 的形式傳遞給一個使用 fork 系統呼叫生成的 sh。任何合法的 sh 命令語法都可以出現在這個欄位中。可以使用 # comment 語法插入註釋。

getty 命令將覆蓋 /etc/inittab 檔案中出現在它之前的任何命令的輸出。要將這些命令的輸出記錄到啟動日誌,可以使用管道將它們的輸出傳遞給 alog -tboot 命令。

init 命令處理 inittab 條目時,stdinstdout stderr 檔案描述符可能是不可用的。向 stdout 或者 stderr 進行寫入操作的任何條目都可能無法按照預期的方式工作,除非它們將自己的輸出重定向到一個檔案或者 /dev/console

對於修改 /etc/inittab 檔案中的記錄,僅支援下列的命令:

1mkitab:將記錄新增到 /etc/inittab 檔案。

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

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

4rmitab:刪除 /etc/inittab 檔案中的記錄。

例如,向 /etc/inittab 檔案新增一條記錄,以便在執行級別 2 中執行 find 命令,並且在它結束後再次啟動它:

1. 執行 ps 命令,並顯示那些僅包含單詞 find 的程序:

# ps -ef | grep find

root 19750 139640 10:47:23 pts/00: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