第21章 其他文件系统
附录 D. OpenPGP 密钥
15.3.建立和控制 Jail

15.3. 建立和控制 Jail

一些管理员将 jail 分为以下两种类型:“完整” jail,类似于真正的 FreeBSD 系统; 和“服务” jail,专用于一个应用程序或服务,可能以特权运行。这只是一个概念上的划分,建造 Jail 的过程不受其影响。在创建“完整”jail 时,用户空间的源代码有两个选项:使用预构建的二进制文件(例如在安装介质上提供的二进制文件)或从源代码构建。

15.3.1. 安装 Jail

15.3.1.1. 从互联网安装 Jail

bsdinstall(8) 工具可用于获取和安装 Jail 所需的二进制文件。这将演练如何选择镜像,将哪些发行版安装到目标目录中,以及 jail 的一些基本配置:
1
# bsdinstall jail /here/is/the/jail
Copied!
命令完成后,下一步是配置主机以运行 jail。

15.3.1.2. 从 ISO 安装 Jail

要从安装介质安装用户空间,请先为 jail 创建根目录。这可以通过将变量 DESTDIR 设置到正确的位置来完成。
启动一个 shell 并定义 DESTDIR
1
# sh
2
# export DESTDIR=/here/is/the/jail
Copied!
使用安装 ISO 时,按照 mdconfig(8) 中所述安装介质:
1
# mount -t cd9660 /dev/`mdconfig -f cdimage.iso` /mnt
2
# cd /mnt/usr/freebsd-dist/
Copied!
将二进制文件从安装介质上的压缩包中提取到声明的目标中。至少,只需要提取基本集,但可以在首选时执行完整安装。
要仅安装基本系统:
1
# tar -xf base.txz -C $DESTDIR
Copied!
要安装除内核之外的所有内容:
1
# for set in base ports; do tar -xf $set.txz -C $DESTDIR ; done
Copied!

15.3.1.3. 从源代码构建和安装 Jail

jail(8) 手册页解释了建造 Jail 的过程:
1
# setenv D /here/is/the/jail
2
# mkdir -p $D
3
# cd /usr/src
4
# make buildworld
5
# make installworld DESTDIR=$D
6
# make distribution DESTDIR=$D
7
# mount -t devfs devfs $D/dev
Copied!
为 Jail 选择一个位置是最好的起点。这是Jail在Jail主机的文件系统中的物理位置。一个好的选择是 /usr/jail/jailname,其中 jailname 是识别 Jail 的主机名。通常情况下,/usr/ 有足够的空间容纳 Jail 文件系统,对于“完整”的 Jail 来说,它基本上是 FreeBSD 基本系统默认安装中的每个文件的复制。
如果你已经使用 make worldmake buildworld 重建了你的用户环境,你可以跳过这一步,将现有的用户环境安装到新的 jail 中。
此命令将使用必要的二进制文件、库、手册页等填充在文件系统上选择作为 jail 物理位置的目录子树。
make的分发目标会安装所有需要的配置文件。简单地说,它把 **/usr/src/etc/** 的每一个可安装文件都安装到jail环境的 /etc 目录下:**$D/etc/**。
不需要在 jail 中挂载 devfs(8) 文件系统。另一方面,任何或几乎任何应用程序都需要访问至少一个设备,具体取决于给定应用程序的用途。控制从 Jail 内访问设备非常重要,因为不正确的设置可能允许攻击者在Jail中做令人讨厌的事情。对 devfs(8) 的控制通过 devfs(8)devfs.conf(5) 手册页中描述的规则集进行管理。

15.3.2. 配置主机

一旦安装了 jail, 就可以使用 jail(8) 实用程序启动它。jail(8) 实用程序采用四个强制参数,这些参数在 概要中进行了描述。也可以指定其他参数,例如,使用特定用户的凭据运行入狱进程。*command*争 论取决于 Jail 的类型;对于_虚拟系统_, /etc/rc 是一个不错的选择, 因为它将复制一个真正的 FreeBSD 系统的启动顺序。对于_服务_ jail,它取决于将在 jail 内运行的服务或应用程序。
Jail 通常在启动时启动, FreeBSD rc 机制提供了一个简单的方法来做到这一点。
  • 在 jail.conf 中配置 jail 参数:
1
www {
2
host.hostname = www.example.org; # Hostname
3
ip4.addr = 192.168.0.10; # IP address of the jail
4
path = "/usr/jail/www"; # Path to the jail
5
devfs_ruleset = "www_ruleset"; # devfs ruleset
6
mount.devfs; # Mount devfs inside the jail
7
exec.start = "/bin/sh /etc/rc"; # Start command
8
exec.stop = "/bin/sh /etc/rc.shutdown"; # Stop command
9
}
Copied!
在 rc.conf 中将 jail 配置为在引导时启动:
1
jail_enable="YES" #设置为 NO,会禁止启动任何 Jail。
Copied!
jail.conf(5) 中配置的 jail 的默认启动将运行 jail 的 /etc/rc 脚本,该脚本假定 jail 是一个完整的虚拟系统。对于服务 jail,应通过 exec.start 适当设置该选项来更改 jail 的默认启动命令。
注意
有关可用选项的完整列表,请参阅 jail.conf(5) 手册页。
service(8) 可用于手动启动或停止 jail,如果它的条目存在于 jail.conf 中:
1
# service jail start www
2
# service jail stop www
Copied!
可以用 jexec(8) 关闭 Jail。使用 jls(8) 来标识 jail 的 JID,然后使用 jexec(8) 在该 jail 中运行关机脚本。
1
# jls
2
JID IP Address Hostname Path
3
3 192.168.0.10 www /usr/jail/www
4
# jexec 3 /etc/rc.shutdown
Copied!
有关这方面的更多信息,请参阅 jail(8) 手册页。