为什么NFS不允许我挂载共享?

主机

我有一个运行Ubuntu 12.04的主机,位于10.0.0.202。它为网络上的其他机器提供NFS共享。以下是/etc/exports的内容:

/media/storagedrive 10.0.0.0/24(rw,sync,no_subtree_check)

这里的目的是将/media/storagedrive的内容共享给网络中IP范围为10.0.0.0 - 10.0.0.255的其他机器。

工作客户端

这在客户端机器10.0.0.40上正常工作,运行的是Ubuntu 13.10,被称为MattDev。该机器的/etc/fstab文件如下:

UUID=8f8c838e-3ea2-457a-87f0-57b12dfab06c /               ext4    errors=remount-ro 0       1
UUID=427089d4-46a2-432d-9df4-7016bdfc7df2 none            swap    sw              0       0
10.0.0.202:/media/storagedrive /mnt/NetworkStorageDrive nfs rsize=8192,wsize=8192,timeo=14,intr

而且在那台机器上,ls -al /mnt/ 看起来像这样:

total 12K
drwxr-xr-x  3 root root    4.0K Feb  4 17:48 .
drwxr-xr-x 23 root root    4.0K Feb  5 08:44 ..
drwxrwxr-x  7 root plugdev 4.0K Feb  5 11:43 NetworkStorageDrive
id 的输出如下所示:
uid=1000(matt) gid=1000(matt) groups=1000(matt),4(adm),24(cdrom),27(sudo),30(dip),33(www-data),46(plugdev),112(lpadmin),124(sambashare)

虚拟客户端未工作

我有第二个客户机器,运行Ubuntu 12.10,作为Windows 7主机机器上的一个客户机操作系统。主机机器在网络上为10.0.0.28。客户机正在被Vagrant管理,使用VirtualBox 4.3.6作为提供者。我将称Windows 7主机为AlexDevHost,Ubuntu客户机为AlexDevGuest。

在AlexDevGuest上运行showmount -e 10.0.0.202会产生:

Export list for 10.0.0.202:
/media/storagedrive 10.0.0.0/24

然而,当我尝试挂载共享时,失败了。
$ sudo mount 10.0.0.202:/media/storagedrive /mnt/NetworkStorageDrive
mount.nfs: access denied by server while mounting 10.0.0.202:/media/storagedrive

于是我开始寻找问题:

$ ls -alh /mnt/
total 12K
drwxr-xr-x  3 root root 4.0K Feb  5 12:23 .
drwxr-xr-x 26 root root 4.0K Feb  5 12:23 ..
drwxr-xr-x  2 root root 4.0K Feb  5 12:23 NetworkStorageDrive
$ id
uid=1001(vagrant) gid=1001(vagrant) groups=1001(vagrant)
$

那个 uid 和 gid 与 MattDev 上的用户 matt 不同。所以我调整了 vagrant 的 uid,因为我读到 NFS 访问是通过匹配 IP 地址和 uid 来控制的。现在是这样的:
$ id
uid=1000(vagrant) gid=1001(vagrant) groups=1001(vagrant)
$ sudo mount 10.0.0.202:/media/storagedrive /mnt/NetworkStorageDrive
mount.nfs: access denied by server while mounting 10.0.0.202:/media/storagedrive
$

仍然没有成功。所以现在我已经没有想法了。

  1. 我做错了什么?
  2. 如果UID部分是正确的,有没有办法我可以验证NFS服务器机器是否将我的访问尝试视为来自10.0.0.28,而不是其他不在允许范围内的IP地址?
1个回答

好的,我解决了(或者至少,我让它工作起来了,并且我认为我知道是什么原因导致的)。
我在NFS服务器的`/etc/exports`行中添加了`insecure`标志,现在它看起来像这样:
/media/storagedrive 10.0.0.0/24(rw,sync,no_subtree_check,insecure)

这个标志允许连接从客户端端口号大于IPPORT_RESERVED(1024)的地方发起。
现在mount命令可以正常工作了。
我猜没有使用"insecure"标志导致问题的原因可能是VirtualBox使用NAT将请求传递到物理网络,所以虽然Ubuntu客户机(AlexDevGuest)上的端口可能低于1024,但Windows 7主机(AlexDevHost)上的转换后的端口可能高于1024,因此被阻止。设置"insecure"标志意味着允许通过。
这个问题显然不会影响非虚拟机的DevMatt。

这真是一项出色的侦探工作。我经常使用VirtualBox虚拟机来创建Ubuntu的“沙盒”环境,以便在测试时可以随意丢弃或进行试验,而不必使用生产级服务器甚至是暂存的开发服务器,这对我帮助很大。 - Giacomo1968
想要无限循环地感谢你,我已经寻找了很久,而你给予了帮助。不知道为什么他们会设置这样的限制,为什么不能让连接从任意端口号进入,端口号会对什么产生影响呢?无论如何,非常感谢你。 - mSatyam
@mSatyam 这是因为你必须以root身份才能绑定到1024以下的端口,而且预计NFS相关的服务默认情况下会以root身份运行。我之前进行的端口转发是一个“特殊情况”。 - Alex
2但是我该如何说服VirtualBox的网络使用低于1024的端口呢? - Mikhail T.
非常感谢你。 - BJ5
挂载成功,但无法看到文件。 - BJ5
@MikhailT。我无法控制NFS服务器,所以我需要一个不同的答案。 - Nemo