如何正确导出和导入具有子目录作为挂载点的 NFS 共享?

mba*_*off 28 nfs mount

服务器使用选项通过 NFSA导出目录。内的子目录,是一个使用NFS服务器上的其他位置安装点的选择,像/srvnohide/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 共享?

ana*_*nik 39

crossmnt 是你的朋友。

/srv        *(rw,fsid=0,no_subtree_check,crossmnt)
Run Code Online (Sandbox Code Playgroud)


mba*_*off 11

看起来每个挂载子点都必须由 NFS 服务器导出才能对客户端可见。在上述情况下,/etc/exports文件应如下所示:

/srv        *(rw,fsid=0,nohide,no_subtree_check)
/srv/foo    *(rw,nohide,no_subtree_check)
Run Code Online (Sandbox Code Playgroud)

然后,导入/srv与选项在客户端上-t nfs将使双方/srv/srv/foo正常使用。

OP编辑

这条线

    /srv/foo    *(rw,fsid=0,nohide,no_subtree_check)
Run Code Online (Sandbox Code Playgroud)

在我的情况下工作而不是

    /srv/foo    *(rw,nohide,no_subtree_check) 
Run Code Online (Sandbox Code Playgroud)

  • 在根上crossmnt? (2认同)

小智 10

我在遵循Diskless Arch指南时偶然发现了这个问题,它真的让我慢了下来。我将在这里分享我的发现,因为我很好奇这是否适用于其他任何人。

根据无盘指南,我在环回映像中有无盘客户端的根文件系统(我需要导出的实际数据),该映像已安装在/srv/des1

/srv/des1.img on /srv/des1 type btrfs (rw,relatime,compress=lzo,discard,space_cache)
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个挂载点,/nfs/des1然后运行挂载,并确认我可以看到所有内容:

# mkdir -p /nfs/des1 
# mount --bind /srv/des1 /nfs/des1
# ls -l /nfs/des1
bin  boot  dev  usr  #[SNIP]
Run Code Online (Sandbox Code Playgroud)

参考Arch NFS指南,然后我将以下内容放入/etc/exports服务器:

/nfs/      *(rw,no_root_squash,no_subtree_check,fsid=root)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check,nohide)
Run Code Online (Sandbox Code Playgroud)

然后我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. 
Run Code Online (Sandbox Code Playgroud)

因此,在尝试了其他所有方法后,我将其交换了下来,因此/etc/exports看起来像这样:

/nfs/      *(rw,no_root_squash,no_subtree_check,fsid=root,crossmnt)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check)
Run Code Online (Sandbox Code Playgroud)

阅读手册页条目后,您会认为这与之前的代码具有相同的效果,但是当我exportfs -rav再次运行以注册更改时,然后尝试从客户端重新安装并且它起作用了!