如何获取 NFS 文件句柄?

Posted

技术标签:

【中文标题】如何获取 NFS 文件句柄?【英文标题】:How to get an NFS filehandle? 【发布时间】:2017-02-21 10:25:16 【问题描述】:

我正在尝试对数百台服务器上的数千个 NFSv3 文件服务器导出进行一些测试。从服务器上的配置到网络连接,很多事情都可能出错。我能做的最完整的测试是实际尝试将它安装在客户端上。

我可以这样做,但实际上安装所有内容超出了我的需要,占用了程序执行之外的状态和资源,并且往往会给客户端带来一点压力。我不止一次看到似乎表明客户端上的某些事情不满意并阻止安装发生的问题。 (除了客户端重新启动之外没有任何更改,安装再次工作)。

我希望编写更轻量级的代码,它可以简单地充当 NFS 客户端并查看 NFS MOUNT 调用是否成功返回了文件句柄。如果是这样,我的服务器正在运行并且我的客户端已获得授权。但是我没有找到任何简单的代码来做到这一点。

当我查看Linux Source 时,看起来至少有一些代码涉及它是一个 linux 模块,这令人困惑。

是否有一些用户空间代码通过挂载调用请求 NFS 文件句柄,我可能能够剥离这些代码? (或者有什么理由让我的想法行不通)?这都是 AUTH_SYS,所以我不需要获取 kerberos 票证或其他任何东西。

【问题讨论】:

【参考方案1】:

在不了解的情况下,根据自己对NFS/Linux文件系统的了解,稍微推测一下。

我假设您的客户端是 linux(但如果 Windows 存在 nfs 客户端,同样的逻辑也适用于 Windows)。

听起来,当您执行挂载时,您正在达到资源消耗到客户端无法再挂载任何 nfs 挂载的程度。有意义的是,当您重新启动时它会再次开始工作,并且重新启动将删除 nfs 挂载(假设您正在显式/以编程方式挂载),从而允许挂载再次发生。我敢打赌,您只是在安装 nfs 安装件,而从不卸载它们。所以我建议如下:

    安装 访问刚刚挂载的 nfs 文件系统中的文件或目录 卸载 nfs 文件系统

【讨论】:

不,为此我每次都尝试卸载,但这并不总是足以防止出现问题。这就是为什么我要编写一个轻量级 NFS 客户端。 即使您确实编写了客户端,也必须挂载 nfs 文件系统才能执行它。当然,您可能已经意识到这一点。 如果您需要做的只是获取文件句柄(我假设您的意思是文件描述符),我不确定 Windows、Linux 或任何其他 unix 变体,您只需使用 open( ) 系统调用,在文件系统中有一个称为 vnode 的对象,它指向真实或虚拟文件系统(nfs 是虚拟文件系统)。真的没有必要深入内核或使用 NFS RPC Client 来执行此操作。现在你的里程可能会随着你在windoz上的变化而变化,而ms倾向于“按照他们的方式”做事,而且通常不按照标准/规范来做,我是根据经验来谈谈的。 我不明白为什么请求文件句柄的 NFS 客户端必须对它做任何事情(例如将其交给文件系统驱动程序)。我打算在收到它后简单地丢弃它。我目前的所有工作都是 Linux。 哇,这是我评论中的一个严重错误。我不知道为什么我在前面的评论中输入了“windows”。我删了它。都是 Linux。【参考方案2】:

好吧,那么只需获取您正在运行的 nfs 版本的 rpc 协议定义文件,可能是版本 3 或 4,通过 rpcget xdr 协议编译器运行它们,您将获得可以编译的 c 客户端函数调用服务器。但是他们会执行几个系统系统调用,如果不发生这种情况,linux 就无法进行网络通信,并且它将通过 linux 内核中的 tcp/ip 堆栈(您可能会使用 udp)。您可能可以在 SUN/Oracle 网站上找到 nfs 协议定义文件,或者您可以在 linux 发行版的源代码中找到它们——您将进行应用层调用,但客户端调用 rpc 库函数,而后者又会调用进入内核的linux系统调用

【讨论】:

以上是关于如何获取 NFS 文件句柄?的主要内容,如果未能解决你的问题,请参考以下文章

两个相同的 NFS 共享,但只有一个会给出 Stale 文件句柄错误

C 库中的文件句柄泄漏(可能)会给 NFS 带来麻烦(+python,但这是偶然的)

VB中如何得到一个文件的句柄?

如何在 C# 中按进程获取打开文件句柄的列表?

如何使用 Win32 句柄在 C++ 中获取文件名? [复制]

linux如何获取磁盘的繁忙程度和打开的文件句柄数?