我有一个自己编写的 FUSE 文件系统,挂载在我的 NFS 服务器上的 mountpoint 上/export/example/mount
。然后我通过 NFS 导出 FUSE 的父目录。其中/etc/exports
包含选项nohide,crossmnt,subtree_check,ro,no_root_squash
并允许所有人免费访问:
/export/example *(nohide,crossmnt,subtree_check,ro,no_root_squash)
我可以在 NFS 客户端上安装此导出并访问它。一旦我访问 NFS 中的 FUSE,我的客户端就会挂起,直到我访问umount
NFS(并且我需要使用选项-f
来完成此操作)。
我尝试以我的工作用户和 root 身份安装 FUSE。结果是一样的。
服务器运行的是 Ubuntu 12.04,客户端运行的是 SuSE 9.3。 FUSE 是用 Python 编写的,可以在本地运行,没有任何问题。仅通过 NFS 导出失败。我没有安全限制,因为所有这些都位于只有受信任用户的专用网络上。
有谁知道什么可能会导致我的麻烦或(甚至更好)如何解决问题?
我曾考虑过用 SSHFS 替换 NFS 来解决该问题,但这不起作用,因为客户端系统太旧而无法支持 SSHFS(因为它基于 FUSE,并且不支持 FUSE)。
答案1
大多数 Linux 发行版附带的内核不允许使用 NFSv2 或 NFSv3 导出 FUSE 安装的文件系统。您的选择是: 1. 在内核空间中实现您的文件系统。 2. 在 NFSv4 中导出它,这需要 fsid=
我自己使用2。在下图中,以 开头的命令#
在服务器上运行,以 开头的命令$
在客户端上运行。
这是我的服务器配置,您可以看到我正在导出 FUSE 安装点:
# mount | tail -n1
convmvfs on /mnt/gb2312 type fuse.convmvfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0)
# grep gb2312 /etc/exports
/mnt/gb2312 192.168.0.0/16(no_subtree_check,fsid=0)
这是我对我的客户所做的:
$ sudo mount -t nfs4 server:/ /mnt/
$ ls /mnt
Downloads IMAGES Library lost+found
要验证您的失败是否是由在 NFS v2/v3 中导出熔丝引起的,请专门导出该挂载点而不使用 NFS v4 (fsid),然后查看是否出现错误:
# exportfs -a
exportfs: /mnt/gb2312 requires fsid= for NFS export
如果在服务器上导出挂载点 umounted,并稍后使用熔断器挂载它,如果您尝试使用 nfs 客户端,您应该在日志中看到:
# tail /var/log/syslog
Aug 18 03:54:31 server rpc.mountd[17183]: Cannot export /mnt/gb2312, possibly unsupported filesystem or fsid= required
Aug 18 04:00:52 server rpc.mountd[17183]: Caught signal 15, un-registering and exiting.
答案2
默认情况下,通过 nfs 导出子安装处于关闭状态。建议的操作过程是同时导出子安装并让客户端安装它。