Fuse(filesystem in userspace),是一个用户空间的文件系统。通过fuse内核模块的支持,开发者只需要根据fuse提供的接口实现具体的文件操作时所对应的回调函数,就可以实现一个文件系统。由于其主要实现代码位于用户空间中,因此不需要重新编译内核。
Fuse的运行原理
Fuse包含一个内核模块和一个用户空间守护进程(下文称fuse daemon)。内核模块加载时被注册成 Linux 虚拟文件系统的一个 fuse 文件系统驱动。此外,还注册了一个/dev/fuse的字符设备。
$ ls /dev/fuse -al
crw-rw-rw- 1 root root 10, 229 7月 13 12:51 /dev/fuse
该设备作为fuse daemon与内核通信的桥梁,fuse daemon通过/dev/fuse读取fuse request,处理后将reply写回/dev/fuse。
用户空间与内核空间的交互流程是这样:
1.用户开发基于libfuse的户空间文件系统程序,该程序会提供对文件系统操作,比如打开关闭,读写操作的回调函数。
2.当有应用程序操作通过fuse挂载的文件系统时,VFS会将这些操作路由至fuse的内核模块,也就是fuse driver,fuse driver创建了一个fuse request结构体,并把request保存在请求队列中。此时,执行操作的应用程序进程会被阻塞。
3.fuse daemon通过读取/dev/fuse将request从内核队列中取出,根据操作调用步骤1中注册的相应回调,也就是回调会具体处理对fuse文件系统的操作请求,当处理完请求后,fuse daemon会将reply通过/dev/fuse传递给fuse driver,此后fuse daemon把requset标记为completed,最终唤醒用户进程。