FUSE协议解析完整版.pdfVIP

  • 11
  • 0
  • 约2.14万字
  • 约 22页
  • 2023-08-19 发布于湖北
  • 举报
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)

1亿VIP精品文档

相关文档