如何通过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 <sys/time.h>
应该修复该编译错误。这将是 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共享上的可用空间和总空间?的主要内容,如果未能解决你的问题,请参考以下文章