FUSE协议解析完整版.pdfVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
FUSE协议解析 由于刚学并整理,如有遗漏或者错误 !请拼命指出,谢谢 ! 什什么么是是 FUSE F SE的全称是Filesystem in serspace,即⽤户空间⽂件系统,是系统内核提供的⼀个功能,使得可以在⽤户态下实现⼀个⾃定义的⽂ 件系统。⽐如CEPH和GlusterFS等都有使⽤到F SE。 ⽽则是提供给⽤户态下的开发包。 FUSE是是怎怎么么交交互互的的 F SE是通过读写/dev/fuse让⽤户态的⽂件系统进程和内核通信的。 程序需要先打开/dev/fuse,然后通过mount()将/dev/fuse的fd,进程的⽤户id和组id传⼊,进⾏⽂件系统的挂载。 PS: 通过 ⾃⼰写的fusermount程序(编译安装libfuse后会在/bin/下),可以让我们实现的⽂件系统程序在⾮root权限下挂载,这部分我还不 是很了解,我 ⾃⼰实现的go版libfuse也只是依赖于这个fusermount。 FUSE的的指指令令号号、、对对应应 的的函函数数、、请请求求格格式式与与响响应应 程序从/dev/fuse中读取请求,不需要担⼼像TCP有半包粘包等问题,⼀次读取⼀条请求。buffer不够⼤,会报异常。 请求和响应,都是以⼆进制字节表⽰的,下⽂中的结构体只是为了⽅便看。 请请求求头头 每个命令的前 40 bytes为请求头,转为Golang的结构体如下: // Each query starts with a FuseInHeader type FuseInHeader struct { en uint32 Opcode uint32 Unique uint64 Nodeid uint64 Uid uint32 Gid uint32 Pid uint32 Padding uint32 } Len: 是整个请求的字节数长度,包括请求头后的具体内容 Opcode: 请求的类型 nique: 该请求唯⼀标识,响应中要对应着该 nique Nodeid: 该请求针对的⽂件nodeid,⽬标⽂件或者⽂件夹的nodeid id: 对该⽂件/⽂件夹操作的进程的⽤户ID Gid: 对该⽂件/⽂件夹操作的进程的⽤户组ID Pid: 对该⽂件/⽂件夹操作的进程的进程ID 响响应应头头 程序写⼊/dev/fuse的每个响应的前 16 bytes为响应头,转为Golang的结构体如下: type FuseOutHeader struct { en uint32 Error int32 Unique uint64 } Len: 是整个响应的字节数长度,包括响应头后的具体内容 Error: ⼀个负数的错误码,成功返回0,其他对应着系统(error.h)的错误代码,但是为负数,每个操作的错误返回可以查看linux man中 相应的函数 nique: 对应者请求的唯⼀标识 请请求求类类型型和和 具具体体 结结构构 数字对应着请求中的Opcode FUSE_ LOOKUP = 1 lookup()函数,Look up a directory entry by name and get its attributes. 如解析所说,获取代请求头Nodeid⽂件夹下该名字的⽂件的属性,包含着 inode id等。 请请求求头头后后的的实实体体 type Fuse ookupIn struct { Name string // 字符串结尾的`\0`会计算到长度中,解析时需注意 } Name: ⽂件名 响响应应头头的的实实体体 type FuseEntryOut struct { NodeId uint64 /* Inode ID */ Generation uint64 /* Inode generation: nodeid :gen must be unique for the fss lifetime */ EntryValid uint64 /* Cache timeout for the name */ AttrValid u

文档评论(0)

132****1393 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档