我有一台运行 Rocky 8 的存储服务器和多个使用 Rocky 8、CentOS 7 和 Debian 10/11 的客户端,它们通过 NFS 连接,为不同的文件系统提供不同的导出。其中一个文件系统是 ZFS,另一个不是。这在 NFSv3 上工作正常,因为我可以将要导出的各种目录放在 /etc/exports 中,这里是 /etc/exports。
/hpc/projects 10.0.20.100/32(rw,crossmnt,async,no_root_squash,no_subtree_check) 10.33.4.0/22(rw,crossmnt,nohide,async,no_root_squash,no_subtree_check) 10.34.4.0/22(rw,crossmnt,nohide,async,no_root_squash,no_subtree_check)
/hpc/projects/subdir1 10.0.20.101/32(rw,crossmnt,async,no_root_squash,no_subtree_check)
/hpc/projects/subdir2 10.0.20.102/32(rw,crossmnt,async,no_root_squash,no_subtree_check)
/hpc/projects/subdir3 10.0.20.103/32(rw,crossmnt,async,no_root_squash,no_subtree_check)
/scratch 10.33.4.0/22(rw,async,no_root_squash,no_subtree_check) 10.34.4.0/22(rw,async,no_root_squash,no_subtree_check)
但是使用 NFSv4,CentOS 7 客户端无法连接。到目前为止,我已尝试将 ZFS 挂载点 /hpc 和单独的目录 /export 都设置为根文件系统。尝试从 CentOS 客户端 IP 10.34.4.50 将它们挂载为 NFSv4 时,两者都失败,但可以作为 NFSv3 运行。以下是 NFSv4 的 /etc/exports,其中 ZFS 挂载为 NFS 根目录。
/hpc *(fsid=0,ro,insecure)
/hpc/projects 10.0.20.100/32(rw,crossmnt,async,no_root_squash,no_subtree_check,insecure) 10.33.4.0/22(rw,crossmnt,nohide,async,no_root_squash,no_subtree_check,insecure) 10.34.4.0/22(rw,crossmnt,nohide,async,no_root_squash,no_subtree_check,insecure)
/hpc/projects/subdir1 10.0.20.101/32(rw,crossmnt,async,no_root_squash,no_subtree_check,insecure)
/hpc/projects/subdir2 10.0.20.102/32(rw,crossmnt,async,no_root_squash,no_subtree_check,insecure)
/hpc/projects/subdir3 10.0.20.103/32(rw,crossmnt,async,no_root_squash,no_subtree_check,insecure)
/scratch 10.33.4.0/22(rw,async,no_root_squash,no_subtree_check) 10.34.4.0/22(rw,async,no_root_squash,no_subtree_check)
当通过 NFSv4 挂载时mount -vvv -t nfs4 10.34.4.100:/ mnt
,我得到了mount.nfs4: access denied by server while mounting 10.34.4.100:/
。但是当我尝试mount -vvv -t nfs4 10.34.4.100:/hpc mnt
挂载完成时,只是没有使用 NFSv4。运行mount
显示以下内容:10.34.4.100:/hpc on /mnt type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.34.4.100,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=10.34.4.108)
我看到 vers=3 和 mountvers=3 让我相信这是在使用 NFSv3,而不是我告诉它的 NFSv4。我确实检查了服务器 /var/log/messages 并在尝试使用 NFSv4 挂载时发现了这些行(列出的 IP 是客户端 IP 之一)。
Mar 30 10:56:12 servername rpc.mountd[14813]: refused mount request from 10.34.4.1 for / (/): not exported
Mar 30 10:56:15 servername rpc.mountd[14813]: refused mount request from 10.34.4.1 for /hpc (/): not exported
请注意,/scratch 导出与 /etc/exports 中的 NFSv4 指令配合使用效果很好。此外,所有其他客户端(Rocky 8 和 Debian)都可通过 NFSv4 顺利挂载。
我希望有人能告诉我发生了什么。我要指出的是,服务器和 CentOS 客户端上的 SELinux 被禁用,并且为了进行此测试,服务器上没有运行防火墙。
答案1
不指定fsid=0
/hpc。这样做会将目录变为 NFSv4 的“导出根”,这意味着您的/hpc/projects
目录将被导出为,server:/projects
而不是保留其原始路径。
虽然 NFSv4允许您需要创建虚拟导出根,但实际上并不需要这样做 – 如果/
您未定义虚拟导出根,Linux 内核 NFS 服务器将自动生成虚拟 fsid=0 根。因此,只要您不包含任何fsid=0
条目,共享就可以通过 NFSv3 和 NFSv4 使用完全相同的路径进行挂载。