Skip to content

31.1 Linux Jail 基础 ​

Linux Jail 是 FreeBSD 操作系统中的一项功能,用于在 Jail 中运行 Linux 二进制文件和应用程序。其原理是在 FreeBSD 内核中集成兼容层,将 Linux 系统调用转换为对应的 FreeBSD 原生系统调用。Linux Jail 旨在无需单独部署 Linux 虚拟机或运行环境的情况下,使 FreeBSD 系统能够运行 Linux 软件。

以下介绍在 FreeBSD Jail 中部署 Linux Jail 的初始化配置。

31.1.1 准备工作 ​

本节将所有 Jail 绑定到虚拟网络接口 lo1,使其构成 FreeBSD 系统下的一个局域网,其中 FreeBSD 主机充当该局域网的网关。

所有 Jail 的网络流量必须通过网络接口 lo1,因此需要启用网络转发,本节使用 pf 防火墙实现此功能。

sh
外部网络
   │
   │  NAT(pf 防火墙)
   ▼
物理网卡 em0
   │
   │  网络地址转换
   ▼
FreeBSD 主机(网关)
   │
   │  虚拟网络接口 lo1
   ▼
局域网 192.168.5.0/24
   │
   ├── debian   192.168.5.1
   ├── ubuntu   192.168.5.2
   ├── antix    192.168.5.3
   └── alpine   192.168.5.4

注意

需要配置 pf 防火墙以实现网络访问控制。

31.1.2 准备网络接口 ​

添加克隆网络接口 lo1 并启用:

sh
# sysrc cloned_interfaces+="lo1"
# service netif cloneup

31.1.3 准备 pf 防火墙 ​

提供两种配置方式,可根据需要选用。

31.1.3.1 方案一 ​

pf 防火墙的表(table)是一种命名结构,用于保存地址和网络的集合,表中的地址可通过 NAT 访问网络。

即使没有相关规则引用某表,persist 标志也使防火墙始终保留该表,从而防止防火墙规则重新加载时自动清空该表。

编辑 /etc/pf.conf 文件,加入以下配置:

ini
table <jails> persist
pass out on em0 inet from <jails> to any nat-to (em0)

技巧

实际使用时请将接口名 em0 以及各 Jail 的 IP 地址替换为自己环境中的实际配置。

可使用 pfctl 对 jails 表添加或删除条目,以控制网络访问。例如:

  • pfctl -t jails -T add 192.168.5.1 将 192.168.5.1 加入 jails 表使其可以访问网络。
  • pfctl -t jails -T delete 192.168.5.1 将 192.168.5.1 移出 jails 表使其无法访问网络。

此方法需手动管理,但灵活性更高。

31.1.3.2 方案二 ​

直接在 /etc/pf.conf 文件中写下规则:

ini
pass out on em0 inet from 192.168.5.1 to any nat-to (em0)

此方法允许 192.168.5.1 访问网络,其特点是规则固化在配置文件中,对于无特殊需求的场景较为便捷。

31.1.4 启用 pf 防火墙 ​

即使不使用防火墙规则,也需要启用 pf 服务来实现 NAT 功能。启用 pf 防火墙的方法请参见其他章节。

31.1.5 加载 Linux 二进制兼容层(Linuxulator)内核模块 ​

启用并启动 Linux 兼容层服务,该方式能够自动加载 Linux 兼容层所需的各种内核模块:

sh
# service linux enable
# service linux start

31.1.6 准备目录 ​

创建用于存放 Jail 相关文件的目录:

sh
# mkdir /usr/jails

31.1.7 文件结构 ​

sh
/usr/jails/
├── debian/          # Debian 12 Jail 根目录
│   ├── dev/         # devfs 挂载点
│   ├── dev/shm/     # tmpfs 挂载点
│   ├── dev/fd/      # fdescfs 挂载点
│   ├── proc/        # linprocfs 挂载点
│   ├── sys/         # linsysfs 挂载点
│   └── tmp/         # nullfs 挂载点
├── ubuntu/          # Ubuntu 22.04 Jail 根目录
│   ├── dev/
│   ├── dev/shm/
│   ├── dev/fd/
│   ├── proc/
│   ├── sys/
│   ├── tmp/
│   └── tmp/.X11-unix/  # X11 socket 挂载点
├── antix/           # antiX Linux Jail 根目录
│   ├── dev/
│   ├── dev/shm/
│   ├── dev/fd/
│   ├── proc/
│   ├── sys/
│   └── tmp/
├── alpine/          # Alpine Linux Jail 根目录
│   ├── dev/
│   ├── dev/shm/
│   ├── dev/fd/
│   ├── proc/
│   └── sys/
└── freebsd-jail/    # FreeBSD Jail 根目录

/etc/
├── fstab.debian     # Debian Jail 的 fstab 配置
├── fstab.ubuntu     # Ubuntu Jail 的 fstab 配置
├── fstab.antix      # antiX Jail 的 fstab 配置
├── fstab.alpine     # Alpine Jail 的 fstab 配置
├── jail.conf        # Jail 主配置文件
├── pf.conf          # PF 防火墙配置
└── rc.conf          # 系统启动配置

31.1.8 参考文献 ​

  • FreeBSD Wiki. LinuxApps[EB/OL]. [2026-03-25]. https://wiki.freebsd.org/LinuxApps. 列出了在 FreeBSD 上运行的 Linux 应用及方法,为兼容性实践提供参考。