⑴ 幫忙解釋AIX中的init謝謝!
AIX(Advanced Interactive eXecutive)是IBM開發的一套UNIX操作系統。它符合Open group的UNIX 98行業標准(The Open Group UNIX 98 Base Brand),通過全面集成對32-位和64-位應用的並行運行支持,為這些應用提供了全面的可擴展性。它可以在所有的IBM ~ p系列和IBM RS/6000工作站、伺服器和大型並行超級計算機上運行。
在系統啟動過程中,在預初始化過程中裝入根文件系統之後,將發生下面這些事件:
作為啟動過程中的最後一個步驟,運行 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 的條目之前。