【问题标题】:How to intercept storage size query commands如何拦截存储大小查询命令
【发布时间】:2021-05-21 04:32:13
【问题描述】:

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

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

【问题讨论】:

  • 文件系统驱动程序不直接参与运行命令。它用于访问包含程序的文件,但无法区分运行程序和出于其他目的读取它。
  • 所以这是不可能的?
  • 所以如果你试图在驱动中拦截它,你也会拦截wc -c /usr/bin/du之类的东西
  • 你不应该只实现程序内部使用的文件系统操作吗?例如。 stat()statfs()?
  • 调用 strace du <fuse mount>strace df <fuse mount> 给了我一些 statstatfs 调用,所以你应该在你的代码中拦截这些。不知道 df/statfs 但关于 du 没有办法破解它 - 该程序只是遍历文件并调用 stat.你只能为它准备一个快速缓存。

标签: c fuse libfuse


【解决方案1】:

对于 df,您可以实现 statfs() 操作,如下所示:

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

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

        return rv; 
}

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

现在对于 duma​​n 说:“总结每个 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);
}

【讨论】:

    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2011-06-06
    • 2010-10-20
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多