如何拦截存储大小查询命令
How to intercept storage size query commands
我正在使用 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);
}
我正在使用 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);
}