在學習本主題之前,還是先學習一些AIX關于啟動的基礎知識,如果你只關心如何開機自動重啟程序,請跳過第一章、第二章。
----------------------------
第一章 AIX開機啟動過程介紹
----------------------------
不從最開始說起了,只說從AIX kernel被裝載到內存開始。
1、AIX系統存儲在BLV的kernel在內存中創建/(root),/usr/和/var文件系統。
要注意,這里所說的文件系統,包括kernel在啟動過程中都是存儲在RAM(內存)中的。
他們沒有權限訪問BLV之外的任何內容。
2、文件系統被裝載到RAM之后,kernel開始執行init進程,這個時候init進程開始接管系統啟動進程。
3、AIX kernel把init進程的PID設為1,這個進程是作為parent,root進程存在的,是AIX系統中運行的其他所有進程的父進程.當init進程被裝載并在啟動過程運行,init調用rc.boot.
4、rc.boot文件在AIX系統啟動過程中有三個重要的作用。
(1)、第一部分是rc.boot初始化了系統的硬件,使其為系統的啟動做好準備。通過系統設置命令cfgmgr,一小部分系統啟動需要的驅動被配置。
(2)、第二部分是文件系統/,/usr,/var和頁面空間被裝載。在這些文件系統被裝載以后,init被硬盤上的PID為1的init進程所替代,同時RAM被清空。
(3)、第三部分和最后部分,rc.boot,實際的init進程是從硬盤上運行的。
當init被執行后,/etc/inittab文件被堵去,同時里面的每一條都被執行。
在這個過程中,/tmp文件系統正被裝載到硬盤上。
現在,系統正在啟動的最后過程中,cfgmgr命令再一次運行把剩下的在第一部分沒有被rc.boot運行的驅動運行起來。
5、init進程被執行以后,下一步就是init會打開/etc/inittab,并且執行里面的內容。
----------------------------------------------
第二章 AIX啟動的相關命令知識
----------------------------------------------
1、確認當前系統的運行級別
在系統維護或者切換系統運行級別之前,你也許需要檢查當前系統的運行級別。
cat /etc/.init.state
lsitab init
2、顯示系統運行級別的更改紀錄
提示:確保bosext2.acct.obj 代碼安裝在你的系統上。
(1) 以root身份登陸系統.
(2) 執行/usr/lib/acct/fwtmp </var/adm/wtmp |grep run-level
得到類似的結果:
run-level 2 0 1 0062 0123 697081013 Sun Feb 2 19:36:53 CST 1992
run-level 2 0 1 0062 0123 697092441 Sun Feb 2 22:47:21 CST 1992
run-level 4 0 1 0062 0123 698180044 Sat Feb 15 12:54:04 CST 1992
3、改變系統運行級別基礎知識
當系統第一次啟動之后,系統按照/etc/inittab文件的內容,進入默認的系統運行級別,直到系統管理員發出改變系統級別的命令。
下面是系統定義的系統運行級別:
0-9 當init命令改變系統運行級別為0-9時,將會殺掉當前系統級別下正在運行的所有進程,并進入新的系統運行級別。
0-1 為未來的操作系統保留
2 默認運行級別
3-9 可以根據用戶的需求進行自定義
a,b,c 當init命令接收到運行a,b或者c的時候,init命令不殺死任何當前運行的進程,只是啟動新運行級別內定義的新進程。
Q,q init命令將會重新檢查/etc/inittab文件
S、s 維護模式
M、m 維護模式
4、改變系統運行級別
(1)、檢查/etc/inittab文件,確認你想改變的系統運行級別。
(2)、使用wall命令通知所有用戶你將改變
(3)、使用smit telinit快速改變系統運行級別
(4)、使用init n或者telinit n命令改變系統運行級別,其中n為系統運行級別。
5、改變/etc/inittab文件
在有些情況下,你需要增加、改變、列出、刪除/etc/inittab文件中的記錄。/etc/inittab文件定義了哪些進程在哪個系統運行級別里運行。
當你運行init命令的時候,它將讀取/etc/inittab文件。每一條記錄定義了一個進程在一個進程的運行。
(1)、/etc/inittab文件參數
Identifier 定義了唯一的標識(1到14個字符)。
Run Level 定義了進程所在的運行級別(1到20個字符)。
Action 定義了init命令將為此條進程執行的操作,包括:respawn,wait,once,boot,bootwait,powerfail,powerwait,off,hold,ondemand,initdefault和sysinit.
respawn 如果進程不存在,Start這個進程,不等待它的結束,繼續掃描inittab文件。如果這個進程結束了,restart它。
wait Start這個進程,并且等待它的結束。
once Start這個進程,并且不等待它的結束。如果這個進程結束,不restart它。
boot 僅在系統重啟時執行。
bootwait 當服務第一次從單用戶變為多用戶時執行
powerfail 僅當如果init收到一條power錯誤時執行命令
powerwait 僅當如果init收到一條power錯誤時執行命令,同時一直等待進程的結束,然后才繼續掃描inittab文件。
off 如果進程正在運行,發出SIGTERM信號,然后在20秒內執行SIGKILL
ondemand 這個參數等同于respawn,但是只在a,b,c級別運行。
initdefault 只有當init初始化執行,才掃描內容。
sysinit 在登陸前,在init得到權限控制之前執行內容。
Command 包含需要執行的shell命令。
(2)、下面的命令可以支持對/etc/inittab文件進行操作。
chitab 改變/etc/inittab文件的記錄。
lsitab 列出/etc/inittab文件的記錄。
mkitab 往/etc/inittab文件里增加記錄。
rmitab 從/etc/inittab文件里刪除記錄。
(3)、命令舉例
增加紀錄
往/etc/inittab文件里增加一條記錄,執行
mkitab Identifier:Run Level:Action:Command
例如:tty002:2:respawn:/usr/sbin/getty /dev/tty2
改變記錄
改變/etc/inittab文件里的一條記錄,執行
chitab Identifier:Run Level:Action:Command
例如:將上例的運行級別從2改為2和3,chitab tty002:23:respawn:/usr/sbin/getty /dev/tty2
列出記錄
列出/etc/inittab文件中的所有記錄
lsitab -a
列出某個指定的記錄
lsitab Identifier
例如:lsitab tty2
刪除記錄
rmitab Identifier
例如:rmitab tty2
6、執行運行級別腳本
運行級別腳本允許用戶在更改運行級別時啟動和停止所選擇的應用程序。以 K 開頭的腳本是停止腳本,以 S 開頭的腳本是啟動腳本。
這些腳本保存于它們所從屬的運行級別的特定子目錄中,每個子目錄的格式為 rcn.d,其中 n 表示運行級別:
/etc/rc.d/rc2.d
/etc/rc.d/rc3.d
/etc/rc.d/rc4.d
/etc/rc.d/rc5.d
/etc/rc.d/rc6.d
/etc/rc.d/rc7.d
/etc/rc.d/rc8.d
/etc/rc.d/rc9.d
---------------------------------------
第三章 開機自動運行程序
---------------------------------------
開機啟動程序的方法有很多,我只談談思路,然后給出一些解決方法。
從第一章AIX系統啟動過程,我們知道AIX系統在啟動過程中,會掃描inittab文件的內容,并執行它。
1、那么,我們可以通過直接修改inittab文件,使系統在開機重啟時運行我們的命令。
2、也可以通過inittab文件里指向的腳本(rc.local、rc.d組,后面會詳細介紹)。
間接使系統在開機重啟時運行我們的命令。
3、其他方法:如使用crontab的定時任務功能,間接啟動腳本,
這種方法不是開機后馬上運行,要看crontab里設置的時間間隔的長短而定。
一、通過rc.local啟動(
最簡單的方法)
rc.local是inittab里的一個腳本指向,通過運行lsitab -a|grep rc.local ,我們可以得到rc.local:2:once:/etc/rc.local > /dev/console 2>&1
1、 mkitab -i rcnfs "rc.local:2:once:/etc/rc.local > /dev/console 2>&1" #如果inittab文件里沒有關于rc.local的信息,可以通過此命令創建腳本。
注意系統運行級別要與你想要運行的系統運行級別一致,這里系統運行級別是2。
2、touch /etc/rc.local #新建rc.local文件
3、chmod 700 /etc/rc.local #設置執行權限
4、把執行腳本放到/etc/rc.local里之后,AIX系統在重新啟動時,就會運行/etc/rc.local里的腳本了。
二、通過/etc/rc.d腳本啟動(
需要編寫start\stop腳本)
/etc/rc.d是inittab里的一組腳本指向,通過運行lsitab -a|grep rc.d,我們得到
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
l7:7:wait:/etc/rc.d/rc 7
l8:8:wait:/etc/rc.d/rc 8
l9:9:wait:/etc/rc.d/rc 9
1、cd /etc/rc.d/ #進入/etc/rc.d目錄
2、cd /samples #進入/etc/rc.d/samples 目錄,可以得到K70lpd、README.txt、S70lpd三個文件。
這里只是簡單的模仿K70lpd和S70lpd,更高級的方法,留給大家自己研究了。
下面,我們分別創建自己的啟動和結束腳本。
例如:
# more K69oa
#!/bin/ksh
##################################################
# name: K69oa
# purpose: sample script that start or stop oa.
#轉載請注明From:http://hi.baidu.com/空氣人兒
##################################################
case "$1" in
start )
WebSphere/AppServer/bin/startServer.sh server1
IBMHttpServer/bin/apachectl start
;;
stop )
WebSphere/AppServer/bin/stopServer.sh server1
IBMHttpServer/bin/apachectl stop
;;
* )
echo "Usage: $0 (start | stop)"
exit 1
esac
# more S69oa
#!/bin/ksh
##################################################
# name: S69oa
# purpose: sample script that start or stop oa.
#轉載請注明From:http://hi.baidu.com/空氣人兒
##################################################
case "$1" in
start )
WebSphere/AppServer/bin/startServer.sh server1
IBMHttpServer/bin/apachectl start
;;
stop )
WebSphere/AppServer/bin/stopServer.sh server1
IBMHttpServer/bin/apachectl stop
;;
* )
echo "Usage: $0 (start | stop)"
exit 1
esac
3、chmod 700 這兩個腳本
4、把這兩個腳本放到/etc/rc.d/rc2 下。
5、使用shutdown -rF重新啟動機器時,會自動運行放在/etc/rc.d/rc2下的S69oa腳本中的stop部分;
系統重啟之后,系統會自動運行放在/etc/rc.d/rc2下的S69oa腳本中的start部分。
三、自定義啟動腳本(與方法一基本相同,自己研究吧)
參考:
http://publib16.boulder.ibm.com/pseries/en_US/infocenter/base/43_docs/aixbman/baseadmn/toc.htm
http://www.ibm.com/developerworks/aix/library/au-speakingunix_unixboot/index.html
轉載自:http://hi.baidu.com/空氣人兒