存储课程学习笔记7_fuse库的简单使用(fuse,opencv的demo)

fuse一般称为用户态度文件系统,可以实现在用户层实现对文件系统的控制。

通过fuse内核模块的支持,基于libfuse提供的接口,就可以实现一个文件系统。

fuse内核模块实现了与VFS的对接,运行后可以看到/dev/fuse,拦截相关请求,反馈给fuse进程,进行操作。

使用fuse进行开发,不用关注内核模块,直接使用libfuse库在用户态实现文件系统即可。

0:总结

1:fuse的开发,实际上和前面借助内核插入文件系统大框架感觉差不多,都是实现文件系统基础指令对应的函数。

2:借助opencv实现给图片加水印,opencv的编译以及简单测试。

3:简单了解fuse库下的example下demo,以及简单验证demo。

4:fuse的扩展功能可以根据业务自行扩展,这里只是入门了解。

1:fuse库的使用场景。

fuse库使我们可以在用户态灵活控制文件系统,按需要进行开发(在虚拟化,数据库,云存储,等方向都可以按需使用)。

这里可以用fuse实现对该文件系统下的文件进行特定处理,比如给该文件系统下的图片加水印,给该系统下的文件加特定字段(日志加前缀等)

2:libfuse库的安装

#磁盘满了  借用du -h 查看目录下占用大小 依次进行处理
ubuntu@ubuntu:/home$ du -h -d 1
1.2G	./ubuntu
1.2G	.
ubuntu@ubuntu:~/fuse$ ls
libfuse-fuse-3.16.2.tar.gz
ubuntu@ubuntu:~/fuse$ tar -zxvf libfuse-fuse-3.16.2.tar.gz 

#进行构建 
ubuntu@ubuntu:~/fuse/libfuse-fuse-3.16.2$ mkdir build
ubuntu@ubuntu:~/fuse/libfuse-fuse-3.16.2$ cd build/
ubuntu@ubuntu:~/fuse/libfuse-fuse-3.16.2/build$  meson setup ..
#编译和安装   注意日志,看安装位置。
ubuntu@ubuntu:~/fuse/libfuse-fuse-3.16.2/build$ ninja
ubuntu@ubuntu:~/fuse/libfuse-fuse-3.16.2/build$ sudo ninja install
...
Installing /home/ubuntu/fuse/libfuse-fuse-3.16.2/include/fuse.h to /usr/local/include/fuse3
...
ubuntu@ubuntu:~/fuse/libfuse-fuse-3.16.2/build$ ls /dev/fuse
/dev/fuse

3:首先了解一下libfuse下的example(了解笔记未深入)

hello.c是最基础的  会在文件系统下创建一个hello文件 有基本的写入。  ./hello -f ./test2
hello_ll.c 和hello同样的功能  用的更详细的接口。
hello_ll_uds.c 在上面基础上借助fuse_session_custom_io 定制了相关输入和输出通道
invalidate_path.c 借助多线程的方式,实现文件内容的持续变化。 fuse_invalidate_path 标记触发,告诉文件系统特定目录发生变化,需要重新处理。

ioctl.c 实现使支持ioctl, 配合ioctl_client.c测试  调用ioctl可以设置或者获取对应文件大小
一个终端上: 
^Croot@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./ioctl -f ./test2/
另一个终端上:
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./ioctl_client ./test2/fioc 
6
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./ioctl_client ./test2/fioc 12
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./ioctl_client ./test2/fioc 
12
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ll ./test2/fioc 
-rw-r--r-- 1 root root 12 Sep  6 05:13 ./test2/fioc
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./ioctl_client ./test2/fioc 18
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ll ./test2/fioc 
-rw-r--r-- 1 root root 18 Sep  6 05:13 ./test2/fioc

notify_inval_entry.c 文件系统下文件名动态反应当前时间 
也是新线程  然后通过fuse_lowlevel_notify_expire_entry 移除老的文件
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./notify_inval_entry --update-interval=1 --timeout=30 --no-notify ./test2/
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ls test2/
Time_is_05h_45m_04s
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ls test2/
Time_is_05h_45m_06s
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ls test2/

notify_inval_inode.c 内核识别inode节点变化 分别不同处理测试
#查看说明  --no-notify 参数  不允许内核修改   文件内容不必变化
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./notify_inval_inode --update-interval=1 --no-notify ./test
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test# cat current_time 
The current time is 05:58:07
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test# cat current_time 
The current time is 05:58:07

#没有定义 --no-notify 参数 文件内容会随时间而变化
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./notify_inval_inode --update-interval=1  ./test3
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test# cd ../test3/
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test3# cat current_time 
The current time is 06:12:50
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test3# cat current_time 
The current time is 06:12:51
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test3# cat current_time 

notify_store_retrieve.c 和notify_inval_inode.c 功能相同  方法不同,主动将更新数据推送到内核  fuse_lowlevel_notify_store

passthrough.c 系列  实际上是fuse直接透传到底层真正的文件系统中  只是一个挂载的功能。 在该目录下操作,实际上是底层真正的文件系统中。

//测试代码貌似是把根目录进行映射了
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./passthrough_fh -f ./test1 
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test1# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test1# touch 1
//在映射目录中操作  底层实际文件系统已经实时进行操作了 创建了文件1
ubuntu@ubuntu:/$ ls
1     dev   lib    libx32      mnt   root  snap  tmp
bin   etc   lib32  lost+found  opt   run   srv   usr
boot  home  lib64  media       proc  sbin  sys   var

root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./passthrough_hp  -h
./passthrough_hp: Option ‘h’ does not exist
Usage: ./passthrough_hp --help
       ./passthrough_hp [options] <source> <mountpoint>
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example# ./passthrough_hp  ./test1 ./test2
//在映射目录test2目录下创建操作文件  在实际文件系统目录test1下能识别到
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test2# touch 1
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test2# touch 2
root@ubuntu:/home/ubuntu/storage/fuse/libfuse-fuse-3.16.2/build/example/test2# ls ../test1/
1  2


poll.c  借助fuse_notify_poll 触发事件  实现了监控文件操作进行打印。   ./poll -f /mnt
null.c 就是一个基本的空的文件系统   

struct fuse_operations 是一个结构体,用于定义 FUSE 文件系统操作的回调函数。以下是一些常见的成员和其功能介绍:

getattr: 获取文件属性(如大小、权限等)的回调函数。
readdir: 读取目录内容的回调函数。
open: 打开文件的回调函数。
read: 读取文件内容的回调函数。
write: 写入文件内容的回调函数。
mkdir: 创建目录的回调函数。
rmdir: 删除目录的回调函数。
unlink: 删除文件或符号链接的回调函数。
rename: 重命名文件或移动文件到另一个目录的回调函数。
truncate: 调整文件大小(截断或扩展)的回调函数。

4: 了解demo运行时的参数

-f 或 --foreground: 让文件系统在前台运行,输出日志到控制台。
-d 或 --debug: 启用调试模式,输出更详细的日志信息。
-s 或 --singlethread: 强制单线程模式,即所有回调函数都在主线程中执行。
-o <options>: 指定其他额外的选项。例如,可以使用 -o allow_oth
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值