11.4. 管理 FreeBSD 中的服務

Contributed by Tom Rhodes.

FreeBSD 在系統初始化時使用 rc(8) 系統的啟動 Script。列於 /etc/rc.d 的 Script 提供了基本的服務可使用 service(8) 加上 start, stop 以及 restart 選項來控制。例如,使用以下指令可以重新啟動 sshd(8)

# service sshd restart

這個程序可以用來在執行中的系統上啟動服務,而在 rc.conf(5) 中有指定的服務則會在開機時自動啟動。例如,要在系統啟動時開啟 natd(8),可入下行到 /etc/rc.conf

natd_enable="YES"

natd_enable="NO" 行已存在,則將 NO 更改為 YES,在下次開機時 rc(8) script 便會自動載入任何相依的服務,詳細如下所述。

由於 rc(8) 系統主要用於在系統開機與關機時啟動與停止服務,只有當有服務的變數設定在 /etc/rc.confstart, stop 以及 restart 才會有作用。例如 sshd restart 只會在 /etc/rc.conf 中的 sshd_enable 設為 YES 時才會運作,若要不透過 /etc/rc.conf 的設定來 start, stoprestart 一個服務則需要在指令前加上 one,例如要不透過目前在 /etc/rc.conf 的設定重新啟動 sshd(8) 可執行以下指令:

# service sshd onerestart

要檢查一個服務是否有在 /etc/rc.conf 開啟,可執行服務的 rc(8) Script 加上 rcvar。這個例子會檢查 sshd(8) 是否在 /etc/rc.conf 已經開啟:

# service sshd rcvar
# sshd
#
sshd_enable="YES"
#   (default: "")

注意:

# sshd 的輸出來自上述指令,而非 root console。

要判斷是一個服務是否正在執行,可使用 status,例如要確認 sshd(8) 是否正常在執行:

# service sshd status
sshd is running as pid 433.

在某些情況,也可以 reload 一個服務。這個動作會嘗試發送一個信號給指定的服務,強制服務重新載入其設定檔,在大多數的情況下,發送給服務的信號是 SIGHUP。並不是每個服務都有支援此功能。

rc(8) 系統會用在網路服務及也應用在大多數的系統初化 。例如執行 /etc/rc.d/bgfsck Script 會列印出以下訊息:

Starting background file system checks in 60 seconds.

這個 Script 用來在背景做檔案系統檢查,只有在系統初始化時要執行。

許多系統服務會相依其他服務來運作,例如 yp(8) 及其他以 RPC 為基礎的服務在 rpcbind(8) 服務啟動前可能會啟動失敗。要解決這種問題,就必須在啟動 Script 上方的註解中加入相依及其他 meta-data。在系統初始化時會用 rcorder(8) 程式分析這些註解來決定要以什麼順序來執行系統服務以滿足相依。

rc.subr(8) 的需要,以下的關鍵字必須加入到所有的啟動 Script 方可 enable 啟動 Script:

以下關鍵字可能會在每個啟動 Script 的上方引用,雖然非必要,但是對於 rcorder(8) 是非常有用的提示:

透過仔細的設定每個啟動 Script 的這些關鍵字,管理者便可對 Script 的啟動順序進行微調,而不需使用到其他 UNIX® 作業系統所使用的 runlevels

額外的資訊可在 rc(8) 以及 rc.subr(8) 中找到。請參考 此文章 來取得如何建立自訂 rc(8) Script 的操作說明。

11.4.1. 管理系統特定的設定

系統設定資訊的主要位於 /etc/rc.conf,這個檔案的設定資訊範圍非常廣且會在系統啟動時讀取來設定系統,它也提供設定資訊給 rc* 檔案使用。

/etc/rc.conf 中的設定項目會覆蓋在 /etc/defaults/rc.conf 的預設設定,不應直接編輯該檔案中的預設設定,所有系統特定的設定應到 /etc/rc.conf 所修改。

在叢集應用時要將系統特定的設定與各站特定的設定分開,藉此減少管理成本有好幾種方法,建議的方法是將系統特定的設定放置在 /etc/rc.conf.local,例如以下將要套用到所有系統的設定項目放在 /etc/rc.conf

sshd_enable="YES"
keyrate="fast"
defaultrouter="10.1.1.254"

而只套用到此系統的設定放在 /etc/rc.conf.local

hostname="node1.example.org"
ifconfig_fxp0="inet 10.1.1.1/8"

使用應用程式如 rsyncpuppet/etc/rc.conf 散布到每個系統,而在各系統保留自己的 /etc/rc.conf.local

升級系統並不會覆寫 /etc/rc.conf,所以系統設定資訊不會因此遺失。

提示:

/etc/rc.conf 以及 /etc/rc.conf.local 兩個檔案都會使用 sh(1) 解析,這讓系統操作者能夠建立較複雜的設定方案。請參考 rc.conf(5) 來取得更多有關此主題的資訊。

本文及其他文件,可由此下載: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

若有 FreeBSD 方面疑問,請先閱讀 FreeBSD 相關文件,如不能解決的話,再洽詢 <questions@FreeBSD.org>。

關於本文件的問題,請洽詢 <doc@FreeBSD.org>。