第七章:活在Jail中

轻量级虚拟机与主机或完全虚拟化的系统不同。首先,主人对jail施加了限制。jail老板不能在jail内改变这些限制;他必须向主机系统管理员请求这些权限。这些限制是一个特性——如果你的数据库服务器没有理由向外界ping,为什么允许这种活动?

成为一名jail管理员意味着了解自己的极限,理解它们,并围绕它们工作。最明显的限制涉及重新启动、进程和网络访问。

第七章:活在Jail中重启你的 Jail进程和 Jails网络可视性

重启你的 Jail

关闭或重新启动系统的命令,如 halt(8)reboot(8) 等,在jail中不起作用。这些命令通过向内核和主进程 init(8) 发出信号来执行其最终任务:向所有进程发出信号,让它们优雅地关闭,杀死所有进程,刷新磁盘缓存,以及停止或重新启动硬件。Jails可以查询但不能更改内核,并且它们没有init进程。结果如何?

严格来说,jail管理员永远不需要重新启动jail。jail只是被困在一组转换后的命名空间中的一堆进程。经验丰富的系统管理员深知,完全有可能重启所有这些进程,并达到与重启相同的效果。经验丰富的系统管理员也知道,有时实现这些重启的最简单、风险最小的方法是重新启动该死的jail。

重启jail的唯一方法就是从host那里。您必须要求主机系统管理员执行重新启动。如果你四处寻找,你可以找到附加脚本,让jail老板重新启动他们的jail。不过,它们都没有很好地打包安装。

进程和 Jails

主机的进程和进程ID都是唯一的。jail确实会转换进程的命名空间,但只能通过限制哪些进程可以在jail中查看来实现。如果PID 2029在jail loghost 中,则主机上其他任何地方都不会出现其他PID 2029,无论是否被监禁。然而,PID 2029只能看到自己jail中的进程。Jails无法看到PID 1或 /sbin/init

如果你用iocage管理你的jail,记住iocage在每个jail名称前都加上前缀 ioc- 。也许host不认为jail www1 存在,但jail ioc-WW1 确实存在。

如果你运行 ps(1) ,被监禁的进程会显示 J 标志。我在jail里:

查看STAT下。所有进程都有 J 标志。jail看不到任何不在自己jail里的东西。如果我检查主机上的进程,PID 23615、23616和24808将显示完全相同的结果。

网络可视性

netstat(1) 这样的网络命令与内核的数据结构紧密相连。如果jail中运行的FreeBSD版本比主机上运行的版本旧,它们可能无法工作。您必须在主机上使用 netstat

sockstat(1) 命令有一个 -j 标志,用于指定要观察的jail。您必须从主机运行它:

始终查看命令的手册页,看看它是否有一个特定于jail的标志,这将有助于故障排除。现在,让我们转向单个jail的内核级定制。