如何通过C程序了解nfs共享的可用空间和总空间?

时间:2013-11-21 20:04:48

标签: c linux struct nfs

我想知道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;
}

现在有效:)

2 个答案:

答案 0 :(得分:2)

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

请注意,对于大多数NFS服务器,您的程序需要是suid root才能使用保留端口(&lt; 1024),因为出于安全原因,NFS服务器不会与任何端口通信。

答案 1 :(得分:1)

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

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;