![如何正确导出和导入也将子目录作为挂载点的 NFS 共享?](https://linux22.com/image/23642/%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E5%AF%BC%E5%87%BA%E5%92%8C%E5%AF%BC%E5%85%A5%E4%B9%9F%E5%B0%86%E5%AD%90%E7%9B%AE%E5%BD%95%E4%BD%9C%E4%B8%BA%E6%8C%82%E8%BD%BD%E7%82%B9%E7%9A%84%20NFS%20%E5%85%B1%E4%BA%AB%EF%BC%9F.png)
服务器通过 NFS 使用选项A
导出目录。, ,中的子目录是 NFS 服务器上另一个位置的安装点,使用选项,例如/srv
nohide
/srv
/srv/foo
--bind
server# mount --bind /bar/foo/ /srv/foo/
客户端使用 NFSB
导入A:/srv
并安装它/mnt/srv
。的内容/mnt/srv
是 的内容A:/srv
。
问题是它/mnt/srv/foo
是空的,而我期待看到A:/bar/foo/
那里的内容。
如何正确导出和导入也将子目录作为挂载点的 NFS 共享?
答案1
crossmnt
是你的朋友。
/srv *(rw,fsid=0,no_subtree_check,crossmnt)
答案2
我在关注时偶然发现了这个问题无盘拱门指南,这确实减慢了我的速度。我将在这里分享我的发现,因为我很好奇这是否对其他人有用。
根据无盘指南,我在环回映像中拥有无盘客户端的根文件系统(我需要导出的实际数据),该映像已安装在/srv/des1
:
/srv/des1.img on /srv/des1 type btrfs (rw,relatime,compress=lzo,discard,space_cache)
然后我创建了一个挂载点,/nfs/des1
然后运行挂载,并确认我可以看到一切:
# mkdir -p /nfs/des1
# mount --bind /srv/des1 /nfs/des1
# ls -l /nfs/des1
bin boot dev usr #[SNIP]
参考架构 NFS指南,然后我将以下内容放在/etc/exports
服务器上:
/nfs/ *(rw,no_root_squash,no_subtree_check,fsid=root)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check,nohide)
exportfs -rav
然后我在服务器上运行以应用这些更改。
mount server:/des1 /mnt/tmp
然而,当我期望无盘根文件系统在那里时,我随后在测试客户端上安装了共享:却发现它是一个空目录。
在这个阶段,我尝试了几乎所有的方法,直到有东西引导我在exports
手册页中看到这个选项:
crossmnt
This option is similar to nohide but it makes it possible for clients
to move from the filesystem marked with crossmnt to exported filesystems
mounted on it. Thus when a child filesystem "B" is mounted on a parent "A",
setting crossmnt on "A" has the same effect as setting "nohide" on B.
因此,在尝试了其他所有方法后,我将其交换了,所以我的/etc/exports
看起来像这样:
/nfs/ *(rw,no_root_squash,no_subtree_check,fsid=root,crossmnt)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check)
阅读完手册页条目后,您可能会认为这与之前的代码具有相同的效果,但是当我exportfs -rav
再次运行以注册更改,然后尝试从客户端重新安装时,它起作用了!
答案3
看起来每个挂载子点都必须由 NFS 服务器导出才能对客户端可见。在上述情况下,/etc/exports
文件应如下所示:
/srv *(rw,fsid=0,nohide,no_subtree_check)
/srv/foo *(rw,nohide,no_subtree_check)
然后,/srv
通过选项在客户端上导入-t nfs
将使/srv
和/srv/foo
正确可用。
由OP编辑
这条线
/srv/foo *(rw,fsid=0,nohide,no_subtree_check)
在我的情况下有效而不是
/srv/foo *(rw,nohide,no_subtree_check)
答案4
笔记:仅启用单个用户
它添加的是对服务器端和客户端的一组编辑。在服务器端/etc/exports
和/etc/fstab
客户端。
服务器端
- Linux Mint 18.3 西尔维亚 32 位
- 内核 Linux 4.4.0-138-通用 i686
华硕EEPC
$ cat /etc/exports #insert shares (one for each mounted partition sub-folder): /nfsshare/ /192.168.1.155(rw,no_root_squash,no_subtree_check,fsid=root,crossmnt) /nfsshare/media/ 192.168.1.155(rw,no_root_squash,no_subtree_check) /nfsshare/extra/ /192.168.1.155(rw,no_root_squash,no_subtree_check) $ cat /etc/fstab #shared media files on /media/ed/ /media/ed/ /nfsshare/ nfs bind 0 0 /media/ed/media/ /nfsshare/media/ nfs bind 0 0 /media/ed//extra /nfsshare/extra/ nfs bind 0 0
客户端
- Linux Mint 19 塔拉 64 位
内核 Linux 4.15.0-38-通用 x86_64
$ cat /etc/fstab #NFS Shares line added 192.168.1.158:/nfsshare /mnt/share nfs rw,soft,intr,noatime,x-gvfs-show