Jail 的边界

Jail 隔离进程、文件系统、账户和网络视图,但所有 Jail 共享宿主机 FreeBSD 内核。需要不同内核、Windows/Linux 内核特性或强隔离时,应使用 bhyve 或其他虚拟机方案。

规划目录与网络

推荐把 Jail 根、持久数据和配置分开;ZFS 用户可为它们使用独立数据集,便于配额、快照和克隆。网络模型先选一种:共享 IP、VNET 独立网络栈,或配合 bridge/epair。VNET 更像独立主机,但桥接、防火墙与路由更复杂。

创建传统 distribution-set Jail

官方 Handbook 当前提供 bsdinstall jail 目标:

mkdir -p /usr/local/jails/containers/classic
bsdinstall jail /usr/local/jails/containers/classic

这会获取并解包不含内核的基础系统。执行前确认目标目录为空、空间充足且版本来源符合计划。不要把命令指向已有数据目录。

最小 /etc/jail.conf 应明确名称、path、host.hostname、网络和启动策略。先用:

jail -c -f /etc/jail.conf name=classic
jls -v
jexec -l classic /bin/sh

具体参数必须与所选网络模型对应;不要复制同时包含共享 IP 和 VNET 的混合示例。

更新模型

  • distribution-set Jail 使用该模型对应的基础系统更新方法,并保持与宿主可兼容的用户态。
  • 从 FreeBSD 15.0 起,以基础包安装的 pkgbase Jail 由 FreeBSD-base 仓库更新,例如在宿主对 Jail 根使用 pkg -r,或在 Jail 内 pkg upgrade
  • pkgbase 更新后检查 /etc/*.pkgnew.pkgsave;不要再运行 etcupdate 合并同一批配置。

第三方软件在 Jail 内照常使用 pkg,但这与基础系统来源是两个问题。

安全与备份

不授予不需要的 allow.*,限制 devfs ruleset、mount 权限和 raw socket。宿主机的漏洞影响所有 Jail,因此宿主补丁优先级最高。备份应包含 Jail 配置、root 数据集、业务数据、网络拓扑和外部依赖;升级先 clone 一个 Jail 验证,再滚动到生产实例。