.. _share_folder_between_jails:
=============================
在多个Jail间共享文件目录
=============================
我在部署 :ref:`linux_jail` 时想到 :ref:`debootstrap` 部分能否像 :ref:`thin_jail` 中使用 zfs 卷的clone模式共享,这样多个Linux Jail实际上只需要使用一份数据就可以。
实际上在FreeBSD中,对于Jail中使用Host上目录,采用了一种名为 ``nullfs`` 的回环文件系统。在部署 :ref:`linux_jail` 时已经使用,也就是将host主机的 ``/tmp`` 和 ``/home`` 目录挂载到 Linux Jail中: 这样就可以在Jail中使用X11
.. literalinclude:: linux_jail_archive/d2l.conf
   :caption: Linux Jail ``/etc/jail.conf.d/d2l.conf`` 配置了host目录通过nullfs挂载到Jail
   :emphasize-lines: 11,12
但是,我发现一个问题,查看 ``/home`` 目录目录下,只有两个空目录 ``/home/huatai`` 和 ``/home/admin`` ,并没有像我预期中的将物理Host主机的 ``/home/admin`` 内容展示出来。而同样的  ``/tmp`` 目录确实和host主机完全一致。
.. note::
   参考 `Files and folders not visible when mounted will nullfs `_ 似乎ZFS有自己的 ``jail`` 子命令,可以将整个zfs dataset委托给jail处理。
   具体我需要再学习一下ZFS手册
注意到 ``/tmp`` 和 ``/home`` 同为 zfs dataset ,但是通过 ``nullfs`` 映射到jail中表现同步,所以怀疑是zfs配置不同,例如前面提到的 zfs jail委托
.. literalinclude:: share_folder_between_jails/sdiff_zfs_home_tmp
   :caption: 通过 ``zfs get all`` 获取 ``/home`` 和 ``/tmp`` 的属性进行对比
对比发现主要的差异是 ``zroot/home`` 设置了 ``setuid=on`` ,而 ``zroot/tmp`` 设置了 ``setuid=off``
在 `ZFS and Jail :: nullfs mount :: nothing visible from `_ 有一些讨论值得关注:
- 如果想要在jail中管理ZFS dataset,需要使用 ``zfs set jailed=on`` 属性,但是这个zfs dataset不能挂载为 ``nullfs`` ,而是直接提供给jail: 我已经在 :ref:`zfs-jail` 中完成实践
- 如果在host主机上管理ZFS dataset(常规方式),那么就可以像 :ref:`vnet_thin_jail` 一样,使用NullFS实现将host主机的ZFS挂载目录bind到jail内部。这种方式不仅简单(只需要配置thin jail的fstab),而且可以在多个jail上共享host主机提供的ZFS dataset
实践
======
- 首先完成 :ref:`vnet_thin_jail` 部署,其中配置NullFS Thin jail的NullFS挂载使用了一个 ``/zdata/jails/${name}-nullfs-base.fstab`` 配置文件
- 在host主机上创建数据集 ``zdata/docs`` :
.. literalinclude:: share_folder_between_jails/zfs_create
   :caption: 创建ZFS数据集
这个数据集就是用于不同jail共享的host主机ZFS
- 修改 ``/zdata/jails/${name}-nullfs-base.fstab`` (host主机上 ``/etc/jail.conf`` 配置为每个jail指定了一个挂载文件系统配置)。以 ``dev`` jail为例,对应的配置文件就是 ``/zdata/jails/dev-nullfs-base.fstab`` :
.. literalinclude:: share_folder_between_jails/fstab
   :caption: 修改 ``dev`` jail对应的fstab配置文件 ``/zdata/jails/dev-nullfs-base.fstab``
   :emphasize-lines: 3
- 为jail的skeleton目录下创建一个挂载目录:
.. literalinclude:: share_folder_between_jails/mkdir
   :caption: 创建挂载目录
- 重新启动 ``dev`` jail,就可以看到NullFS将host主机上的 ``/zdata/docs`` 挂载到jail中,所以在 ``dev`` jail 中执行 ``df -h`` 会看到:
.. literalinclude:: share_folder_between_jails/df
   :caption: 在 ``dev`` jail 中查看 ``df -h``
   :emphasize-lines: 4
参考
=======
- `A sharing folder between jails on ezjail `_
- `Host Jail shared Zfs Dataset `_ 实际上也是通过nullfs来共享ZFS卷
- `Jail BastilleBSD : mount a dataset of host ? `_
- `Sharing Ports Directory with Jails `_
- `Multiple FreeBSD Jails with nullfs `_