随笔分类 -  FUSE专辑

摘要:fuse-based文件系统一个请求(以getattr为例)经历的路径,附件为visio版原图:fuse流程图.rar 管理员在2009年8月13日编辑了该文章文章。 --> --> 阅读全文
posted @ 2013-04-19 14:12 ydzhang 阅读(293) 评论(0) 推荐(0)
摘要:fuse内核模块被加载时,以下初始化例程会被调用,见fuse_init函数<inode.c>。 1. fuse_fs_init(); 注册fuse文件系统,创建fuse_inode高速缓存。 2. fuse_dev_init(); 创建fuse_req高速缓存,加载fuse设备驱动,用于用户空间与内核空间交换信息。 3. fuse_sysfs_init(); 在/sys/fs目录下增加fuse节点... 阅读全文
posted @ 2013-04-19 14:10 ydzhang 阅读(1681) 评论(0) 推荐(0)
摘要:经常有网友问到关于fuse内部实现原理方面的问题,下面的内容是给一个网友的回复,简单的讲述了fuse的原理,并分析了一个特定请求的处理过程。 fuse主要包含3个模块: 一个fuse文件系统模块(1),一个设备驱动模块(2),一个用户空间模块(3) fuse文件系统这一部分跟其它的文件系统实现差不多,实现了一个文件系统应该提供的借口(如read,write,open等),这就是为什么你挂在了用... 阅读全文
posted @ 2013-04-19 14:08 ydzhang 阅读(1705) 评论(0) 推荐(0)
摘要:fuse提供两种类型的操作接口,fuse lowlevel operations类似于内核文件系统的接口,以inode号作为访问的关键字,而更高级的fuse operations则提供以路径名作为关键字的访问形式,这样即使fuse用户对内核文件系统并不了解,也能编写文件系统程序。高级的接口,其实是对fuse lowlevel operations的一个封装(相当于实现了一个用户空间文件系统fuse_fs,但其数据都放在内存中),它实现了一组lowlevel operations,并通过hash表来组织目录项,实现inode关键字向路径名关键字的转换(逆向路径名查找,索引节点中需要记录父节点的n 阅读全文
posted @ 2013-04-19 14:07 ydzhang 阅读(3700) 评论(0) 推荐(0)
摘要:上个月给文件系统添加额外的属性设置接口,但却是完全脱离文件系统实现的,直接使用rpc连接元数据服务器来设置/获取属性,而没有通过文件系统的客户端。当时想着还有一种方法就是在fuse-2.8中支持了ioctl接口,可通过为分布式文件系统实现ioctl接口实现扩展属性的获取与设置。 使用ioctl首先要理解ioctl命令的封装格式,ioctl的命令对应一个32bits的整数,其格式如下: ... 阅读全文
posted @ 2013-04-19 14:07 ydzhang 阅读(1372) 评论(0) 推荐(0)
摘要:fuse为开发者提供了两组接口,分别是fuse_lowlevel_ops以及fuse_operations,开发者只需要实现这两组接口的一种即可实现一个用户空间文件系统。 struct fuse_lowlevel_ops的成员如下所示,其中init方法在其它所有方法之前调用,用于初始化文件系统,fuse已经实现,destroy则是在文件系统被卸载时做一些清理工作。用于大多数请求的参数都是fuse... 阅读全文
posted @ 2013-04-19 14:05 ydzhang 阅读(1228) 评论(0) 推荐(1)
摘要:fuse处理请求的整个流程如下图所示,以unlink操作为例进行说明。其中“>”表示调用,”<”表示返回,[]表示调用中所做的工作。本人结合fuse的源代码,对整个流程进行了分析。 fuse通过fuse_session_loop(或对应多线程的方法)来启动fuse守护程序,守护程序不断的从/dev/fuse上读取请求,并处理。 代码片段1 int fuse_session_loop(st... 阅读全文
posted @ 2013-04-19 14:05 ydzhang 阅读(1518) 评论(0) 推荐(1)
摘要:对fuse提供的两个选项direct_io及big_writes困惑已久,以前对内核完全不了解,看不懂fuse内核模块的代码,这两天把fuse的代码重新过了一遍,把整个机制弄清楚了,很多细节方面的东西还在学习中。 指定direct_io挂载文件系统时,系统调用到了fuse层后,会跳过页高速缓存,当指定了direct_io后,读写系统调用会使用fuse_direct_io_file_operati... 阅读全文
posted @ 2013-04-19 14:05 ydzhang 阅读(2327) 评论(0) 推荐(0)
摘要:fuse通过fuse_session_loop来启动守护程序,守护程序最终会调用fuse_dev_readv,fuse_dev_readv调用request_wait,使得进程在fc的waitq队列上睡眠。 代码片段1 static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov, unsigned long... 阅读全文
posted @ 2013-04-19 14:05 ydzhang 阅读(927) 评论(0) 推荐(0)
摘要:FUSE是File system in User Space,它是一个用户空间的文件系统框架,通过fuse,程序员可以再用户态实现文件系统,并且不需要特权用户的支持。 fuse包括三个模块:内核模块,用户空间库以及mount工具。 l内核模块实现了一个完整文件系统的框架,但具体操作没有实现(由程序员在用户空间实现)。 l用户空间库给程序员提供编程接口,程序员通过实现fuse提供的fuse... 阅读全文
posted @ 2013-04-19 14:04 ydzhang 阅读(1423) 评论(0) 推荐(0)