Freebsd

如何更新和維護多個監獄(ZFS 和 nullfs 框架)

  • February 13, 2019

有多種創建監獄的方法和工具,現在磁碟空間變得越來越便宜,創建一個完整的監獄(已經編譯了一個世界)只是幾秒鐘的事情:

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並最大限度地減少停機時間。

要遵循的任何最佳實踐或方法,請記住目標是最大程度地減少停機時間,並儘可能簡化升級或多個監獄?

ezjail涵蓋了您描述的案例。要回答您的問題:

您如何處理滾動升級?

讓我引用 FreeBSD 手冊14.6.2。初始設置

使用 installworld 填充監獄basejail 可以從 buildworld 在主機上創建的二進製文件中安裝,使用ezjail-admin update … installworld 被執行,將主機的 /usr/obj 安裝到 basejail 中。

# ezjail-admin update -i -p

FWIW,為了自動化安裝和配置,我維護 Ansible 角色freebsd_jail,使用 FreeBSD 12.0 進行了測試。

要回答您的問題:

ezjail 是否使用 zfs 來創建監獄 basejail 和其他人,並且還使用 nullfs 來創建只讀共享組件?

是的,它確實。請參閱典型的 1) zfs 文件系統列表 2) fstab 和 3) 模板newjail的目錄和連結。

$ 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/

引用自:https://serverfault.com/questions/953596