作为一名长期的 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 数据集(我想避免这种情况)。
总结一下,几个问题。
- 为什么 FreeBSD 不允许在同一重叠网络中进行多个共享?
- 这将来是否可能会改变,因为它会阻止实现有效的用例?
- 除了使用多个 ZFS 数据集之外,还有其他解决方法吗?
也许这个问题不会带来任何令人满意的解决方案,但至少对于从 Linux 迁移到 FreeBSD 时可能遇到相同问题的其他人来说,它是可用的。
答案1
好的。所以为什么”?因为mountd
管理文件系统。虽然 NFS 客户端可以请求导向器(如果允许),但mountd
代码仅跟踪文件系统。