FreeBSD中jail与linux中的openvz、kvm等虚拟机概念不同,实际上是为了隔离宿主机上多用户的独立环境而诞生的安全管理软件,但是经过配置完全可以充分利用宿主机的物理资源创建多个虚拟环境,搭建单物理机多虚拟FreeBSD环境平台,特别适合企业内部开发环境的使用,充分利用FreeBSD坚如磐石的系统特性与ports的丰富性。

    遗憾的是,国内技术论坛与资料一如既往地以讹传讹简单复制粘贴(这里面包括著名图书《构建高可用linux第2版》中有关jail部分由于作者疏忽而带来的大量错误转帖),导致在参照进行配置时走了不少弯路,此文将亲自实际部署成功的过程做一记录,希望有需要的童鞋转载时不要再弄错了。
 
一、安装宿主机环境
    这个就不用多说了,安装教程一大把,我的物理机是很普通的台式机,主板集成声显网卡,500G SATA硬盘,6G DDR3 1333内存,安装FreeBSD 9.0 AMD64版本。为方便后期编译,安装时勾选选择了src,整个安装过程大约20分钟左右。安装后修改镜像源,提高后续更新的网络下载速度。国内比较好用的是163的镜像,修改/etc/make.conf(默认etc下无此文件,需要从另一个目录复制过来一份)
#cp /usr/share/examples/etc/make.conf  /etc/make.conf  
#ee /etc/make.conf  
MASTER_SITE_OVERRIDE=\  
http://mirrors.163.com/FreeBSD/distfiles/${DIST_SUBDIR}\      
ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}\  
ftp://ftp.cn.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}\  
ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}\  
ftp://ftp.hk.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}\  
ftp://ftp.jp.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}\  
ftp://ftp.kr.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}\  

#make && make install  
#ee /etc/portsnap.conf
SERVERNAME=portsnap.cn.freebsd.org 
#portsnap fetch extract
#portsnap fetch update 

二、安装单台jail虚拟机
1、选择jail在宿主机的目录,一般放置在/usr/jail目录下,例如我要安装配置一台cms虚拟机
#mkdir -p /usr/jail/cms

2、编译源码
#cd /usr/src
#make buildworld    
#make installworld DESTDIR=/usr/jail/cms        
#make distribution DESTDIR=/usr/jail/cms        
#mount -t devfs devfs /usr/jail/cms/dev         

3、配置虚拟机
#ee /etc/rc.conf
ifconfig_rl0_alias0="inet 192.168.1.38 netmask 255.255.255.0"  
jail_enable="YES"
jail_list="cms"

jail_cms_rootdir="/usr/jail/cms"
jail_cms_hostname="cms.mydomain.com"
jail_cms_ip="192.168.1.38"
jail_cms_exec="/bin/sh /etc/rc"
jail_cms_devfs_enable="YES"
保存后重启宿主机,ifconfig看下宿主机的虚拟网卡配置,jls查看虚拟机状态。

4、管理虚拟机
#jxexc  1 passwd root            
#jxexc  1 pw user add shuqi888
#jxexc  1 passwd shuqi888
#jxexc  1 pw groupmod wheel -m shuqi888
 
#jxexc  1 ee /etc/rc.conf
rpc_bind_enable="NO"
sshd_enable="YES"
hostname="cms.mydomain.com"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
ntpd_enable="YES"
ntpd_sync_on_start="YES"
named_enable="YES"
#jxexc  1 sh  /etc/rc

三、批量快速安装多台jail虚拟机
    当需要安装部署多台jail虚拟机的时候,用上面的方法就太麻烦了,于是我们找到了ezjail这个批量安装管理jail虚拟机的工具。

1、安装ezjail
#cd /usr/ports/sysutils/ezjail
#make install clean
#ee /etc/rc.conf
ezjail_enable="YES"    
#ezjail-admin update -p -i    

2、批量创建jail虚拟机      
#ezjail-admin create -r /usr/jails/cms cms.mydomain.com 192.168.1.11
#ezjail-admin create -r /usr/jails/mysql mysql.mydomain.com 192.168.1.12
  该命令可以分别在/usr/jails/cms和/usr/jails/mysql目录下建立名为cms.mydomain.com和mysql.mydomain.com的jail机器。

3、通过ezjail工具启动jail虚拟机
#/usr/local/etc/rc.d/ezjail.sh start  cms.mydomain.com

#/usr/local/etc/rc.d/ezjail.sh start mysql.mydomain.com


4、查看jail虚拟机状态
#ezjail-admin list

5、启动虚拟机ssh,修改root密码,增加用户等与创建单台jail之后的操作相同

四、设置虚拟机上网
    虚拟机创建配置完成后,会发现在虚拟机里无法连接到网络,执行ping命令总是返回 socket: Operation not permitted。在宿主机上做如下操作:
# ee /etc/sysctl.conf
加上   security.jail.allow_raw_sockets=1
保存后重启即可

五、虚拟机优化
    复制宿主机的resolv.conf到jail机上,解决DNS查询解析问题
#cp /etc/resolv.conf /usr/jail/cms/etc/resolv.conf
    将宿主机的make.conf也复制过去,这样ports安装速度很快
#cp /etc/make.conf /usr/jail/cms/etc/make.conf