如何解决如何拦截存储大小查询命令
我正在开发一个使用 libfuse
的文件系统,需要找到一种方法来拦截对存储大小查询的调用,即 du
和 df
。
但我一直无法确定如何做到这一点,也无法找到展示这一点的示例。
查看我的文件系统的调试输出,也没有提供太多信息,因为我不确定应该拦截哪个调用。
解决方法
对于 df,您可以实现 statfs() 操作,如下所示:
static int do_statfs(const char *path,struct statvfs *st)
{
int rv;
rv = statvfs("/",st);
st->f_bavail = 15717083;
return rv;
}
在上面的示例中,为了简化,我查询了根文件系统,而不是修改可用的块,但是您可以(并且应该)感受到完整的 statvfs 结构以及有关您的文件系统的信息。
现在对于 du,man 说:“总结每个 FILE 的磁盘使用情况,递归地用于目录",所以每个文件都会被查询。为此,您需要实现 stat() 操作。
static int do_getattr(const char *path,struct stat *st)
{
st->st_uid = getuid();
st->st_gid = getgid();
st->st_atime = time(NULL);
st->st_mtime = time(NULL);
// fill the rest of the stat structure
return 0;
}
一旦实现,你必须添加它们做 fuse_operations 结构:
static struct fuse_operations operations = {
.open = do_open,.getattr = do_getattr,.readdir = do_readdir,.read = do_read,.statfs = do_statfs,.release = do_release,};
并将其作为参数传递给 fuse_main()
int main(int argc,char *argv[])
{
return fuse_main(argc,argv,&operations,NULL);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。