15.4. 建立和控制 Jail
前一頁 | 章 15. Jails | 下一頁

## 15.4. 建立和控制 Jail

有些系統管理者把 jail 分為下列兩種：“complete(完全)” jail — 通常包括完整的 FreeBSD 系統；另一種則為 “service(服務)” jail — 專門只跑某單一可能要用特殊權限的程式或 service。 這只是一種概念上的區分 ，並不影響如何建立 jail 的過程。 至於如何建立 jail 在 jail(8) 內有更詳細的說明：

`#` `setenv D `/here/is/the/jail`` `#` `mkdir -p $D` `#` `cd /usr/src` `#` `make world DESTDIR=$D` `#` `cd etc/` [12] `#` `make distribution DESTDIR=$D` `#` `mount -t devfs $D/dev`

| 首先就是先為 jail 找個家。 該路徑是在 host 系統中的 jail 實體位置。 習慣是放在 `/usr/jail/`jailname``， `jailname` 請替換為該 jail 的 hostname 以便辨別。 通常 `/usr` 會有足夠空間來存放 jail 檔案系統，對於 “complete” jail 而言，它通常包括了 FreeBSD 預設安裝 base system 所有檔案的拷貝檔。
| 該指令將會在 jail 目錄中安裝所需的 binary、library、manual 說明等 。 這些是以傳統的 FreeBSD 方式完成 — 即首先先編譯所有檔案， 接著再裝到目的地。
| 使用 `distribution` 這個 make target 來裝所有會用到的設定檔。 簡單來說該動作就是把 `/usr/src/etc/` 複製到 jail 環境內的 `/etc`，也就是 `$D/etc/`。
| 對於 jail 環境而言，devfs(8) 檔案系統的掛載並非必須， 但另一方面，幾乎所有應用程式都會需要存取至少一個設備(device)， 這主要取決於該程式目的而定。 控制 jail 所能存取的設備非常重要， 因為不正確的設定，會讓攻擊者對 jail 有機可趁。 至於如何透過 devfs(8) 來控制的規則，可以參閱 devfs(8) 及 devfs.conf(5) 說明。

裝好 jail 之後，就可以用 jail(8) 工具。 jail(8) 需要四項必填參數，這些參數在 節 15.3.1, “何為 Jail” 有介紹過。 除了這四個參數之外，還可以指定其他參數，像是以特定帳號在 jail 中執行 process。 ``command`` 參數取決於 jail 類型而定；對於 virtual system(虛擬系統) ，那麼就選擇 `/etc/rc`， 因為它會完成真正 FreeBSD 系統啟動所需的操作。 對於 service(服務) jail 而言，執行的指令取決於將在 jail 內執行的 service 或應用程式而定。

Jail 通常要在系統開機時啟動，因此 FreeBSD 的 `rc` 機制提供一些便利的方式來簡化這些工作：

1. 開機時要啟動的 jail 清單要加到 rc.conf(5) 設定檔：

   jail_enable="YES" # 若設為 NO 則表示不自動啟動 jail jail_list="`www`" # 若有許多 jail 則請以空白隔開來寫

2. 對於每一筆在 `jail_list` 所列出的 jail， 也要在 rc.conf(5) 做出相對應的設定：

   jail_`www`_rootdir="/usr/jail/www" # jail 的根目錄 jail_`www`_hostname="`www`.example.org" # jail 的 hostname jail_`www`_ip="192.168.0.10" # jail 的 IP address jail_`www`_devfs_enable="YES" # 在 jail 內 mount devfs jail_`www`_devfs_ruleset="`www_ruleset`" # jail 內所用的 devfs 規則表

   在 rc.conf(5) 所預設的 jail 啟動設定會跑 `/etc/rc` 內的 jail script，也就是說會假設 jail 是完整的虛擬系統。 若要用 service jail 類型，則要另外指定啟動指令， 方法是設定對應的 `jail_`jailname`_exec_start` 設定。

   ### 注意:

   若欲知道所有可用的選項清單，請參閱 rc.conf(5) 說明。

也可以透過手動執行 `/etc/rc.d/jail` script 來啟動或停止 `rc.conf` 所設定的 jail：

`#` `/etc/rc.d/jail start `www`` `#` `/etc/rc.d/jail stop `www``

目前尚無任何方法來很乾淨地關閉 jail(8)。 此乃因為正常用來關閉系統的指令，目前尚不能在 jail 中使用。 目前關閉 jail 最佳的方式，是在 jail 內執行下列指令，或者 jail 外面透過 jexec(8) 執行下列指令：

`#` `sh /etc/rc.shutdown`

詳情請參閱 jail(8) 說明。

[12] FreeBSD 6.0(含) 之後就不需這步驟。

前一頁 | 上一層 | 下一頁
15.3. 背景故事 | 起始頁 | 15.5. 微調與管理

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

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