如何在两个 NFS 共享之间建立硬链接?

如何在两个 NFS 共享之间建立硬链接?

如果共享 NFS 目录托管在单个支持文件系统上,是否有办法从客户端跨两个或多个 NFS 挂载建立硬链接? (这样,如果本地或通过 ssh 登录,服务器的 inode 和硬链接就不会有问题。)

我有一台服务器提供多个目录作为 NFSv4 共享。所有共享目录都位于一个 [ext4] 文件系统上。它们是单独共享的,因此客户端可以单独安装它们。

在分别挂载共享 A 或 B 的目录树中,我可以创建 的硬链接bar.file。但是,如果我尝试在挂载 A 和 BI 之间创建ln或 ,则会出现错误。除了直接登录服务器之外,还有其他方法可以解决这个问题吗?cp -lInvalid cross-device link

我在想也许是一个简短的脚本,它读取源的 inode 并在目标目录中手动创建具有相同 inode 的文件条目,但这似乎有点 hacky,我需要研究所需的组件。

或者也许是某种联合安装解决方案?

假设我对两个系统都具有常规用户和 root 访问权限。

答案1

一般观察

它们是单独共享的,因此客户端可以单独安装它们。

这种推理毫无意义。如果父目录是共享的,客户端可以单独挂载子目录反正。如果父目录中存在(或可能出现)某些不想共享的内容,则可能需要单独共享目录。这可以是正当理由,也可能有其他原因。但…

提供单独安装的能力并不是单独共享的有效理由。不管怎样,NFSv4 都为客户端提供了这种能力。/etc/exports服务器上是一个访问控制列表而不是一个列表分离客户必须坚守的股票。mount在客户端上使用时,您是不限/etc/exports服务器上的确切路径。作为客户端,您可以安装/服务器并仍然可以访问所有共享(仅此而已);或者您可以挂载您允许访问的任何子目录。

尝试安装/服务器。尝试安装某些共享的某些 (((…)sub-)sub-) 子目录。我的观点是你可以。


解决方案

Invalid cross-device link您得到的结果是因为在 NFS 客户端本地,您使用的路径正式位于单独的“设备”上。解决方案是安装一个包含所有相关共享的层次结构(目录树),因此它在本地出现在一个安装点下(即作为单个“设备”)。

/在 NFS 客户端上挂载服务器的根目录 ( );或相关远程文件系统的远程挂接点;或共享的其他一些公共父目录。您安装的远程路径不必在服务器上显式导出。例子:

sudo mount -t nfs 192.168.99.7:/remote/mountpoint /local/mountpoint

在本地挂载点下,您将看到所选远程目录的内容仅限于导出的共享。例如,如果导出了远程目录/remote/mountpoint/foo/A和,并且没有导出任何内容(即使既没有导出也没有导出),那么在本地您将看到和,但看不到。您将能够到达和。/remote/mountpoint/bar/baz/B/remote/mountpoint/qux//remote/mountpoint/local/mountpointfoo/bar/qux/foo/A/bar/baz/B/

现在,通过严格在 下工作/local/mountpoint,您可以ln在目录之间进行本地操作AB并且如果它们确实位于服务器上的同一文件系统上,并且允许您写入,则操作将会成功。

答案2

大多数文件系统(包括 NFS 共享)的通常实现定义了(就像在面向对象语言中一样)您可以在已安装的文件系统内执行的一组操作(打开、读取...)。 NFS 客户端实现无法处理与其他文件系统的操作。 (从客户端的角度来看,有2个文件系统)。

理论上可能有一个专门的客户端安装 2 个 NFS 文件系统(发送 NFS 信息),获取 2 个文件句柄,然后使用它们链接 2 个文件(也发送 NFS 信息)。但如果你的操作系统没有提供它,那么这将是一个很大的痛苦,而且没有 100% 的成功机会。这可能取决于服务器的实现。

相关内容