Embedded Linux 的系統管理,#3: initial scripts

jollen 發表於 April 24, 2006 3:53 PM

initial scripts 是在開機時自動執行的 script,本文說明 Red Hat Linux 的 init script 概念,在我們的 Embedded Linux / x86 以及 Embedded Linux / ARM9 的課程中,同學會看到 /etc/inittab 配合 init script 的實作方法。

作者/陳俊宏
www.jollen.org

/etc/rc.d/ 概念

請同學參照 Red Hat Linux 的系統檔案來閱讀本文,我們的課程實作與 Red Hat Linux 的 init script 寫法頗有差異,但研讀 Red Hat Linux 的 init script 架構可以學習到完整的 init script 概念。同時,Red Hat Linux 的 init script 也是符合 LSB 標準的做法。

/etc/rc.d/ 裡的檔案在開機時,會由 init 來執行,因此,我們可以把一些設定編輯在裡面,在開機時自動做好設定,這些文字的執行檔,我們稱它為 script,又因為是開機時會執行的 script,所以也稱為 bootup scripts。

/etc/rc.d/rc?.d/ 裡的檔案都鍊結到 /etc/rc.d/init.d/ 裡,因此,我們只要針對/etc/rc.d/init.d/ 裡的檔案來做討論即可。

init 會根據 /etc/inittab 裡的預設 run level 來執行 /etc/rc.d/rc?.d/ 目錄裡的鍊結,例如我們在 /etc/inittab 預設 run level為 3:

id:3:initdefault:

則 init 會去執行 /etc/rc.d/rc3.d/ 目錄裡的檔案,指令 telinit 可以改變系統的 run-level,例如:

linux# telinit 5

表示將系統的 run level 改變成 5,則 init 在看到 run level 的改變時,就會去執行/etc/rc.d/rc5.d/ 裡的檔案。

/etc/rc.d/rc?.d 檔案格式

/etc/rc.d/rc?.d 裡的檔案格式都具有特殊義意,例如:

S17httpd
K18httpd

"S" 表示 start,"K" 表示 stop (kill),17 是優先序,數字低的先執行,httpd 則是表示這個檔案鍊結到 /etc/rc.d/init.d/httpd,因此 S17httpd 是「第 17 順位執行httpd」的意思,同理,K18httpd 則代表「第 18 順位關閉 httpd」,優先序是為了控制程式執行的順序,因為有一些程式會要求必須先載入一些特定程式才能執行,所以就利用優先序來控制,另外,優先序並不一定要是連續的數字,但執行時一定是由小而大執行,例如 S15httpd 執行完後,可能不會有 S16 的順序,所以就繼續往下執行。

/etc/rc.d/init.d 裡的 scripts 還提供一些參數,例如 Apache web server 的 script 為 /etc/rc.d/init.d/httpd,除了在開機時會自動被執行外,在命令模式下執行:

linux# /etc/rc.d/init.d/httpd stop

表示要終止 httpd (Apache web server) 的執行,Red Hat Linux 的 init script 實作可以讓使用者下達命令參數,此部份亦制定於 LSB 標準中。

例如,/etc/rc.d/init.d 裡的 script 提供了 6 種參數,但要注意的是,並不是所有的 script 都提供所有的參數,這 6 個參數為:

  • start
  • stop
  • restart
  • force-reload
  • reload
  • status

範例:

linux# /etc/rc.d/init.d/httpd restart
linux# /etc/rc.d/init.d/httpd start

這二個指令分別是重新啟動及啟動 httpd 的意思。當我們修改 Apache 的設定後,就可以下第一個命令來重新啟動 httpd,使新的設定生效。

再以一個例子說明,當我們想要關閉防火牆時,應該把 iptables 服務關閉,此時可以下達此命令:

linux# /etc/rc.d/init.d/iptables stop

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw