May 062007
 

以前零零散散的玩过,没有一个系统的理解,正好趁放假研究了一下,主要资料来自handbook。

概念

Jail是chroot机制的一种进化后的机制,可以提高更为高级和灵活的隔离和监管机制,除了文件系统监管外,还实现了设备隔离,用户隔离,系统资源隔离,使其更像是一种虚拟机机制了,与此相似的概念有linux下的openvz,以及Solaris下的Container。在下认为此类的技术会与虚拟化技术逐渐融合并逐渐集成入操作系统本身甚至硬件,最终成为新的操作系统资源分配机制(继多用户,多进程,Virtual Memory架构之后新的隔离机制)。

设计

Jail可以说是一种轻量级的虚拟机制,就我目前所了解到的资料来看,它实现了文件系统隔离,进程隔离,用户隔离,设备隔离。比较起linux下的openvz,差的地方有网络地址分配,共享库控制这两大方面,当然细节会有很大不同了。

部署

写了一大堆废话,下面才是真正开始安装使用了。

构建一个Jail,必备的几个参数有Jail的根目录,用户态程序,主机名以及IP地址,还有一个可选的dev。根据用户态程序的不同考虑可以将Jail做成完整的系统型Jail以及服务型Jail。下面搞的一种,其实个人比较感兴趣的是服务型Jail,但是handbook没有提及,资料也较少。

时至当前6.2的版本,各项脚本以及工具可以说是十分成熟了,因此也就有一个比较统一的部署和管理方式了,基本可以按照handbook来做了,具体如下:

1,构建Jail的根目录,假设建立一个名为test的Jail,放在/jail/test下。很简单,就一句命令:

#mkdir /jail/test


2,构建用户态程序,因为是完整的系统型Jail,自然这些用户态程序也就是FreeBSD的world了,make world实现:

# cd /usr/src
# make world DESTDIR=/jail/test

这里make world=make buildworld + make installworld,因此如果以前做过buildworld的话可以偷懒直接用以前build好的安装,可以节省大量时间,也就是

#make installworld DESTDIR=/jail/test

3,构建jail内系统运行需要的配置文件,也就是jail的etc了,也就一条:

# make distribution DESTDIR=/jail/test

4,修改rc.conf添加jail服务运行的必要参数,必备的有:
jail_enable="YES" # 如果设为 NO 则表示不自动启动 jail
jail_list="test" # 以空格分隔的 jail 名字列表


还需指定单个jail的必备参数:
jail_test_rootdir="/jail/test" # jail 的根目录
jail_test_hostname="jail.dawnh.net" # jail 的主机名
jail_test_ip="192.168.1.81" # jail 的 IP 地址

另外还有可选的devfs,可用于控制jail里面可以使用哪些设备

jail_test_devfs_enable="YES" # 在 jail 中挂接 devfs
jail_test_devfs_ruleset="test_ruleset" # 在 jail 中应用的devfs 规则集


至此Jail基本就建立完成了,可以启动了。

这里注意还有一点是handbook没有提到但必须做的事情,就是设置IP,前面虽然为Jail指定了IP,但这个IP似乎是指定这个Jail可以从宿主系统接受数据报的IP,要其真正起作用,还必须在宿主系统配置上这个IP才可以,一般的做法是在宿主系统的接口上设置alias,命令如下:

#ifconfig re0 inet 192.168.1.81 netmask 255.255.255.0 alias

这样才算真正完成了,然后就是启动这个jail了。

#/etc/rc.d/jail start

如果前面做的都没问题的话可以看到Jail服务正常启动。

使用

然后的问题就是怎么进到这个Jail里面去使用了。因为刚构建好的Jail类似刚安装好的FreeBSD,是一个任何服务都没启用,连root密码都为空的系统,此时只能从控制台登陆进去配置各项服务,然而这里关键的问题就是–Jail是没有控制台的!

当然不会有人傻到对这种问题束手无策,最容易想到的是直接通过宿主系统进到/jail/test/etc里去修改各种配置文件,貌似这也是大部分网上有的资料所写的办法。然而由于我玩openvz的习惯,总以为会有那么一个jailctl enter test的命令可以直接从宿主进入到jail中去,不幸的是–没有。

然而我却找到了jexec这样一个命令可以执行jail里的命令,于是就简单多了,按照安装FreeBSD系统的经验,装好后第一步就是设置root密码并开启ssh,这样才方便下面登陆进去管理嘛,于是这样做:

#jls

此命令列出当前运行的jail,这里的关键是取得这个jail的jid,因为下面要用到。我这里假设id为1

#jexec 1 passwd root

要求输入密码了,和平时该密码一样的效果。

#jexec /etc/rc.d/sshd forcestart

启动ssh

至此这个Jail就可以ssh上去管理了。

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>