14.3. 创建和控制 Jail

一些系统管理员喜欢将 jail 分为两类: 完整的 jail, 通常包含真正的 FreeBSD 系统, 以及 服务 jail, 专用于执行一个可能使用特权的应用或服务。 这只是一种概念上的区分, 并不影响如何建立 jail 的过程。创建完整的 jail 时,用户可以从使用已经编译好的用户环境或从源码编译用户环境。

14.3.1. 安装 Jail

14.3.1.1. 从互联网安装 jail

bsdinstall(8) 工具可用于获取创建 jail 时所需的二进制文件。在这里可以挑选镜像,选择要安装的功能,以及对 jail 进行基础配置:

# bsdinstall jail /here/is/the/jail

命令完成后,下一步来配置主机以运行 jail。

14.3.1.2. 从 ISO 文件创建 Jail

从安装包中安装用户环境:首先创建 jail 的 root 目录。可通设置DESTDIR变量设置。

开启 shell 并定义DESTDIR变量:

# sh
# export DESTDIR=/here/is/the/jail

mdconfig(8)挂载安装镜像(这里使用 ISO 格式镜像):

# mount -t cd9660 /dev/`mdconfig -f cdimage.iso` /mnt
# cd /mnt/usr/freebsd-dist/

解压获取到的用户环境文件到之前定义好的位置。至少需要 base(base.txz)环境,其他部分可按需安装。

安装 base 系统:

# tar -xf base.txz -C $DESTDIR

安装除内核以外所有部分:

# for set in base ports; do tar -xf $set.txz -C $DESTDIR ; done

14.3.1.3. 从源码编译安装 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) 介绍的规则集配置来实现。

14.3.2. 设定 Host

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

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

  • jail.conf中设置 jail 启动参数:

    www {
        host.hostname = www.example.org;           # Hostname
        ip4.addr = 192.168.0.10;                   # IP address of the jail
        path ="/usr/jail/www";                     # Path to the jail
        devfs_ruleset = "www_ruleset";             # devfs ruleset
        mount.devfs;                               # Mount devfs inside the jail
        exec.start = "/bin/sh /etc/rc";            # Start command
        exec.stop = "/bin/sh /etc/rc.shutdown";    # Stop command
    }

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

    jail_enable="YES"   # 如果设为 NO 则表示不自动启动 jail

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

    注意:

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

service(8)可用于手动启动或停止 jail。将以下命令写入jail.conf

# service jail start www
# service jail stop www

Jail 可使用jexec(8)命令关闭。用jls(8)查看 jail 的JID,然后使用jexec(8) 来关闭 jail。

# jls
   JID  IP Address      Hostname                      Path
     3  192.168.0.10    www                           /usr/jail/www
# jexec 3 /etc/rc.shutdown

更多信息请参见 jail(8)

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

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

关于本文档的问题请发信联系 <doc@FreeBSD.org>.