Jail Host主机配置

备注

在 jail 中运行的 FreeBSD 版本不能比主机中运行的版本更新

主机激活Jail

  • 执行以下命令配置在系统启动时启动Jails:

配置在系统启动时启动Jails
sysrc jail_enable="YES"

# 配置所有jails在后台启动
sysrc jail_parallel_start="YES"

Jail网络

FreeBSD jails的网络有以下不同方式:

  • 主机网络模式(IP 共享)

  • 虚拟网络(VNET): 每个jail有隔离的网络堆栈,独立IP地址、路由表和网络接口(就像独立的虚拟机)

  • netgraph 系统: netgraph是一个多功能内核框架,用于创建自定义网络配置,可以用于定义网络流量在 jails 和主机系统之间以及不同 jails 之间的流动方式

备注

我觉得 VNET jail + Thin jail + Linux jail ,可以构建一个多IP的隔离容器来模拟多台主机,这样就可以部署类似 kind(本地docker模拟k8s集群) 这样的Kubernetes模拟集群,一个在FreeBSD上运行的模拟Kubernetes集群。

以后试试...

Jail目录树

Jail文件的位置没有规定,可以是 /jail , /usr/jail/usr/local/jail ,在FreeBSD Handbook中采用的是 /usr/local/jails 目录:

创建jails目录( ZFS )
zfs create -o mountpoint=/usr/local/jails zroot/jails
zfs create zroot/jails/media
zfs create zroot/jails/templates
zfs create zroot/jails/containers

对jail也可以使用传统的UFS:

创建jails目录(传统文件系统 UFS )
mkdir /usr/local/jails/
mkdir /usr/local/jails/media
mkdir /usr/local/jails/templates
mkdir /usr/local/jails/containers

上面除了 /usr/local/jails 目录外,其他目录还有:

  • media 将包含已下载用户空间的压缩文件

  • templates 在使用 Thin Jails 时,该目录存储模板(共享核心系统)

  • containers 将存储jail (也就是容器)

Jail配置文件

有两种方法配置jails:

  • 方法一: 在 /etc/jail.conf 中为每个jail添加一个条目

  • 方法二: 在 /etc/jail.conf.d/ 目录中为每个jail创建一个文件 ( 我采用这个方法 ,适合管理大量的jails)

/etc/jail.conf 中添加一行配置来包含所有在 /etc/jail.conf.d/ 目录下以 .conf 结尾的配置
.include "/etc/jail.conf.d/*.conf";

典型Jail配置

典型的jail配置
jailname { 
  # STARTUP/LOGGING
  exec.start = "/bin/sh /etc/rc"; 
  exec.stop = "/bin/sh /etc/rc.shutdown"; 
  exec.consolelog = "/var/log/jail_console_${name}.log"; 

  # PERMISSIONS
  allow.raw_sockets; 
  exec.clean; 
  mount.devfs; 

  # HOSTNAME/PATH
  host.hostname = "${name}"; 
  path = "/usr/local/jails/containers/${name}"; 

  # NETWORK
  ip4.addr = 192.168.1.151;  #为jail分配的IP地址
  ip6.addr = ::ffff:c0a8:197 
  interface = em0;  #jail所连接的host主机网络接口
}

公共配置 并使用 /etc/jail.conf.d/ 目录配置差异化

我发现其实结合方法一和方法二可能是更好的方案:

  • /etc/jail.conf 为所有jail配置的共同通用部分,并 include /etc/jail.conf.d/ 目录中差异化部分:

/etc/jail.conf 为所有jail配置的共同通用部分
# STARTUP/LOGGING
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.consolelog = "/var/log/jail_console_${name}.log";

# PERMISSIONS
allow.raw_sockets;
exec.clean;
mount.devfs;

# HOSTNAME/PATH
host.hostname = "${name}";
path = "/usr/local/jails/containers/${name}";

# NETWORK
#ip4 = inherit;
interface = wifibox0;

.include "/etc/jail.conf.d/*.conf";
  • 然后在 /etc/jail.conf.d/ 目录下的配置只需要设置主机名和IP地址,类似

/etc/jail.conf.d 目录下配置只需要配置差异部分
d2l {
  ip4.addr = 10.0.0.9/24;
}

如何处理jail启动顺序

我在 No internet access from inside jail! 看到配置jail启动顺序的方法,值得借鉴:

/etc/rc.conf 可以控制jail启停顺序
jail_enable="YES"
jail_list="mariadb httpd"
jail_reverse_stop="YES"

另一种方式参考 (Solved)No internet access from inside jail! 在配置 httpd Jail时添加 depend=mariadb 同时移除 jail_reverse_stop="YES" ,也有同样效果。

开始创建

Host 准备工作已经完成,现在开始创建:

参考