AIX啓動過程

啓動過程

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

  • 啓動一個系統的初始步驟是上電自檢(Power On Self Test,POST)。其目的是驗證基本硬件是否處於正常的工作狀態。同時初始化內存、鍵盤、通信,以及音頻設備。您可以看到在屏幕上顯示了所有的這些設備。在這個步驟中,您可以按下功能鍵,以選擇不同的啓動列表。這個階段中所顯示的 LED 值是模型特定的。硬件和軟件方面的問題都可能使得系統無法啓動。
    注意:基於 MCI 體系結構的舊系統在這個步驟之前還將執行一個附加的步驟,即所謂的內建自檢(Built In Self Test,BIST)。對於基於 PCI 體系結構的系統,不再需要執行這個步驟。
  • 系統只讀存儲器(System Read Only Storage,ROS)對於每種類型的系統來說都是特定的。它是啓動 AIX 5L Version 5.3 所必需的,但是它並不爲啓動工作構建所需的數據結構。它將定位和加載引導 (bootstrap) 代碼。系統 ROS 中包含通用的啓動信息,並且是獨立於操作系統的。
  • 軟件 ROS(也稱爲引導程序)構成了 IPL 控制塊,它與 AIX 5L Version 5.3 是兼容的,用於接收控制和構建 AIX 5L 的特定啓動信息。將在內存中定位一種特殊的文件系統,並創建一種名爲 RAMFS 的文件系統。然後,軟件 ROS 定位、加載、並將控制權交給 AIX 5L 啓動邏輯卷 (BLV)。軟件 ROS 是基於計算機類型的 AIX 5L 信息,並且負責完成計算機準備工作,以使得它能夠啓動 AIX 5L 內核。
  • 可以從 /usr/lib/boot 目錄中獲得 BLV 中所包含的文件的完整列表。其中最重要的組件包含以下內容:
    • AIX 5L 內核
    • 在啓動過程中調用的啓動命令,如 bootinfo 和 cfgmgr
    • ODM 的一個簡化的版本。在 hd4 可供使用之前,需要對許多設備進行配置,所以它們的相應方法必須存儲在 BLV 中。這些設備都被標記爲預定義設備 (PdDv) 中的基礎設備。
    • rc.boot 腳本
  • 加載 AIX 5L 內核,並接管控制權。系統將在 LED 面板上顯示 0299。前面所有的代碼都是與硬件相關的。通過配置設備和啓動 init 進程,內核將完成啓動過程。在這個階段中所顯示的 LED 代碼都是通用的 AIX 5L 代碼。
  • 到此爲止,系統對硬件進行了檢測、找到了 BLV、創建了 RAMFS,並且從 BLV 中啓動了 init 進程。但是尚未激活 rootvg。從現在開始,將調用三次 rc.boot 腳本,並且每次都傳遞不同的參數。

啓動階段 1

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

  • 從 RAMFS 啓動的 init 進程將執行啓動腳本 rc.boot 1。如果出於某種原因,init 進程執行失敗,那麼將在 LED 顯示屏上顯示代碼 c06。
  • 在這個階段中,將調用 restbase 命令,以便將 ODM 的部分鏡像從 BLV 複製到 RAMFS。如果這個操作成功完成,那麼 LED 顯示屏將顯示 510;否則,將顯示 LED 代碼 548。
  • 在執行了該操作之後,cfgmgr -f 命令將從簡化的 ODM 中讀取 Config_Rules 類。在這個類中,將屬性 phase=1 的設備認爲是基礎設備。基礎設備是訪問 rootvg 所需的所有設備。例如,如果 rootvg 位於某塊磁盤中,那麼必須對從主板到磁盤之間的所有設備進行初始化。調用相應的方法,以便能夠在啓動階段 2 中激活 rootvg。
  • 在啓動階段 1 結束後,將調用 bootinfo -b 命令以確定最後的啓動設備。在這個階段中,LED 將顯示 511。

啓動階段 2

在啓動階段 2 中,向 rc.boot 腳本傳遞的參數爲 2。
在這個階段中,將執行下面的這些步驟:

  • 可以使用 varyonvg 命令(名爲 ipl_varyon 命令)的特殊版本來激活 rootvg 卷組。如果這個命令執行成功,那麼系統將顯示 517;否則,將顯示下面 LED 代碼中的某一個:552、554、或者 556,並且停止啓動過程。
  • 使用 fsck -f 命令來檢查根文件系統 hd4。該操作將驗證在上一次關機之前是否已經乾淨地卸載了這個文件系統。如果這個命令執行失敗,那麼系統將顯示代碼 555。
  • 將根文件系統 (/dev/hd4) 裝入到 RAMFS 中的臨時裝入點 (/mnt)。如果這個操作執行失敗,那麼在 LED 顯示屏中將顯示 557。
  • 使用 fsck -f 命令檢查 /usr 文件系統,然後進行裝入。如果這個操作執行失敗,那麼 LED 將顯示 518。
  • 使用 fsck -f 命令檢查 /var 文件系統,然後進行裝入。使用 copycore 命令檢查是否發生了轉儲。如果發生了轉儲,那麼從缺省轉儲設備 /dev/hd6 複製到缺省複製目錄 /var/adm/ras。然後,卸載 /var。
  • 激活 rootvg 的主分頁空間 /dev/hd6。
  • 調用 mergedev 進程,並將 RAM 文件系統的所有 /dev 文件複製到磁盤。
  • 將 RAM 文件系統中所有自定義的 ODM 文件複製到磁盤。對於 hd4 和 hd5 中的兩個 ODM 版本,現在進行同步。
  • 最後,將 rootvg(磁盤)中的根文件系統裝入到 RAMFS 的根文件系統。rootvg 文件系統的裝入點已變得可用。現在,再次將 rootvg 的 /var 和 /usr 文件系統裝入到它們的正常裝入點。

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

啓動階段 3

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

  • 啓動 /etc/init 進程。它將讀取 /etc/inittab 文件,並使用參數 3 調用 rc.boot。
  • 裝入 /tmp 文件系統。
  • 通過調用 syncvg 命令(將該命令啓動作爲一個後臺進程)對 rootvg 進行同步。因此,將對 rootvg 中所有過時的分區進行更新。在這個階段中,將顯示 LED 代碼 553。
  • 在這個階段中,將調用 cfgmgr 命令;如果系統以正常模式進行啓動,那麼將使用選項 -p2 來調用 cfgmgr 命令;如果系統以服務模式進行啓動,那麼將使用選項 -p3 來調用 cfgmgr 命令。cfgmgr 命令將從 ODM 讀取 Config_rules 文件,並且調用與 phase=2 或者 phase=3 相對應的所有方法。所有其他非基礎設備的設備,並不在這裏進行配置。
  • 接下來,通過調用 cfgcon 命令對控制檯進行配置。在配置了控制檯之後,如果沒有設置 STDOUT 重定向,那麼啓動消息將發送到控制檯。然而,可以在 /var/adm/ras/conslog 中找到所有遺漏的消息。此時,可能顯示的 LED 代碼包括:
    • c31:控制檯尚未配置。提供相應的指令以選擇控制檯。
    • c32:控制檯是 LFT 終端。
    • c33:控制檯爲 TTY。
    • c34:控制檯爲磁盤中的文件。
  • 最後,使用 savebase 命令對 BLV 中的 ODM 與 / (root) 文件系統中的 ODM 進行同步。
  • 啓動 syncd 守護進程和 errdemon。
  • LED 顯示屏將關閉。
  • 如果文件 /etc/nologin 存在,則將其刪除。
  • 如果 CuDv 中有設備被標記爲缺失,那麼將在控制檯中顯示一條消息。
  • 消息“System initialization completed”發送到控制檯。rc.boot 執行完成。進程 init 將繼續處理 /etc/inittab 中的下一條命令。

系統初始化

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

  • 作爲啓動過程中的最後一個步驟,運行 init 命令。
  • init 命令嘗試讀取 /etc/inittab 文件。
  • 如果 /etc/inittab 文件存在,那麼 init 命令將嘗試在 /etc/inittab 文件中查找 initdefault 條目。
    • 如果 initdefault 條目存在,那麼 init 命令使用指定的運行級別作爲初始的系統運行級別。
    • 如果 initdefault 條目不存在,那麼 init 命令將請求用戶從系統控制檯 (/dev/console) 輸入一個運行級別。
    • 如果用戶輸入 S、s、M、或者 m 運行級別,那麼 init 命令將進入維護運行級別。只有這些運行級別不需要經過正確格式化的 /etc/inittab 文件。
  • 如果 /etc/inittab 文件不存在,那麼 init 命令在缺省情況下將使系統進入維護運行級別。
  • init 命令每隔 60 秒將再次讀取 /etc/inittab 文件。如果在 init 命令上一次讀取 /etc/inittab 文件之後,其中的內容發生了更改,那麼將執行 /etc/inittab 文件中的新命令。

/etc/inittab 文件

/etc/inittab 文件用於控制初始化過程。

/etc/inittab 文件提供了相應的腳本,以使得 init 命令的角色成爲通用的進程調度器。init 命令的進程調度活動中的主要進程是 /etc/getty 線路進程,它將啓動單獨終端線路。通常由 init 命令進行調度的其他進程包括守護進程和 Shell。

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

Identifier:RunLevel:Action:Command

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

條目字段包括:

  • Identifier,由一到十四個字符組成的字段,唯一地標識一個對象。
  • RunLevel,可以對該條目進行處理的運行級別。
    運行級別具有下面的屬性:
    • 運行級別有效地對應於系統中的進程配置。
    • 可以爲每個由 init 命令啓動的進程分配一個或者多個運行級別(該進程可以存在於其中)。
    • 運行級別使用數字 0 到 9 進行表示。例如,如果系統處於運行級別 1,那麼只有那些在運行級別字段中包含 1 的條目纔會啓動。
    • 當您請求 init 命令更改運行級別時,在運行級別字段中不包含匹配條目(對於目標運行級別)的所有進程都將接收到一個警告信號 (SIGTERM)。在使用刪除信號 (SIGKILL) 強行結束這些進程之前,有 20 秒鐘的過渡期。
    • 通過使用從 0 到 9 的任意組合,可以選擇多個運行級別,從而在運行級別字段中爲一個進程定義多個運行級別。如果沒有指定運行級別,那麼就假定該進程在所有的運行級別中都是有效的。
    • 在運行級別字段中,還可能出現其他四種取值,即使它們並不是真正的運行級別:a、b、c 和 h。僅當使用 telinit 命令請求它們運行時(無論系統當前運行級別如何),纔會處理那些運行級別字段中包含這些字符的條目。它們與運行級別的不同之處在於,init 命令不可能進入到運行級別 a、b、c 或者 h。另外,任何這些進程的執行請求都不會更改當前運行級別。而且,在 init 命令更改級別時,不會終止以 a、b 或者 c 命令開頭的進程。只有在下面三種情況下才會終止它們:在 /etc/inittab 文件中,它們所在行的操作字段被標記爲 off,從 /etc/inittab 中完全刪除它們所在的行,或者 init 命令進入到單用戶模式。
  • Action,用於告訴 init 命令如何處理在進程字段中指定的進程。init 命令能識別下列的操作:
    • 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 命令可能會對這些設備詢問有關運行級別的問題)。執行這些條目,並等待它們結束,然後再繼續。
  • Command:要執行的 Shell 命令。整個命令字段以 exec 作爲前綴,然後以 sh -c exec command 的形式傳遞給一個使用 fork 系統調用生成的 sh。任何合法的 sh 命令語法都可以出現在這個字段中。可以使用 # comment 語法插入註釋。

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

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

對於修改 /etc/inittab 文件中的記錄,僅支持下列的命令:

  • mkitab:將記錄添加到 /etc/inittab 文件。
  • lsitab:列出 /etc/inittab 文件中的記錄。
  • chitab:更改 /etc/inittab 文件中的記錄。
  • rmitab:刪除 /etc/inittab 文件中的記錄。

例如,您希望向 /etc/inittab 文件添加一條記錄,以便在運行級別 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 28972 13964   0 11:07:33  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,所以一個新的 find 進程(上面顯示的 28966)在前一個進程結束後又被系統啓動了。
這個進程會被不斷的重新啓動,除非把 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  

# 


可以看到 find 進程沒有再被系統啓動。

要從 /etc/inittab 文件中刪除這條記錄,您可以使用 rmitab 命令。例如:

# rmitab xcmd

# lsitab xcmd

# 

/etc/inittab 條目的順序

在 /etc/inittab 文件中,基本條目按照如下所示的方式進行排序:

  • initdefault
  • sysinit
  • Powerfailure Detection (powerfail)
  • Multiuser check (rc)
  • /etc/firstboot (fbcheck)
  • System Resource Controller (srcmstr)
  • Start TCP/IP daemons (rctcpip)
  • Start NFS daemons (rcnfs)
  • cron
  • pb cleanup (piobe)
  • getty for the console (cons)

必須在 etc/inittab 文件的開始處附近啓動系統資源控制器(System Resource Controller,SRC),因爲需要 SRC 守護進程來啓動其他進程。因爲 NFS 需要 TCP/IP 守護進程正確地運行,所以應該在啓動 NFS 守護進程之前啓動 TCP/IP 守護進程。/etc/inittab 文件中的條目根據依賴關係進行排序,這意味着,如果一個進程 (process2) 的正常運行需要另一個進程 (process1) 的存在,那麼在 /etc/inittab 文件中,process1 的條目應該出現在 process2 的條目之前。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章