16.4 建立和控制 jail

  一些系统管理员喜欢将 jail 分为两类: “完整的” jail, 通常包含真正的 FreeBSD 系统, 以及 “服务” jail, 专用于执行一个可能使用特权的应用或服务。 这只是一种概念上的区分, 并不影响如何建立 jail 的过程。 在联机手册 jail(8) 中对如何创建 jail 进行了清晰的阐述:

# setenv D /here/is/the/jail
# mkdir -p $D (1)
# cd /usr/src
# make buildworld (2)
# make installworld DESTDIR=$D (3)
# make distribution DESTDIR=$D (4)
# mount -t devfs devfs $D/dev (5)
(1)
第一步就是为 jail 选择一个位置。 这个路径是在宿主系统中 jail 的物理位置。 一种常用的选择是 /usr/jail/jailname, 此处 jailname 是 jail 的主机名。 /usr/ 文件系统通常会有足够的空间来保存 jail 文件系统, 对于 “完整” 的 jail 而言, 它通常包含了 FreeBSD 默认安装的基本系统中每个文件的副本。
(2)
如果你已经通过使用 make world 或者 make buildworld 重新编译过了你的 userland, 则可以跳过这一步骤并把现有的 userland 安装进新的 jail。
(3)
这个命令将在 jail 目录中安装所需的可执行文件、 函数库以及联机手册等。
(4)
distribution 这个 make target 将安装全部配置文件, 或者换句话说, 就是将 /usr/src/etc/ 复制到 jail 环境中的 /etc$D/etc/
(5)
在 jail 中不是必须要挂接 devfs(8) 文件系统。 而另一方面, 几乎所有的应用程序都会需要访问至少一个设备, 这主要取决于应用程序的性质和目的。 控制 jail 中能够访问的设备非常重要, 因为不正确的配置, 很可能允许攻击者在 jail 中进行一些恶意的操作。 通过 devfs(8) 实施的控制, 可以通过由联机手册 devfs(8)devfs.conf(5) 介绍的规则集配置来实现。

  一旦装好了 jail, 就可以使用 jail(8) 工具来安装它了。 jail(8) 工具需要四个必填参数, 这些参数在 第 16.3.1 节 中进行了介绍。 除了这四个参数之外, 您还可以指定一些其他参数, 例如, 以特定用户身份来在 jail 中运行程序等等。 这里, command 参数取决于您希望建立的 jail 的类型; 对于 虚拟系统, 可以选择 /etc/rc, 因为它会完成真正的 FreeBSD 系统启动所需的操作。 对于 服务 jail, 执行的命令取决于将在 jail 中运行的应用程序。

  Jail 通常应在系统启动时启动, 因此, FreeBSD rc 机制提供了一些很方便的机制来简化这些工作。

  1. 在引导时需要启动的 jail 列表应写入 rc.conf(5) 文件:

    jail_enable="YES"   # 如果设为 NO 则表示不自动启动 jail
    jail_list="www"     # 以空格分隔的 jail 名字列表
    

    注意:jail_list 中的名字中, 可以使用字母和数字, 而不应使用其他字符。

  2. 对于 jail_list 中列出的 jail, 还应指定一系列对应的 rc.conf(5) 设置, 用以描述具体的 jail:

    jail_www_rootdir="/usr/jail/www"     # jail 的根目录
    jail_www_hostname="www.example.org"   # jail 的主机名
    jail_www_ip="192.168.0.10"          # jail 的 IP 地址
    jail_www_devfs_enable="YES"          # 在 jail 中挂接 devfs
    jail_www_devfs_ruleset="www_ruleset" # 在 jail 中应用的devfs 规则集
    

    默认情况下, 在 rc.conf(5) 中配置启动的 jail 会执行其中的 /etc/rc 脚本, 也就是说, 默认情况下将 jail 作为虚拟系统方式来启动。 对于服务 jail, 您应另外指定启动命令, 方法是设置对应的 jail_jailname_exec_start 配置。

    注意: 如欲了解全部可用的选项, 请参阅联机手册 rc.conf(5)

  /etc/rc.d/jail 脚本也可以用于手工启动或停止 rc.conf 中配置的 jail:

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

  目前, 尚没有一种方法来很干净地关闭 jail(8)。 这是因为通常用于正常关闭系统的命令, 目前尚不能在 jail 中使用。 目前, 关闭 jail 最好的方式, 是在 jail 外通过 jexec(8) 工具, 在 jail 中执行下列命令:

# sh /etc/rc.shutdown

  更进一步的详细说明, 请参见联机手册 jail(8)

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.