[http://biz.chinabyte.com/477/2024477.shtml]
? Linux 可以有多種運行級。常見的就是多用戶的2(單用戶,沒有NFS),3(完整的多用戶),4(用戶自定義),5(X),很多人知道 5 是運行 X-Windows 的級別,而 0 就是關機了。運行級的改變可以通過 init 命令來切換。例如,假設你要維護系統(tǒng)進入單用戶狀態(tài),那么,可以使用 init 1 來切換。在Linux 的運行級的切換過程中,系統(tǒng)會自動尋找對應運行級的目錄/etc/rc[0-6].d下的K 和 S 開頭的文件,按后面的數字順序,執(zhí)行這些腳本。
? 每一個運行級在 /etc/rc.d下都有個相應的目錄。如運行級5,目錄就是/etc/rc.d/rc5.d 。包含啟動這個運行級的時候運行的相關任務的相關文件。在 Red Hat中, 這些文件一般都是 shell 腳本的符號連接,可以在/etc/rc.d/init.d中找到。
讓我們用一個簡單的例子看一下這些東西, 下面這兩個例子行來自我們的 inittab文件:
以下是引用片段: id:3:initdefault: l3:3:wait:/etc/rc.d/rc?3 |
在Red Hat系統(tǒng)中這很典型。一旦init被啟動 ,讀取/etc/inittab 。 從第一行,我們知道 init 將在系統(tǒng)啟動后從運行運行級3。一旦我們到了那個運行級 ,第二行告訴 init 去運行腳本 /etc/rc.d/rc 3 并且在執(zhí)行前等待終止。
在/etc/rc.d目錄的rc 腳本收到 3作為一個參數。 這個 3 相當于運行級3。結果 rc 腳本執(zhí)行/etc/rc.d/rc3.d目錄中的所有腳本。它首先用參數``stop''執(zhí)行所有K(代表 ``kill''殺掉進程或者服務)打頭的腳本,接下來,它運行所有以 字母 S 打頭的腳本,帶有參數``start'' 啟動進程或者服務。 最后要指明,K和S腳本的執(zhí)行順序是基于排序的; 名為 S90mysql的腳本將在 S95httpd之前執(zhí)行。
/etc/rc.d/rc3.d 中的腳本實際是對/etc/rc.d/init.d中文件的符號連接。UNIX管理員可以在rc3.d中放制文件, 實際情況下Red Hat的init.d目錄是所有腳本的第一位置,然后生成邏輯連接到 rc*.d 目錄。手工作這些文件的管理很煩人、瑣碎。 chkconfig現(xiàn)在接手這件事情! Red Hat 的這個chkconfig工具就是專為管理 /etc/rc.d/rc[0-6].d中的符號連接而設計。
語法為:chkconfig --list [name]
chkconfig --add name
chkconfig --del name
chkconfig [--level levels] name <on|off|reset>
chkconfig [--level levels] name
chkconfig 有五項功能:添加服務,刪除服務,列表服務,改變啟動信息以及檢查特定服務的啟動狀態(tài)。
chkconfig 沒有參數運行時,顯示用法。如果加上服務名,那么就檢查這個服務是否在當前運行級啟動。如果是,返回 true,否則返回 false。
--level 選項可以指定要查看的運行級而不一定是當前運行級。
如果在服務名后面指定了on,off 或者 reset,那么 chkconfig 會改變指定服務的啟動信息。on 和 off 分別指服務在改變運行級時的啟動和停止。reset 指初始化服務信息,無論有問題的初始化腳本指定了什么。
對于 on 和 off 開關,系統(tǒng)默認只對運行級 3,4, 5有效,但是 reset 可以對所有運行級有效。指定 --level 選項時,可以選擇特定的運行級。
需要說明的是,對于每個運行級,只能有一個啟動腳本或者停止腳本。當切換運行級時,init 不會重新啟動已經啟動的服務,也不會再次去停止已經停止的服務。
選項介紹:
--level levels 指定運行級,由數字 0 到 7 構成的字符串,如:
--level 35 表示指定運行級3 和5。
--add name
這個選項增加一項新的服務,chkconfig 確保每個運行級有一項 啟動(S) 或者 殺死(K) 入口。如有缺少,則會從缺省的init 腳本自動建立。
--del name
用來刪除服務,并把相關符號連接從 /etc/rc[0-6].d 刪除。
--list name
列表,如果指定了name 那么只是顯示指定的服務名,否則,列出全部服務在不同運行級的狀態(tài)。
運行級文件
每個被chkconfig 管理的服務需要在對應的init.d 下的腳本加上兩行或者更多行的注釋。
第一行告訴 chkconfig 缺省啟動的運行級以及啟動和停止的優(yōu)先級。如果某服務缺省不在任何運行級啟動,那么使用 - 代替運行級。
第二行對服務進行描述,可以用\ 跨行注釋。
例如,random.init 包含三行:
# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for \
# higher quality random number generation.
表明 random 腳本應該在運行級 2, 3, 4, 5 啟動,啟動優(yōu)先權為20,停止優(yōu)先權為 80。
具體詳細參見/etc/rc.d/init.d 下的腳本.
??? 啟動基礎知識
? chkconfig的二進制軟件在 /sbin下,默認權限允許任何用戶執(zhí)行 。不過沒有root權限的用戶只能察看當前的 chkconfig配置。輸入:
[root]#?chkconfig?--list?|?grep?on |
輸出的部分內容大致如下:
amd?0:off?1:off?2:off?3:off?4:on?5:on?6:off apmd?0:off?1:off?2:on?3:off?4:on?5:off?6:off arpwatch?0:off?1:off?2:off?3:off?4:off?5:off?6:off atd?0:off?1:off?2:off?3:on?4:on?5:on?6:off autofs?0:off?1:off?2:off?3:off?4:off?5:off?6:off named?0:off?1:off?2:off?3:off?4:off?5:off?6:off bootparamd?0:off?1:off?2:off?3:off?4:off?5:off?6:off keytable?0:off?1:off?2:on?3:on?4:on?5:on?6:off crond?0:off?1:off?2:on?3:on?4:on?5:on?6:off syslog?0:off?1:off?2:on?3:on?4:on?5:on?6:off netfs?0:off?1:off?2:off?3:on?4:on?5:on?6:off network?0:off?1:off?2:on?3:on?4:on?5:on?6:off |
以下是引用片段: [root]#?find?/etc/rc.d?-name?’*crond’?-print /etc/rc.d/init.d/crond /etc/rc.d/rc0.d/K60crond /etc/rc.d/rc1.d/K60crond /etc/rc.d/rc2.d/S40crond /etc/rc.d/rc3.d/S40crond /etc/rc.d/rc4.d/S40crond /etc/rc.d/rc5.d/S40crond /etc/rc.d/rc6.d/K60crond |
以下是引用片段: [root]#?find?/etc/rc.d?-name?’*crond’?-exec?file?{}?; /etc/rc.d/init.d/crond:?Bourne?shell?script?text /etc/rc.d/rc0.d/K60crond:?symbolic?link?to ../init.d/crond /etc/rc.d/rc1.d/K60crond:?symbolic?link?to ../init.d/crond /etc/rc.d/rc2.d/S40crond:?symbolic?link?to ../init.d/crond /etc/rc.d/rc3.d/S40crond:?symbolic?link?to ../init.d/crond /etc/rc.d/rc4.d/S40crond:?symbolic?link?to ../init.d/crond /etc/rc.d/rc5.d/S40crond:?symbolic?link?to ../init.d/crond /etc/rc.d/rc6.d/K60crond:?symbolic?link?to ../init.d/crond |
??? 調整chkconfig項
調整chkconfig的 項幾乎和列出現(xiàn)在的設置一樣容易。格式:
chkconfig [--level <運行級>] <名字>
例如,如果我們決定在運行級 2禁止crond,
#?chkconfig?--level?2?crond?off |
(root執(zhí)行) 會在運行級2關掉crond. 運行 chkconfig --list會確信crond的配置已經被調整。 更進一步,下面的find 命令command 顯示一個 kill腳本已經在目錄rc2.d中代替了 start腳本:
[root]#?find?/etc/rc.d?-name?’*crond’?-print /etc/rc.d/init.d/crond /etc/rc.d/rc0.d/K60crond /etc/rc.d/rc1.d/K60crond /etc/rc.d/rc2.d/K60crond /etc/rc.d/rc3.d/S40crond /etc/rc.d/rc4.d/S40crond /etc/rc.d/rc5.d/S40crond /etc/rc.d/rc6.d/K60crond |
chkconfig --levels 2345 crond on
會設定 crond 在運行級2, 3, 4 和 5啟動。
有的時候, 刪掉一個服務也很恰當。例如,針對sendmail,在客戶機上導入本地賬號的郵件沒有必要。運行sendmail最為守護進程就不是必要的了。這種情 況,我發(fā)現(xiàn)禁止sendmail服務很有必要,減少了潛在的安全問題,從chkconfig中刪掉sendmail,輸入:
chkconfig?--del?sendmail |
在下面,我們的 find命令顯示該處沒有符號連接了 ,不過sendmail的init腳本仍然有:
[root]#?find?/etc/rc.d?-name?’*sendmail’?-print /etc/rc.d/init.d/sendmail |
添加一個chkconfig 項
到目前為止,一切順利。我們已經知道使用chkconfig如何查看、調整、刪掉服務。現(xiàn)在添加一個新的服務。看下面的腳本 oracle (see Listing 1).
#!/bin/sh<\n> #chkconfig:?2345?80?05 #description:?Oracle?8?Server ORA_HOME=/usr/home/oracle/product/8.0.5 ORA_OWNER=oracle if?[?!?-f?$ORA_HOME/bin/dbstart?] then echo?"Oracle?startup:?cannot?start" exit fi case?"$1"?in "start") su-$ORA_OWNER?-c?$ORA_HOME/bin/dbstart su-$ORA_OWNER?-c?"$ORA_HOME/bin/lsnrctl?start" ;; "stop") su-$ORA_OWNER?-c?$ORA_HOME/bin/dbshut su-$ORA_OWNER?-c?"$ORA_HOME/bin/lsnrctl?stop" ;; esac |
使用這個腳本, Oracle 8可以以參數 ``start''啟動,以 ``stop'' 參數停止。它符合init腳本的最小要求可以和 /etc/rc.d/rc腳本聯(lián)合使用。
把腳本放到 /etc/rc.d/init.d中并運行 (以 root) :
chmod?+x?/etc/rc.d/init.d/oracle |
使你的腳本可執(zhí)行 。如果你擔心普通用戶察看這個腳本,你可以設定更嚴格的文件權限 。只要這個腳本可以被root作為單獨的腳本運行就可以。
注意腳本中的兩行注釋:
#chkconfig:?2345?80?05 #description:?Oracle?8?Server |
chkconfig需要這些行來決定如何實現(xiàn)初始運行級添加服務,如何設定啟動和停止順序的優(yōu)先級 。 這些行指明腳本將為運行級2,3,4,5啟動 Oracle 8 服務。另外, 啟動優(yōu)先權將被設定為 80而停止優(yōu)先權設定為 05。
現(xiàn)在腳本在合適的位置,并且有合適的執(zhí)行權限,以及恰當的chkconfig注釋, 我們可以添加init腳本,作為 root,
#?chkconfig?--add?oracle. |
用 chkconfig的查詢,我們能核實我們所作的添加:
[root]#?chkconfig?--list?|?grep?oracle oracle?0:off?1:off?2:on?3:on?4:on?5:on?6:off |
而且,我們可以用標準的 find 命令察看chkconfig如何設定符號連接:
[root]#?find?/etc/rc.d?-name?’*oracle’?-print /etc/rc.d/init.d/oracle /etc/rc.d/rc0.d/K05oracle /etc/rc.d/rc1.d/K05oracle /etc/rc.d/rc2.d/S80oracle /etc/rc.d/rc3.d/S80oracle /etc/rc.d/rc4.d/S80oracle /etc/rc.d/rc5.d/S80oracle /etc/rc.d/rc6.d/K05oracle |
[root]#?find?/etc/rc.d?-name?’*oracle’?-print
/etc/rc.d/init.d/oracle
/etc/rc.d/rc0.d/K03oracle
/etc/rc.d/rc1.d/K03oracle
/etc/rc.d/rc2.d/S80oracle
/etc/rc.d/rc3.d/S80oracle
/etc/rc.d/rc4.d/S80oracle
/etc/rc.d/rc5.d/S80oracle
/etc/rc.d/rc6.d/K03oracle
??? Red Hat 7中的改進
大家可能都知道了,inetd在 Red Hat 7中已經被xinetd 所取代。而且,chkconfig 的功能已經被擴展,可以管理一些xinetd的Internet服務。例子如下:
[root]#?chkconfig?--list ... xinetd?based?services: finger:?on linuxconf-web:?off rexec:?off rlogin:?off rsh:?off ntalk:?off talk:?off telnet:?on tftp:?off wu-ftpd:?on |
[root]#?chkconfig?finger?off. |
很簡捷啊,呵呵。可是,這里有個問題。當配置已經改變,命令/etc/init.d/xinetd reload指明xinetd 自動重載入新的配置,被 chkconfig執(zhí)行。這個腳本運行一個帶有SIGUSR2信號的kill 指示 xinetd 進行一個“硬“重配置。
那意味著什么?哦,當我測試的時候,通過xinetd 提供的活動服務(i.e., Telnet, FTP, etc.)立刻被中止。如果你能計劃在最合適的時間啟動/禁止你的系統(tǒng)上的服務,可能不是個問題。作為一種替代方式,你可以調整你的 /etc/init.d/xinetd腳本 ,這樣 reload 選項發(fā)送一個 SIGUSR1 信號。 這是個“軟“重配置。這將重啟動你的服務而不中斷你現(xiàn)存的連接 。
chkconfig 管理下,添加xinetd服務只要簡單的添加xinetd服務文件到 /etc/xinetd.d目錄中。chkconfig會自動的“撿起“它并使其可用,通過chkconfig 工具進行管理。簡潔阿!
結論
現(xiàn)在你已經應該認識到紅帽子的chkconfig工具管理init腳本的好處了,雖然它的功能似乎簡單了些,但是它節(jié)省時間,這使其成為一個系統(tǒng)管理員適用的命令,值得記牢。