如何判断两个NFS挂载点是否在同一个远程文件系统中?

3

我的基于Linux的系统显示NFS挂载文件系统的统计信息,类似于这样:

   Remote Path              Mounted-on  Stats
   server1:/some/path/name  /path1      100 GB free
   server2:/other/path/name /path2      100 GB free
   Total:                               200 GB free

这很好用。问题在于,当NFS服务器上的相同文件系统在客户端上挂载两次时出现问题:

   Remote Path              Mounted-on  Stats
   server1:/some/path/name  /path1      100 GB free
   server1:/some/path/name2 /path2      100 GB free
   Total:                               200 GB free
server1/some/path/name/some/path/name2实际上在同一个文件系统上,该文件系统有100 GB的可用空间,但我错误地将它们加起来并报告了200 GB的可用空间。

有没有办法检测它们是否在同一个分区中?

不起作用的方法:

  • “使用statfs()”:statfs()返回一个struct statfs,其中有一个“文件系统ID”字段f_fsid。不幸的是,它未定义并且在NFS上被清零。
  • “不要多次挂载同一部分。”这超出了我的控制范围。
  • “基于可用空间的启发式方法。”该方法必须明确地起作用。此外,statfs()会缓存其输出,因此在面对大量数据移动时很难正确地实现。

如果没有解决方案,我将不得不在服务器端的每个潜在挂载点生成配置文件,但如果有一些干净的方法可以避免这种情况,那将会更好。

谢谢!


根据您的示例数据,您可以使用“sort -u”(唯一)“+0.0 -0.N”(按第一个N个字符)对远程路径进行排序,或者假设server1:中的“:”是您的“字段分隔符”,则使用“sort -t”:“-u +0 -1”。 - shellter
2个回答

0

我猜如果 "stat -c %d /mountpoint" 做你想要的事情(我现在无法测试),对吗?


0

你可能想要读取远程系统的共享文件系统 - 使用:

showmount -e server

这将给您提供正在共享的真实路径。当从远程系统挂载时,将它们修剪到来自远程系统的公共根,并使用它来确定挂载点是否来自相同的底层文件系统。

如果文件系统是从相同的底层文件系统分别共享的,则此方法无法帮助您。

您可以添加一个启发式算法,检查整个文件系统的大小和可用空间,并假设如果它们相同,并且来自相同的远程服务器,则它们在映射到挂载设备的最短公共路径的同一分区上。

如果您共享来自外观与其他文件系统完全不同的环回挂载文件系统,则上述方法都无法帮助您。

如果服务器可以用不同的名称和地址访问,则此方法对您没有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接