如何拦截存储大小查询命令

How to intercept storage size query commands

我正在使用 libfuse 开发一个文件系统,需要找到一种方法来拦截对存储大小查询的调用,即 dudf。 但我一直无法确定如何做到这一点,也无法找到展示这一点的示例。

查看我的文件系统的调试输出,也没有提供太多信息,因为我不确定应该拦截哪个调用。

对于 df 你可以实现 statfs() 操作,像这样:

static int do_statfs(const char *path, struct statvfs *st)
{
        int rv; 

        rv = statvfs("/", st);
        st->f_bavail = 15717083;

        return rv; 
}

在上面的示例中,为了简化,我查询了根文件系统,而不是修改可用的块,但是您可以(并且应该)感受到完整的 statvfs 结构以及有关您的文件系统的信息。

现在对于 duman 说:“总结每个磁盘的使用情况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);
}