linux 服务器之查看磁盘使用情况

本文详细介绍了Linux系统调用statfs的使用,包括其参数和返回的statfs结构体成员的含义。特别指出f_bfree和f_bavail的区别,并展示了Zabbix源码中如何利用statfs获取文件系统信息,计算磁盘空间的使用情况。同时,文章还提到了df命令在Linux下验证磁盘使用情况的方法。
摘要由CSDN通过智能技术生成

使用接口statfs

函数接口:

int statfs(const charpath, struct statfsbuf);
 参数:
  path: 位于需要查询信息的文件系统的文件路径
  buf: statfs结构体类型的指针变量,用于存储文件系统的相关信息

 statfs 结构体:

struct statfs{
    long f_type;     //文件系统的类型
    long f_bsize;   //经优化后的传输块的大小
    long f_blocks;  //文件系统数据块总数
    long f_bfree;    //可用块数
    long f_bavail;   //普通用户能够获得的块数
    long f_files;      //文件结点总数
    long f_ffree;     //可用文件结点数
    fisd_t f_fsid;     //文件系统标识
    long f_namelen;  //文件名的最大长度
}
 

Tips:

f_bfree VS f_bavail 区别:

f_bfree  是 硬盘所有剩余空间

f_bavail 是 非root用户剩余空间, 一般ext3文件系统会给root留5%的独享空间

zabbix 源码:


static int	get_fs_size_stat(const char *fs, zbx_uint64_t *total, zbx_uint64_t *free,
		zbx_uint64_t *used, double *pfree, double *pused, char **error)
{
#ifdef HAVE_SYS_STATVFS_H
#	define ZBX_STATFS	statvfs
#	define ZBX_BSIZE	f_frsize
#else
#	define ZBX_STATFS	statfs
#	define ZBX_BSIZE	f_bsize
#endif
	struct ZBX_STATFS	s;

	if (NULL == fs || '\0' == *fs)
	{
		*error = zbx_strdup(NULL, "Filesystem name cannot be empty.");
		zabbix_log(LOG_LEVEL_DEBUG,"%s failed with error: %s",__func__, *error);
		return SYSINFO_RET_FAIL;
	}

	if (0 != ZBX_STATFS(fs, &s))
	{
		*error = zbx_dsprintf(NULL, "Cannot obtain filesystem information: %s", zbx_strerror(errno));
		zabbix_log(LOG_LEVEL_DEBUG,"%s failed with error: %s",__func__, *error);
		return SYSINFO_RET_FAIL;
	}

	/* Available space could be negative (top bit set) if we hit disk space */
	/* reserved for non-privileged users. Treat it as 0.                    */
	if (0 != ZBX_IS_TOP_BIT_SET(s.f_bavail))
		s.f_bavail = 0;

    //磁盘整体空间字节数, f_blocks * f_bsize
	if (NULL != total)
		*total = (zbx_uint64_t)s.f_blocks * s.ZBX_BSIZE;

    // 用户级空闲空间的大小, f_bavail * f_bsize
	if (NULL != free)
		*free = (zbx_uint64_t)s.f_bavail * s.ZBX_BSIZE;

    //已使用空间大小: (f_blocks - f_bfree)* f_bsize
	if (NULL != used)
		*used = (zbx_uint64_t)(s.f_blocks - s.f_bfree) * s.ZBX_BSIZE;

    //可用百分比
	if (NULL != pfree)
	{
		if (0 != s.f_blocks - s.f_bfree + s.f_bavail)
			*pfree = (double)(100.0 * s.f_bavail) / (s.f_blocks - s.f_bfree + s.f_bavail);
		else
			*pfree = 0;
	}

    //已用百分比
	if (NULL != pused)
	{
		if (0 != s.f_blocks - s.f_bfree + s.f_bavail)
			*pused = 100.0 - (double)(100.0 * s.f_bavail) / (s.f_blocks - s.f_bfree + s.f_bavail);
		else
			*pused = 0;
	}

	return SYSINFO_RET_OK;
}

Linux平台下使用 df -h / 验证磁盘实际使用情况

需要注意的是, df 命令获得的是整数百分比,没有小数,使用的是进一法,而不是四舍五入法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值