轻量级虚拟机与主机或完全虚拟化的系统不同。首先,主人对jail施加了限制。jail老板不能在jail内改变这些限制;他必须向主机系统管理员请求这些权限。这些限制是一个特性——如果你的数据库服务器没有理由向外界ping,为什么允许这种活动?
成为一名jail管理员意味着了解自己的极限,理解它们,并围绕它们工作。最明显的限制涉及重新启动、进程和网络访问。
关闭或重新启动系统的命令,如 halt(8)
、 reboot(8)
等,在jail中不起作用。这些命令通过向内核和主进程 init(8)
发出信号来执行其最终任务:向所有进程发出信号,让它们优雅地关闭,杀死所有进程,刷新磁盘缓存,以及停止或重新启动硬件。Jails可以查询但不能更改内核,并且它们没有init进程。结果如何?
xxxxxxxxxx
# reboot
reboot: SIGTSTP init: No such process
严格来说,jail管理员永远不需要重新启动jail。jail只是被困在一组转换后的命名空间中的一堆进程。经验丰富的系统管理员深知,完全有可能重启所有这些进程,并达到与重启相同的效果。经验丰富的系统管理员也知道,有时实现这些重启的最简单、风险最小的方法是重新启动该死的jail。
重启jail的唯一方法就是从host那里。您必须要求主机系统管理员执行重新启动。如果你四处寻找,你可以找到附加脚本,让jail老板重新启动他们的jail。不过,它们都没有很好地打包安装。
主机的进程和进程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里:
xxxxxxxxxx
$ ps
PID TT STAT TIME COMMAND
23615 0 IJ 0:00.01 login [pam] (login)
23616 0 SJ 0:00.01 -csh (csh)
24808 0 R+J 0:00.00 ps
查看STAT下。所有进程都有 J
标志。jail看不到任何不在自己jail里的东西。如果我检查主机上的进程,PID 23615、23616和24808将显示完全相同的结果。
像 netstat(1)
这样的网络命令与内核的数据结构紧密相连。如果jail中运行的FreeBSD版本比主机上运行的版本旧,它们可能无法工作。您必须在主机上使用 netstat
。
sockstat(1)
命令有一个 -j
标志,用于指定要观察的jail。您必须从主机运行它:
xxxxxxxxxx
# sockstat -j www1 -6
始终查看命令的手册页,看看它是否有一个特定于jail的标志,这将有助于故障排除。现在,让我们转向单个jail的内核级定制。