17.3.建立和控制 Jail ==================== 一些管理员将 jail 分为以下两种类型:“完整”jail,类似于真正的 FreeBSD 系统; 和“服务”jail,专用于一个程序或服务,可能以特权运行。这只是一个概念上的划分,不影响建立 jail 的过程。在建立“完整”jail 时,用户空间的源代码有两个选项:使用预构建的可执行文件(例如在安装镜像上提供的可执行文件)或从源代码建立。 17.3.1.安装 Jail ---------------- 17.3.1.1.从网络安装 Jail ~~~~~~~~~~~~~~~~~~~~~~~~ `bsdinstall(8) `__ 工具可用于获取和安装 jail 所需的可执行文件。这演示了如何选择镜像,将哪个发行版安装到目标目录中,以及 jail 的一些基本配置: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # bsdinstall jail /here/is/the/jail 命令完成后,下一步是配置主机以运行 jail。 17.3.1.2.从 ISO 安装 Jail ~~~~~~~~~~~~~~~~~~~~~~~~~ 要从安装镜像安装用户空间,请先为 jail 创建根目录。可以通过将变量 ``DESTDIR`` 设置到正确的位置来完成。 启动 shell 并定义 ``DESTDIR`` : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sh # export DESTDIR=/here/is/the/jail 使用 ISO 安装时,按照 `mdconfig(8) `__ 中所述安装镜像: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # mount -t cd9660 /dev/`mdconfig -f cdimage.iso` /mnt # cd /mnt/usr/freebsd-dist/ 将可执行文件从安装镜像上的压缩包中提取到指定的目标中。最简单的是只需要提取基本系统,但也可执行完整安装。 要仅安装基本系统: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # tar -xf base.txz -C $DESTDIR 要安装除内核之外的所有内容: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # for set in base ports; do tar -xf $set.txz -C $DESTDIR ; done 17.3.1.3.从源代码构建和安装 Jail ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ `jail(8) `__ 手册页说明了建立 jail 的过程: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # setenv D /here/is/the/jail # mkdir -p $D ① # cd /usr/src # make buildworld ② # make installworld DESTDIR=$D ③ # make distribution DESTDIR=$D ④ # mount -t devfs devfs $D/dev ⑤ ① 第一步是为 jail 选择一个位置。这是 jail 在 jail 主机的文件系统中的物理位置。一个常用选择是 **/usr/jail/jailname**\ ,此处 *jailname* 是 jail 的主机名。\ **/usr/** 在通常情况下有足够的空间容纳 jail 文件系统,对于“完整”jail 来说,它基本上是 FreeBSD 基本系统默认安装的每个文件的副本。 ② 如果你已经使用 ``make world`` 或 ``make buildworld`` 重新编译了你的用户空间,你可以跳过这一步并将现有的用户空间安装到新的 jail 中。 ③ 这条命令将在文件系统中的 jail 物理位置的目录子树上安装必要的可执行文件、库、手册页等。 ④\ ``distribution`` 这个 ``make`` 目标会安装所有需要的配置文件。简单地说,它把 **/usr/src/etc/** 的每个可安装文件都安装到 jail 环境的 **/etc** 目录:\ **$D/etc/** 下。 ⑤ 在 jail 中挂载文件系统 `devfs(8) `__ 不是必须的。另一方面,所有或几乎所有软件都需要访问至少一个设备,这主要取决于给定应用程序的用途。控制对 jail 内部的设备访问是非常重要的,因为不恰当的设置可能允许攻击者在 jail 中做一些令人讨厌的事情。对 `devfs(8) `__ 的控制是通过 `devfs(8) `__ 和 `devfs.conf(5) `__ 手册页中描述的规则集进行管理的。 17.3.2.配置主机 --------------- 安装了 jail 后,就可以使用 `jail(8) `__ 工具启动它。\ `jail(8) `__ 工具采用四个必要参数,这些参数在 `jail 概述 `__\ 中进行了说明。也可以指定其他参数,例如,使用特定用户的身份运行 jail 进程。\ *命令* 参数取决于 jail 的类型:对于 *虚拟系统* 来说,\ **/etc/rc** 是一个不错的选择,因为它将复制真正的 FreeBSD 系统的启动顺序;对于 *服务* jail 来说,它取决于将在 jail 内运行的服务或应用程序。 jail 通常在系统引导时启动,FreeBSD 的 **rc** 机制提供了用简单的方法来做到这一点。 - 在 **jail.conf** 中配置 jail 参数: .. code:: shell-session www { host.hostname = www.example.org; # 主机名 ip4.addr = 192.168.0.10; # jail 的 IP 地址 path = "/usr/jail/www"; # jail 所在路径 mount.devfs; # 在 jail 内部挂载 devfs exec.start = "/bin/sh /etc/rc"; # 启动命令 exec.stop = "/bin/sh /etc/rc.shutdown"; # 停止命令 } 在 **rc.conf** 中将 jail 配置为在系统引导时启动: .. code:: shell-session jail_enable="YES" # 如设置为 NO,会禁止启动所有的 jail。 在 `jail.conf(5) `__ 中配置的 jail 在默认启动时将运行其中的 **/etc/rc** 脚本,该脚本默认 jail 是一个完整的虚拟系统。对于服务 jail,应通过对 ``exec.start`` 这个选项的适当设置来更改 jail 的默认启动命令。 **注意** 有关可用选项的完整列表,请参阅 `jail.conf(5) `__ 手册页。 `service(8) `__ 可用于手动启动或停止 jail,如果它的条目存在于 jail.conf 中: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service jail start www # service jail stop www 还可以用 `jexec(8) `__ 停止 jail。先使用 `jls(8) `__ 来获得 jail 的 ``JID``\ ,然后使用 `jexec(8) `__ 在该 jail 中运行关机脚本。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # jls JID IP Address Hostname Path 3 192.168.0.10 www /usr/jail/www # jexec 3 /etc/rc.shutdown 有关这方面的更多信息,请参阅 `jail(8) `__ 手册页。