如何更新和维护多个 jail(ZFS 和 nullfs 框架)

如何更新和维护多个 jail(ZFS 和 nullfs 框架)

有多种方法和工具来创建 jail,而且现在磁盘空间变得越来越便宜,创建一个完整的 jail(已经编译了一个世界)只需几秒钟:

zfs create tank/jails/sandbox
zfs create tank/jails/sandbox/home
zfs create tank/jails/sandbox/tmp
make installworld DESTDIR=/jails/sandbox SRCCONF=/etc/src-jail.conf

为了更新现有的监狱,我目前使用类似以下的方法:

for jail in /jails/*; do
   make installworld delete-old delete-old-libs DESTDIR=$jail  
done

它可以起作用,但它除了是一个破坏性的过程之外,还意味着“停机”,因为如果需要则无法回滚。

有一些方法描述了如何创建基础图像,然后使用nullfs它来挂载只读骨架或使用符号链接的其他方法,但是在所有可能的选项中,我想知道您如何处理滚动升级?

尽管使用了该工具,例如如果主机正在使用 FreeBSD 11.2 并且现在已经更新到 FreeBSD 12,我只想运行一次:

make installworld DESTDIR=/jails/new-base12 SRCCONF=/etc/src-jail.conf

然后,每个监狱要么提升(zfs)要么修改自定义/etc/fstab.jailnamenullfs),以便一旦完成,我就可以做一个/etc/rc.d/jails restart并最大限度地减少停机时间。

有什么最佳实践或方法可以遵循,请记住目标是尽量减少停机时间,如果可能的话,尽可能简化升级或多个监狱?

答案1

埃兹贾伊尔涵盖了您描述的用例。回答您的问题:

您如何处理滚动升级?

让我引用 FreeBSD 手册14.6.2. 初始设置

使用 installworld 填充 Jail可以使用 buildworld 在主机上创建的二进制文件安装 basejailezjail-admin 更新...执行installworld,将主机的/usr/obj安装到basejail中。

# ezjail-admin update -i -p

FWIW,为了自动化安装和配置,我维护 Ansible 角色freebsd_jail,已使用 FreeBSD 12.0 测试。

回答你的问题:

ezjail 是否使用 zfs 创建 jails basejail 和其他内容,并且还使用 nullfs 创建只读共享组件?

是的。请参阅典型的 1) zfs 文件系统列表 2) fstab 和 3) 模板的目录和链接新监狱

$ zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
zroot                 3.04G   104G    23K  /zroot
zroot/jails           3.03G   104G    63K  /local/jails
zroot/jails/basejail  1.54G   104G  1001M  /local/jails/basejail
zroot/jails/build      281M   104G   281M  /local/jails/build
zroot/jails/newjail   2.29M   104G  2.29M  /local/jails/newjail
zroot/jails/test_01    977M   104G   977M  /local/jails/test_01
zroot/jails/test_02    134M   104G   134M  /local/jails/test_02
zroot/jails/test_03    134M   104G   134M  /local/jails/test_03

$ cat /etc/fstab.test_01 
/local/jails/basejail /local/jails/test_01/basejail nullfs ro 0 0

$ ll /local/jails/newjail/
total 25
drwxr-xr-x  13 root  wheel    23 Jan 21 17:19 ./
drwx------   9 root  wheel     9 Jan 21 17:19 ../
-rw-r--r--   2 root  wheel   951 Dec  7 05:13 .cshrc
-rw-r--r--   2 root  wheel   470 Dec  7 05:13 .profile
drwxr-xr-x   2 root  wheel     2 Jan 21 17:19 basejail/
lrwxr-xr-x   1 root  wheel    13 Jan 21 17:18 bin@ -> /basejail/bin
lrwxr-xr-x   1 root  wheel    14 Jan 21 17:18 boot@ -> /basejail/boot
-r--r--r--   1 root  wheel  6177 Dec  7 05:17 COPYRIGHT
dr-xr-xr-x   2 root  wheel     2 Dec  7 05:11 dev/
drwxr-xr-x  25 root  wheel   103 Jan 21 17:19 etc/
lrwxr-xr-x   1 root  wheel    13 Jan 21 17:18 lib@ -> /basejail/lib
lrwxr-xr-x   1 root  wheel    17 Jan 21 17:18 libexec@ -> /basejail/libexec
drwxr-xr-x   2 root  wheel     2 Dec  7 05:11 media/
drwxr-xr-x   2 root  wheel     2 Dec  7 05:11 mnt/
drwxr-xr-x   2 root  wheel     2 Dec  7 05:11 net/
dr-xr-xr-x   2 root  wheel     2 Dec  7 05:11 proc/
lrwxr-xr-x   1 root  wheel    16 Jan 21 17:18 rescue@ -> /basejail/rescue
drwxr-xr-x   2 root  wheel     6 Dec  7 05:17 root/
lrwxr-xr-x   1 root  wheel    14 Jan 21 17:18 sbin@ -> /basejail/sbin
lrwxr-xr-x   1 root  wheel    11 Dec  7 05:11 sys@ -> usr/src/sys
drwxrwxrwt   2 root  wheel     2 Dec  7 05:11 tmp/
drwxr-xr-x   6 root  wheel    15 Jan 21 17:19 usr/
drwxr-xr-x  25 root  wheel    25 Jan 21 17:19 var/

相关内容