用户工具

站点工具


software:e:ezjail

ezjail——Jail管理框架

ezjail的主页(英文)

最新消息

(二〇〇八年七月十日)ezjail 3.0最终定稿了。它带来了一个新的备份和迁移工具集(存档/恢复),还有一个ez-attach功能(控制台),引入了启动/停止/重启快捷方式,并进行了很多改进以提供用户体验。准备测试beta版的用户可以从CVS获取。预计发布日期是7月16日。欢迎大家给予反馈或提交错误报告。另外“margemaster all jails”功能也将出现在新版本中。敬请期待。

(二〇〇七年七月三十一日)ezjail 2经过一年的犹豫而悬而不决,我决定——不管遇到什么问题——升到ezjail-2.1。所有的新功能都已经经过志愿者从CVS中取得测试过。参考版本历史以获取修改列表和下载链接。请报告任何你遇到的问题

(二〇〇七年三月二十二日)创建了一个邮件列表归档订阅

概述

FreeBSD里说的Jail是一个或多个任务,它们具有相同的核心Jail-ID,具有一个单一的IP地址,并且有相同的chroot环境。FreeBSD Jail子系统的一个用例,是在一个宿主机系统里提供多个虚拟FreeBSD系统。ezjail使得这一过程变得尽可能的容易,并争取最低的系统资源占用。下面提到Jail这个词都是指一个虚拟的FreeBSD系统,它由一个主机名,一个IP地址和一个Jail根组成。

Jail(8)的手册概述了创建Jail的方法,然而,当你需要多个Jail时,完整的Jail目录树会迅速地占用很多宝贵的磁盘空间。ezjail通过使用FreeBSD的nullfs特性来避免这个问题。基础系统的大部分(/bin、/boot、/sbin、/lib、/libexec、/rescue、/usr/{bin、include、lib、libexec、ports、sbin、share、src})仅在宿主机系统中存在一个副本,并通过nullfs以只读的方式挂载到所有的Jail里去。那些Jail就非常苗条了(每个约2mb),并且只包含一些指向basejail挂载点的软链接,而没有像/etc、/usr/local这样的共享目录。

ezjail带来很多优势:

  • 节省磁盘空间、inode,甚至内存,因为系统只需要为所有Jail持有一个系统二进制的副本
  • 你可以通过更新一个基础目录来更新所有的Jail,它如此简单,你肯定能
  • 入侵者破坏Jail时无法安装标准的Rootkit(因为基础系统是只读挂载的)
  • 由于ezjail完全是用sh写成的,因此没有必要在宿主机系统中安装其它脚本语言
  • 因为基础系统是通过软链接系统的,被囚禁(enjailed)的用户可以选择不使用已挂载的world
  • 一个常常被低估的事实:较少的复杂性意味着更多的安全。

用法

ezjail由两个脚本组成:ezjail-adminezjail.sh,前者用于创建、更新和删除Jail,后者用于启动、停止和重启Jail。

ezjail-admin

ezjail-admin实用程序有4个子命令:createdeleteupdatelist。下面挨次介绍它们。这里仅仅是一个快速参考,因此要获得详细信息请参考手册页。

ezjail-admin update [-i]

ezjail工作需要一个basejail,包含各个Jail间共享的world的那一部分。它的位置在配置文件中指定。详见ezjail-admin(1)ezjail.conf(5)手册页。ezjail-admin update子命令为你创建basejail,连同一个模板Jail,这个模板将会被复制到你创建的每个新Jail中去。注意不用中断任何应用程序来移除旧的basejail。新的world将会被复制并覆盖旧的,因此在更新后,任何已安装的库将会被有依赖它们的应用程序找到。

有时更新basejail是个好主意。通常这是必须的,当你更新宿主机系统时,因此在更新前停止所有的Jail不应该成为一个问题。

update这个名字可能会误导ezjail新手,但是虽然你将非常一般地使用这个命令来更新basejail,但当你第一次使用时,它会设置ezjail环境。

-i选项告诉ezjail-admin不要调用make world来建立world而是调用make installworld,这将假设你之前已经执行了make buildworld,如果你更新了宿主机系统,就是这种情况。

ezjail-admin create [-f FLAVOUR] [-x] [-r JAILROOT] JAILNAME JAILIP

basejail设置好后,你就可以开始创建Jail了。绑定一个主机名和一个IP是必须的。默认情况下所有的Jail都将创建在/usr/jails下,Jail的根由给定的JAILNAME衍生而来,当然,你也可以在配置文件中修改默认的ezjail根目录,或者通过-r选项为Jail指定一个根目录。如果Jail根不在ezjails根下,一个指向Jail根的软链接将会被创建。不管你是由于什么原因不得不把它们分散在各处,这将有助于跟踪你的所有Jail。

ezjail-admin检查JAILIP是否配置在本地接口上,如果不是则给出一个警告。你应该确保配置了IP以便能够连接它。

如果你创建了一个Jail并且通过不带-w选项的ezjail-admin delete命令删除了它,那么-x选项就有用了。这样,你就可以改变你的jail的一些属性(主要是JAILIP)。

如果指定了-f开关,Flavour就会在[ezjails Jail root]/flavours下查找FLAVOUR并复制到新安装的Jail中去。

在创建了jail后,你可以通过ezjail.sh脚本启动它。然而,如果你在rc.conf中启用了ezjailezjails里的所有Jail都会在系统下次启动时启动起来。

ezjail-admin delete [-w] JAILNAME

这个子命令很明确,然而如果你真的要删除该Jail,也就是删除该Jail根目录下的所有文件,你必须给出-w选项。如果不是,那么你还有机会通过ezjail-admin create -x命令重建该Jail,可以使用不同(或相同的)属性。

ezjail.sh

ezjail.sh脚本通常可以在/usr/local/etc/rc.d/ezjail.sh下找到(如果是通过ports安装的话)。它包含子命令start,restartstop,和零个或多个Jail主机名作为选项。如果没有选项被指定,则当前ezjails作用域下的Jail都将被读取。这通常在系统启动时,所有的rc脚本通过start子命令不带任何选项地启动而发生。如果一个以上的选项被指定,ezjail.sh仅仅作用于指定的Jail。

ezjail.sh使用/etc/rc.d/jail脚本来做实际的工作,强制启动而不需要jail_enable rc.conf变量,所以你不需要设置它。(如果你设置了,也无所谓)。

配置

要启用ezjail(即启动和停止ezjail管理下的Jail),你必须在/etc/rc.conf中添加一行ezjail_enable=“YES”。这是为了让脚本$PREFIX/etc/rc.d/ezjail.sh成为一个rc-script,以便让它自动启动。尽管ezjail-admin工具可以在没有设置rc.conf变量的情况下工作。

配置文件$PREFIX/etc/ezjail.conf用来控制ezjails的行为。因为它是自解释的并且还有一个手册也,因此请在那里查询相关选项。

待办事项

  • 我觉得image jails可以做更多的有趣的事情,我正尝试添加gemo镜像。
  • 通过mmap()备份image jails可以做到原子性就算它们正在运行中。我正在试着玩。
  • 我正在做ezjail-admin import命令,它可以把一个不是通过ezjail创建的jail导入进来。现在我已经在常见问题中添加了一条。

详细

我曾花了很多时间来调查FreeBSD上所有用来简化Jail操作的工具。从中确实获得了不少帮助。我写了一篇德语的关于这个的文章。总之,最重要的是:

  • rc.d/jailFreeBSD如今带有一个方便的jail rc-script。它在重启时存在一些问题,希望尽快被解决。以前/etc/rc.d/jail restart的问题已经解决,这减少了ezjail.sh的额外工作。我使用那个脚本做所有的实际工作,仅仅是在解析每个配置文件后给它jail的名字。jail_JAILNAME_mount_enable变量允许我使用下面的特性:
  • fstabs:FreeBSD允许创建/etc/fstab.JAILNAME,它将在jail启动时被执行。通过添加这样的/usr/jails/basejail /usr/jails/JAILNAME/basejail nullfs ro 0 0行可以自由地把basejail引入到jail里。
  • ports,src:在服务器上使用ezjail来管理,我定期地把/usr/ports//usr/src/取出到/usr/jail/basejail/usr/{ports,src}。这样可以在所有的Jail间共享这个inode消费大户(inode-consuming)ports。/etc/make.confWRKDIRPREFIX=/var/ports,DISTDIR=/var/ports/distfiles和PACKAGES=/var/ports/packages等条目是非常有用的。设置一个WRKDIRPREFIX指向到/usr/ports以外对于安装一些依赖非常多的ports后的清理工作是非常有用的。

风格

ezjail 1.2版引入了风格这个概念。风格相当于预定义的Jail。TODO

常见问题

  • 问:我创建了一个Jail但是当我执行 /usr/local/etc/rc.d/ezjail.sh start JAILNAME 时它并没有启动
  • 答:请检查,使用命令jls来检查这个Jail真的没有启动。不同的是,命令jail会带你进入jail里的交互式shell,而rc.d/ezjail.sh是一个rc-script。通常在系统启动或者关机时进入一个交互式shell将会中断启动进程。如果你想在启动后进入Jail里的交互式shell,把命令jlsjexec JID /bin/sh结合起来用就可以了。
  • 答:请确保你在rc.conf中添加了ezjail_enable=“YES”已启用ezjail
  • 答:确保在你运行ezjail.sh之前启用了ezjail。查看rc.d介绍以获得更详细的信息。
  • 答:如果还不行,检查控制台输出:/usr/jails/JAILNAME/var/log/console.log(或者在ezjail根目录下)。大多数情况下,你能在这里找到jail启动失败的原因。
  • 问:我在6.1上运行ezjail遇到了奇怪的问题,怎么回事呢?
  • 答:FreeBSD 6.1-RELEASE的''/etc/rc.d/jail''有问题,当有多个ezjail时,它会阻止它们的启动。由于一个不相干的错误,会导致在执行ifconfig时而出现错误消息提示,这个错误提示可以忽略。修正方法:升级你的系统到RELENG_6_1。结构上没有大的变动,所以要让ezjail运行起来不需要再做很多事情。
  • 问:ezjail port拒绝安装在FreeBSD 6.0以前的版本上,这是为什么?
  • 答:实验证明,FreeBSD 6.0之前的版本的nullfs实现会导致崩溃,cpu-hogs和其它一些奇怪的现象。在启动ezjail项目之前,我使用nfs本地加载,造成了许多问题(比如,不得不为portmap打个补丁以便仅绑定在127.0.0.1上等等)。
    看了看nullfs的开发,nullfs从FreeBSD 6.0开始可以使用。这也造就了我的高负载的FreeBSD多jail环境的实验。
  • 问:为什么ezjail需要为base jail复制一个额外的ports副本?这不是浪费磁盘空间嘛?我们不能只适用基本系统的ports树吗?
  • 答:反问:为什么我们需要一个基本系统的额外拷贝呢?这不是浪费磁盘空间吗?我们不能挂载/作为basejail给所有的jail吗?ezjail哲学受它的历史影响:它的成立是为了在作为shell服务器上真多很多个实际用户来简化管理。尽管你信任所有的用户,但是你可能不信所有的他们在上面安装的软件和这些软件在jail里干些什么。因此我决定把jail里能访问的和宿主系统能操作的严格分开。这个边界就是ezjail_root
    ports这个问题,我不希望所有人都知道我在宿主系统上安装了些什么,由于可以通过work/-directories来进行猜测,这可能会把暴露出宿主系统可攻击的部分。A problem like ignoring ro flags when mounting from fstab may give you an idea why I consider that boundary essential to system security.
    如果你知道你在做什么并且确认要这样做,你的宿主系统的WRKDIRPREFIX不能被jail访问的,你可以用这些指令通过nullfs挂载多个ports。另外一个方法是这样做在宿主系统里 mv /usr/ports/ /usr/jails/basejail/usr/ports/; ln -s /usr/jails/basejail/usr/ports /usr/ports; 。 ezjail不会提供这个选项的。

作者/联系方式

ezjail由Dirk Engling编写。他的电子邮件地址上erdgeist@erdgeist.org。发送请求请前往项目邮件列表ezjail@erdgeist.org。你可以发邮件给ezjail-subscribe@erdgeist.org来订阅它。在ircnet上还有一个IRC频道#ezjail。请发送错误报告、意见和功能请求。也欢迎捐赠⋯⋯以啤酒的形式。继续往下看⋯⋯

授权

ezjail被认为是啤酒许可证软件

感谢

⋯⋯是因为:

  • Tom - Beerdriven反馈,可用性研究
  • Cryx - 大量的beta-测试
  • sg - 功能、补丁、想法
  • atoth - 校对、文档编写
  • Alex Samorukov - 错误发现
  • Mark Bucciarelli - 很多想法、大量的测试
  • Gunjin - 指出一个丑陋的jail命名错误
  • Alex Moura - 报告错误并提出一些flavour的打包策略
  • Mike Harding - 报告了一个不能创建已存在的jail的错误
  • Matthias Lederhofer - 报告了一个在flavour安装中的错误
  • Vivek Khera - 有用的意见/设计缺陷的指出
  • Bas Dakkenhorst - 发来一个ezjail-admin list的补丁,和一个新的norun-config特性
  • FreeBSD社区 - 现存的最好的服务器操作系统

链接

引用

/data/vhosts/wiki-data/pages/software/e/ezjail.txt · 最后更改: 2011/03/12 04:28 由 delphij