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 验证,再滚动到生产实例。