预热
最近一直在优化分布式文件系统的性能,学习了linux内核文件系统的函数,了解到linux一切皆文件,
除了常见的文件、目录还有socket(可查阅apue
第四章内容),那这些文件的管理都离不开VFS(虚拟文件系统),linux支持ext、ext2
xfs等多种文件系统
,那都是依赖于统一的文件操作界面,底层采用链表的方式,将不同的文件系统链接。打个比方,linux内核就像一个工厂,而VFS是模板,而某一个文件系统就是根据模板生成的产品
。FUSE(filesystem in user
space)用户态文件系统是介于VFS和用户自定义文件系统的枢纽。
FUSE文件系统实现
为了让大家有个直观的认识,我们先看下图:

上图可以划分为三个部分
- 内核:包含VFS
- fuse:fuse和VFS交互完成
- 用户程序:用户程序跟fuse交互
以一个具体的open文件为例:前提是已经挂载了该文件系统
- 用户app调用glibc open接口,触发sys_open系统调用(或者手动打开)。
- sys_open 调用fuse中inode节点定义的open方法。
- inode中open生成一个request消息,并通过/dev/fuse发送request消息到用户态fuse。
- fuse调用
fuse_application用户自定义的open的方法
,并将返回值通过/dev/fuse通知给内核 - 内核在返回给用户app(或者说用户在界面中看到了打开的文件内容)
FUSE 开发示例
接下来,进入实战环节:
- Mac OSX 10.14.2
- 安装 osxfuse :brew cask install osxfuse)
- clion 2018
从github 上拉取项目:https://github.com/excel-bat/apuebegin.git
将该项目中的chapterRes/fuse-demo
导入到clion中,编译打包,然后跳转到对应的terminal
- mkdir /tmp/example
- cd - (跳转到项目目录下的fuse-demo/cmake-build-debug/bin )
- fuse-demo -f /tmp/example (-f 前台运行)
- 打开finder,到XXX的MacBook,会多出来一个挂载点
- 目前只实现了open,效果如下

```
那今天先聊到这,休息下眼睛
