有多种方法和工具来创建 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.jailname
(nullfs
),以便一旦完成,我就可以做一个/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/