为什么 FreeBSD 不允许在同一重叠网络内的文件系统中存在多个 NFS 共享?

为什么 FreeBSD 不允许在同一重叠网络内的文件系统中存在多个 NFS 共享?

作为一名长期的 Linux 用户,我一直在尝试使用 FreeBSD 作为新的 NAS 服务器。

在要更换的 Linux 服务器上,我有一对 NFS 挂载,第一个是读写的,第二个是只读的。共享文件夹的物理位置位于同一 RAID 文件系统上。

这种方法的想法是通过 rw 共享暂存新文件,然后管理员随后将暂存的文件移动到 ro 共享,以供将来访问并且没有删除的风险。

在 Linux 上(/dev/md0 安装在 /data/shares 上),/etc/exports 文件类似于:

/data/shares/rw 192.168.1.0/24(rw)
/data/shares/ro 192.168.1.0/24(ro)

设置 FreeBSD 时,我在 /data 创建了一个根 ZFS raidz2 池:

zpool create data raidz2 /dev/ada0 /dev/ada1 /dev/ada2 /dev/ada3 /dev/ada4

然后是 /data/shares 中的共享数据集:

zfs create data/shares

然后,我使用 FreeBSD 语法为共享创建了一个类似的 /etc/exports 文件:

/data/shares/rw -network=192.168.1.0/24
/data/shares/ro -ro -network=192.168.1.0/24

然而,这只会导致单个 rw 共享和 /var/log/messages 中的错误消息:

mountd[63092]: can't change attributes for /data/shares/ro: netcred already exists for given addr/mask
mountd[63092]: bad exports list line '/data/shares/ro -ro -network'

进一步的研究表明,FreeBSD NFS 文档有以下内容。

每个文件系统只能指定一次客户端。例如,如果 /usr 是单个文件系统,则这些条目将无效,因为这两个条目指定相同的主机:

# Invalid when /usr is one file system
/usr/src   client
/usr/ports client

这种情况的正确格式是使用一个条目:

/usr/src /usr/ports  client

然而,此语法不起作用,因为两个条目将具有相同的配置,即两者都是读写的或两者都是只读的。

由此看来:

  • Linux NFS 在每个客户端主机的共享级别进行配置;
  • FreeBSD NFS 在每个客户端主机的整个文件系统上进行配置。

这似乎正在走向死胡同。实现此用例的唯一方法是通过不同的 ZFS 数据集(我想避免这种情况)。

总结一下,几个问题。

  1. 为什么 FreeBSD 不允许在同一重叠网络中进行多个共享?
  2. 这将来是否可能会改变,因为它会阻止实现有效的用例?
  3. 除了使用多个 ZFS 数据集之外,还有其他解决方法吗?

也许这个问题不会带来任何令人满意的解决方案,但至少对于从 Linux 迁移到 FreeBSD 时可能遇到相同问题的其他人来说,它是可用的。

答案1

好的。所以为什么”?因为mountd管理文件系统。虽然 NFS 客户端可以请求导向器(如果允许),但mountd代码仅跟踪文件系统。

相关内容