如何通过C程序知道nfs共享上的可用空间和总空间?

Posted

技术标签:

【中文标题】如何通过C程序知道nfs共享上的可用空间和总空间?【英文标题】:How to know free space and total space on nfs share through C program? 【发布时间】:2013-11-21 20:04:47 【问题描述】:

我想知道 nfs 共享上的可用空间和总空间。 我正在为此使用 ubuntu linux 计算机。 我可以通过命令做到这一点,但我需要一个 C 程序。 我查看了 libnfs.h,它包含一些我认为可以使用的函数声明:

EXTERN int nfs_stat(struct nfs_context *nfs, const char *path, struct stat *st);
EXTERN int nfs_fstat(struct nfs_context *nfs, struct nfsfh *nfsfh, struct stat *st);
EXTERN int nfs_statvfs(struct nfs_context *nfs, const char *path, struct statvfs *svfs);

但我不知道应该使用哪个以及为第一个参数传递什么(什么是上下文?)

请帮忙。 提前感谢您的帮助。


正如@remyabel 建议的那样,我写了以下内容:
#include<sys/time.h>
#include<stdio.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/statvfs.h>
#include<nfsc/libnfs.h>
#define MAX 63
int main()

  struct nfs_context *nfs = NULL;
  struct statvfs st;
  char path[MAX];
  strcpy(path,"nfs://192.168.2.73/home/sumit/music2/");

  nfs = nfs_init_context();

  int ret;
  ret = nfs_mount(nfs, "192.168.2.73", path);
  perror("Err1");
  ret = nfs_statvfs(nfs, "//", &st);

  printf("\nret=%d",ret);
  printf("\nf_bsize= %lu",st.f_bsize);
  printf("\nf_frsize= %lu",st.f_frsize);
  printf("\nf_blocks= %lu",st.f_blocks);
  printf("\nf_bfree= %lu\n",st.f_bfree);

  return 0;

现在可以了:)

【问题讨论】:

如果您正在寻找 C 答案,请不要标记为 C++。 第三个参数statvfs有你想要的信息。返回值是是否成功。 请注意 nfs_statvfs() 等。人。是libnfs 包的一部分。 libnfs 软件包可能无法在所有平台上使用或安装。一个普通的 statvfs() 调用将获得你想要的信息,而无需添加依赖项。 @BradLanam , statvfs() 在我们挂载共享之前不适用于 nfs 共享,因为需要挂载 libnfs A #include &lt;sys/time.h&gt; 应该修复该编译错误。这将是 libnfs 标头中的错误。 【参考方案1】:

还有很多,等待响应等等。几个月前,当我想编写一个 nagios 插件来检查尚未安装的文件系统上的空间时,我遇到了完全相同的问题。源代码在http://www.gbl-software.de/nagiosbinaries/check_nfs/check_nfs-src.tgz,可以随意使用和修改。这使用了来自nfsreplay 的 NFS 库,并且具有可以为 Linux、Solaris 和 AIX 编译的优势。

请注意,对于大多数 NFS 服务器,您的程序需要 suid root 才能使用保留端口 (

【讨论】:

【参考方案2】:

首先在程序的开头声明上下文:

struct nfs_context *nfs = NULL;

我们将在这里保存您想要的信息:

struct statvfs st;

然后我们初始化上下文:

nfs = nfs_init_context();

安装共享:

struct client client;
client.server = server;
client.export = path;
client.is_finished = 0;
ret = nfs_mount(nfs, client.server, client.export);

你可以像这样使用nfs_statvfs

ret = nfs_statvfs(nfs, path, &st);

nfs 是前面的上下文,path 是一些文件名或目录,st 是保存信息的结构。如果有问题,ret 包含 errno

这里是statvfs

struct statvfs 

uint32_t    f_bsize;

uint32_t    f_frsize;

uint64_t    f_blocks;

uint64_t    f_bfree; 

【讨论】:

非常感谢,如果有问题我会回来的。 我在上面添加了一个问题。 @Sumit 你包括sys/stat.h吗? 客户端存在于哪个文件结构中?

以上是关于如何通过C程序知道nfs共享上的可用空间和总空间?的主要内容,如果未能解决你的问题,请参考以下文章

NFS共享存储服务

NFS共享存储服务

linux中NFS网络文件系统共享

linux--nfs 网络文件共享

Centos7 NFS共享储存服务详解

Linux CentOS7系统NFS共享存储服务