用户空间文件系统(FUSE)( 四 )
low_level接口的使用主要有三个部分:
- fuse_mount:挂载文件系统 , 创建和内核通信的通道;
- fuse_lowlevel_new:注册文件系统回调 , 创建用户空间session结构;
- fuse_session_loop或fuse_session_loop_mt:轮询内核模块请求 , 处理后进行回复;
5
挂载工具为了能够让普通用户进行文件系统的挂载 , libfuse实现了相应的工具fusermount , 同时它也能对文件系统进行卸载 。 内部实现上还是使用了mount系统调用 , 只是fusermount加入了SUID权限 , 在进入系统调用之前进行了权限提升 , 从而绕过了安全检查机制;因此 , 在部分版本的libfuse库中会存在安全漏洞 , 使用时需要注意避免;
6
简易文件系统实践libfuse开源库在example目录中自带了几个用户空间文件系统的实例 , 这里选用hello_ll进行实践 , 它实现了lookup、getattr、readdir、open和read五个接口:
- 下载源码 , 切换到到2_9
$ git clone $ cd libfuse/$ git checkout fuse_2_9_2- 编译libfuse
$ ./makeconf.sh$ ./configure$ make$ ll example/hello_ll-rwxrwxr-x 1 test test 7726 Oct 20 09:04 example/hello_ll- 挂载文件系统 , 首先创建/tmp/fuse作为挂载点
$ ./example/hello_ll -o fsname=hello,subtype=ll /tmp/fuse/$ cat /etc/mtab | grep hellohello /tmp/fuse fuse.ll rw,nosuid,nodev,relatime,user_id=45878,group_id=45878 0 0$ ll /tmp/fuse/total 0-r--r--r-- 1 root root 13 Jan11970 hello$ stat /tmp/fuse/helloFile: ‘/tmp/fuse/hello’Size: 13Blocks: 0IO Block: 4096regular fileDevice: 2eh/46dInode: 2Links: 1Access: (0444/-r--r--r--)Uid: (0/root)Gid: (0/root)Access: 1970-01-01 08:00:00.000000000 +0800Modify: 1970-01-01 08:00:00.000000000 +0800Change: 1970-01-01 08:00:00.000000000 +0800 Birth: -$ cat /tmp/fuse/helloHello World!7FUSE优化
- 增加单个请求的最大值
# fs/fuse/fuse_i.h/** Max number of pages that can be used in a single read request */#define FUSE_MAX_PAGES_PER_REQ 32- libfuse增大单个IO的最大值(max_write)
# lib/fuse_kern_chan.c #define MIN_BUFSIZE 0x21000- 增大文件系统预读
- 增加内核缓存的过期时间
- 用户空间进程开启多线程轮询
- 看不上|为什么还有用户看不上华为Mate40系列来看看内行人怎么说
- 闲鱼|电诉宝:“闲鱼”网络欺诈成用户投诉热点 Q3获“不建议下单”评级
- 用户|5G信号有猫腻,又在考验用户的智商?
- 垫底|5G用户突破2亿:联通垫底,电信月增700万,中国移动有多少?
- iPhone|接近8千万!苹果被罚款了!中国iPhone用户这次真的该生气了!
- 苹果|iPhone13迎来变化!或回归指纹解锁,这几点备受用户喜爱
- 屏幕|苹果iPhone12屏幕不仅发白,还绿的你发慌,用户:环保绿
- 与用户|掌握好这4个步骤,实现了规模性的盈利
- 视频|短视频如何在前3秒吸引用户眼球?
- 恢复|电脑文件不小心被删除了怎么恢复?文件恢复可以用这招解决!
