组装一个Jail

@vrqq  May 5, 2022
https://blog.vgot.net/archives/freebsd-jail-ipfw-nat.html
https://rderik.com/blog/running-a-web-server-on-freebsd-inside-a-jail/
https://rderik.gumroad.com/l/uwOLZ

大致步骤是:

  1. 找个目录,安装一套freebsd,无论是编译还是网上下载
  2. /etc/jail.conf中指定这个目录,然后

准备: 先安装一套系统

mkdir /usr/jail/www
bsdinstall jail /usr/jail/www

配置文件 /etc/jail.conf
参数详见 https://www.freebsd.org/cgi/man.cgi?jail
以及 https://www.freebsd.org/cgi/man.cgi?jail.conf(5)

www {
    host.hostname = myweb;
    ip4=inherit;
    ip6=inherit;
    path = "/usr/jail/www";
    devfs_ruleset = 2;      # see /etc/defaults/devfs.rules
    mount.devfs;
    allow.reserved_ports;
    exec.start = "/bin/sh /etc/rc";
    exec.stop  = "/bin/sh /etc/rc.shutdown";
}

此方案使用和当前系统相同网络栈(上文)

(未完成)网络方案2: 配置主机给jail的NAT 以IPFW举例 /etc/ipfw.rules**

在启动之前的新建一对网卡,并在防火墙配置跳转(TODO)

## https://www.freebsd.org/cgi/man.cgi?query=epair
## create pair-ether-devices for this jail
## we assume result is epair0a and epair0b
## epair0a: host 10.1.1.1/24
## epair0b: jail 10.1.1.2/24
ifconfig epair0 create inet 10.1.1.1/24

修改jail内部的ip和gateway /usr/jail/www/etc/rc.conf

ifconfig_epair0b="inet 10.1.1.2 netmask 255.255.255.0"
defaultrouter="10.1.1.1"

(未完待续)

使用它

装一些程序 并启动

pkg -j www install nginx php81 php81-extensions mariadb106-server vim
service jail start www

常用指令

  • 前台启动www jail -c www, 强停 jail -r 1
  • 后台启动www service jail start www, service jail stop www
  • 看所有 jls, 看详情 jls -v
  • 进入1号 jexec 1 bash
  • 往www机装程序 pkg -j www install nginx php81 php81-extensions mariadb106-server vim
  • 看看装了哪些pkg -j www info

系统升级和jail升级

FreeBSD的确free,系统升级使用freebsd-update,软件包更新用pkg update,然而若只更新软件包,需要注意他的提示是否比kernel要新,那么就要先更新系统。。

升级主系统

# 执行后会有一堆提示,例如配置文件合并,哪些系统文件要被删除,哪些是新增等等
freebsd-update -r 13.1 upgrade

# (上一步觉得还需要再看看/再改改可以重新运行上面命令)
# 上一步我们merge的文件不会立即生效,当前旧系统当前仍然是可用的,需要执行下述命令apply
freebsd-update install

升级jail内系统
https://docs.freebsd.org/en/books/handbook/jails/#jails-updating

# 大升级 注意需要install两次才会生效
freebsd-update -b /usr/jail/www --currently-running 13.0 -r 13.1 upgrade
freebsd-update -b /usr/jail/www install
ervice jail restart www
freebsd-update -b /usr/jail/www install

# 小升级
freebsd-update -b /usr/jail/www fetch
freebsd-update -b /usr/jail/www install

# 运行 jls 看下要更新哪个jail
pkg -j 1 update

这似乎是freebsd-update的一个bug,只能看到宿主机的版本,即使在从环境下运行升级也看到的是宿主机的版本,实际上 在宿主机执行freebsd-update IDC 会提示很多文件不符,说明从系统并没有升级。
此时需强行指定--currently-running

Related problem:
version FBSD_1.7 required by /usr/local/lib/libpython3.9.so.1.0
https://forums.freebsd.org/threads/version-fbsd_1-7-required-by-usr-local-lib-libpython3-9-so-1-0.86449/


添加新评论