用户空间文件系统(FUSE)
作者:杨光海
来源:微信公众号:360云计算
出处:;mid=2247487878 --tt-darkmode-bgcolor: #131313;">简介1.1 环境本文所有的分析和操作都在下面的环境中完成:
操作系统:CentOS Linux release 7.6.1810 (Core)
内核版本:3.10.0-862.2.3.el7.x86_64
libfuse版本:libcurl-7.29.0-57
1.2 FUSELinux内核从2.6.14开始支持用户空间文件系统 , 即FUSE(Filesystem in Userspace) , 与之对应的是内核文件系统 , 区别在于 , FUSE除了能够使用普通用户进行挂载外 , 文件系统的元数据和数据操作也都是由用户空间的进程来实现 , 并且能够使用内核文件系统的接口进行访问; FUSE的引入极大的方便了文件系统的开发和调试 , 相对于复杂的内核文件系统 , 无需编写任何内核代码 , 无需重新编译内核 , 维护上也由此变得简单 , 因此开源的文件系统都会使用FUSE来支持POSIX协议 , 比如CephFS、GlusterFS、ZFS、sshfs、mailfs等 。除了类Unix系统外 , windows下的FUSE实现叫Dokan,提供的接口和FUSE相同 , 这使得开发跨平台文件系统变得简单 。为了方便文件系统的开发 , 除了libfuse提供的C,C++接口 , 社区也有相应的库支持JAVA、Go、Python等编程语言的绑定 。使用FUSE也并非没有缺点 , 其在用户空间和内核空间的多次交换造成的性能问题一直为人所诟病 。综上所述 , FUSE主要有以下特性:
- 能够使用普通用户进行挂载;
- 文件系统运行于用户空间;
- 方便开发、调试、安装和维护;
- 多平台支持;
- 用户空间接口的多编程语言支持;
- 性能比内核文件系统差;
架构为了能够使用和内核文件系统相同的接口 , 以及方便用户空间文件系统的开发和维护 , FUSE在内核空间和用户空间都具有相应的实现 , 主要由三个部分组成:
- 内核模块(fuse.ko):和VFS进行交互 , 它和普通的文件系统模块一致 , 只是不会处理实际的文件系统调用 , 而是将其进行封装为特定格式的fuse请求后发送给用户空间进程 , 等待用户空间进程处理完成并返回 , 接收处理返回结果转换为内核文件系统格式后再传递给VFS 。
- 用户空间库(libfuse.\*):负责和内核模块进行通信 , 接收来自内核模块的请求并将结果写回内核模块 。
- 挂载工具(fusermount):实现普通用户对文件系统挂载和卸载 。
文章插图如上图所示 , 当应用程序在挂载点进行操作的时 , IO路径分为以下几步:
- 应用程序在挂载点进行系统调用;
- 系统调用进入VFS并最终由FUSE内核模块进行处理;
- FUSE内核模块将系统调用进行封装后发送给用户空间进程;
- 用户空间进程将请求进行处理完成后发送给FUSE内核模块;
- FUSE内核模块解析请求返回并由VFS返回给应用程序;
3
内核模块3.1 内核模块加载使用FUSE需要内核的支持 , 可以使用insmod或modprobe命令进行内核模块的加载:
# modprobe fuse# modinfo fusefilename:/lib/modules/3.10.0-862.2.3.el7.x86_64/kernel/fs/fuse/fuse.ko.xzalias:devname:fusealias:char-major-10-229alias:fs-fuseblkalias:fs-fuselicense:GPLdescription:Filesystem in Userspaceauthor:Miklos Szeredi alias:fs-fusectlretpoline:Yrhelversion:7.5... fuse内核模块初始化(fuse/inode.c: fuse_init())主要有以下四个过程过程:- fuse_fs_init:创建fuse_inode高速缓存 , 并注册类型为fuse的文件系统
# cat /proc/filesystems | grep fusefuseblknodevfusenodevfusectl- fuse_dev_init:创建fuse_req高速缓存 , 注册fuse杂项设备/dev/fuse , 主设备号为9 , 次设备号为299
# ll /dev/fuse crw-rw-rw- 1 root root 10, 229 Oct 18 15:40 /dev/fuse- fuse_sysfs_init:在sysfs文件系统下新增fuse节点 , 在fuse节点下新增connections节点
# ll -d /sys/fs/fuse/drwxr-xr-x 3 root root 0 Oct 18 15:40 /sys/fs/fuse/- fuse_ctl_init:注册FUSE控制文件系统fusectl , 如果系统中存在挂载的用户空间文件系统 , 可以看到如下的信息:
# mount -t fusectl none /sys/fs/fuse/connections/# ll /sys/fs/fuse/connections/total 0dr-x------ 2 test test 0 Oct 18 15:48 39# ll /sys/fs/fuse/connections/39/total 0--w------- 1 test test 0 Oct 18 15:48 abort-rw------- 1 test test 0 Oct 18 15:48 congestion_threshold-rw------- 1 test test 0 Oct 18 15:48 max_background-r-------- 1 test test 0 Oct 18 15:48 waiting
- 看不上|为什么还有用户看不上华为Mate40系列来看看内行人怎么说
- 闲鱼|电诉宝:“闲鱼”网络欺诈成用户投诉热点 Q3获“不建议下单”评级
- 用户|5G信号有猫腻,又在考验用户的智商?
- 垫底|5G用户突破2亿:联通垫底,电信月增700万,中国移动有多少?
- iPhone|接近8千万!苹果被罚款了!中国iPhone用户这次真的该生气了!
- 苹果|iPhone13迎来变化!或回归指纹解锁,这几点备受用户喜爱
- 屏幕|苹果iPhone12屏幕不仅发白,还绿的你发慌,用户:环保绿
- 与用户|掌握好这4个步骤,实现了规模性的盈利
- 视频|短视频如何在前3秒吸引用户眼球?
- 恢复|电脑文件不小心被删除了怎么恢复?文件恢复可以用这招解决!
