CurveFs 用户权限系统调研问题1:root用户无法访问挂载目录 测试 allow_root 测试allow_other 参考文献 问题2:本地文件系统挂载默认是共享的? 问题3:文件系统访问控制是在哪一层实现的? 二、文件系统权限管理 文件类型 文件权限 特殊权限(SUID, SGID, STICKY) 文件默认权限umask 用户&用户组 文件系统用户权限管理 对mode的管理 对ACL(Access Control Lists)的管理 2081 folder fuse默认是不会检查文件访问权限的,它允许在文件系统中自由的实现访问控制策略或将其下放到底层文件访问机制(e.g. in case of network filesystems)。挂载参数‘default_permissions’用于启用内核自己的权限检查,而不是将权限检查推迟到文件系统,除了文件系统的任何权限检查之外,内核还会进行检查,并且两者都必须成功才能允许操作 。 。 。 。 内核执行标准的 UNIX 权限检查 如果文件系统在打开设备 fd 时的初始功能协商期间启用了 ACL 支持,则此挂载选项将被隐式激活。 在这种情况下,内核执行 ACL 和标准的 unix 权限检查 疑问:协商期间do_init()中的启用ACL的flags如何设置? 初始化时的 通过 : 功能协商 init()函数实现© XXX Page 9 of 33 // libfuse lib/fuse_lowlevel0 码力 | 33 页 | 732.13 KB | 6 月前3
CurveFS Copyset与FS对应关系XXX Page 11 of 19 6.2、挂载fs 挂载fs的流程不变,client向mds发送mount rpc请求,mds对fs进行相应的检查,然后记录挂载点返回成功。 1、检查文件系统是否存在 2、检查fs的状态,是否是INITED状态 3、检查挂载点是否已经存在 6.3、创建文件/目录 client在创建inode的时候,如何选择copyset。client在fs的所有可用的co set不再承担inode的新建功能。client继续尝试下一个copyset,直到成功从一个copyset上创建到1个inode。 client在系统初始化的时候, 还需要起来一个后台线程,定期的检查每一个fs的copyset的状态,如果某一个fs的可以提供分配inode能力的copyset的个数小于规定的值(来自配置文件,默认3个), 就为这个fs创 建一个新的copyset。© XXX Page com/opencurve/curve/pull/495 增加copyset.proto 增加heartbeat.proto 增加topology.proto 8、inode和dentry的内存估算 类型 byte sizeof(dentry) 56 dentry的name字段,按照最大估算 256 sizeof(inode) 112 sizeof(volumeExtentList) 480 码力 | 19 页 | 383.29 KB | 6 月前3
CurveFS方案设计元数据管理的雏形,具备了基本的元数据管理功能。(当时为什么要设计为 namespace 的管理形式?留有租户这个概念),直接基于 namespace 开发: a. 功能 软/硬链接:目前是都不支持的。软链接可以通过标识文件类型解决;由于 prefix + parentid + filename 作为 key , filename 直接和 fileInfo 关联,硬链接无法支持 b. 性能 list:list在通用文件系统中是很常见的操作,目前 对于文件/目录级别的快照: 检查目的节点的父节点中是否有同名文件存在: 存在 若源节点类型为TYPE_DIRECTORY则对源节点目录下的所有子文件进行快照 若源节点类型为TYPE_FILE则开始比较源节点与目的节点的 inode 是否相同,若完全一样则说明目的节点已经是源节点的快照了不需要做任何处理, 否则删除目的节点,再创建新的 dentry 指向源节点的 inode 若源节点类型为TYPE_SYM 若源节点type= TYPE_DIRECTORY,递归创建源节点目录下的所有子文件进行快照 若源节点type= TYPE_FILE,则设置length、chunks使其与源节点的对应属性一致 若源节点类型为TYPE_SYMLINK,设置目的节点的path与源节点保持一致 为 dentry 中对应chunk添加一个快照结构 flist 表示该chunk新关联了一个fsnode© XXX Page 8 of0 码力 | 14 页 | 619.32 KB | 6 月前3
CurveFS S3数据整理(合并碎片、清理冗余)试, 入队inodekey, 如果是已有inode任务, enqueue直接返回, 不入队 任务开始执行, 尝试根据inodekey获取inode信息, 获取不到就退出; 不是s3类型的inode退出 对于每一个s3类型的inode来说, 对每一个index内的chunkinfo按照chunkid升序排序. 对于一个chunk来说,chunkinfo数量大于20即进行处理 计算变更 - 记录整个chunk最大的chunkid 已经在整理的任务不会被新的删除标记的请求打断. 如果标记删除到实际删除之间的时间间隔非常短, 并且在标记删除前已经开始了整理任务, 可能会出现边删除边整理的状态(出现概率较小) 可以在实际删除前检查当前整理的inode列表, 如果在列表里就暂时跳过(同步删除)/重新丢进删除队列(异步删除) 或者就不管, 处理一下报错, 让后续的应该会开发的数据清理工具来删除, 因为出现这个冲突的概率比较小 truncate:0 码力 | 3 页 | 101.58 KB | 6 月前3
Curve核心组件之mds – 网易数帆本PageFile支持块设备、三副本AppendFile(待开发)支持在线对象存储、AppendECFile(待开发)支持 近线对象存储可以共存。 如上所示LogicalPool与pool为多对一的关系,一个物理pool可以存放各种类型的file。当然由于curve支持 多个pool,可以选择一个logicalPool独享一个pool。 通过结合curve的用户系统,LogicalPool可以通过配置限定特定user使用的方式,实现多个租户数据物理 信息更新拓扑 中的信息。 • ConfGenerator: 将当前上报的 copyset 信息提交给调度模块, 获取该 copyset 上可能需要执行的任务。 • HealthyChecker: 检查集群中的 chunkserver 在当前时间点距 离上一次心跳的时间,根据这个时间差更新chunkserver状态。 Chunkserver端:chunkserver 端的心跳由两个部分组成: •0 码力 | 23 页 | 1.74 MB | 6 月前3
CurveFS S3本地缓存盘方案做一个硬链接链接到该文件。 本次io在本地硬盘写入好之后,异步上传模块会适时把本地硬盘写缓存目录中的文件上传到远端对象存储集群,上传成功后,删除本地写缓存目录中的对应文件。 同时,缓存清理模块会定时检查本地硬盘缓存目录容量情况,如果容量已经达到阈值了,则进行文件的清理工作。 另外,异常管理模块处理客户端挂掉后的文件重新上传问题。 主要数据结构定义 class DiskCacheManagerImpl 到读缓存目录。 这样,写缓存目录中的文件上传完之后就可以直接删除了,那么该文件的读缓存还是存在的。 缓存盘空间管理 当缓存文件内容达到阈值时,停止向本地缓存盘写入。 同时,缓存清理模块会定时检查本地硬盘缓存目录容量情况,如果容量已经达到阈值了,则进行文件的清理工作。 本地缓存盘的异步上传 工作队列: 该队列中保存缓存盘中的待上传文件名 工作线程: 遍历工作队列(队列swap),从缓存0 码力 | 9 页 | 150.46 KB | 6 月前3
curvefs client删除文件和目录功能设计moosefs使用了两种机制,来实现上述功能,分别是trash机制和reserve机制(最新版本叫sustained),两种机制如下: trash机制: 对于所有TYPE_FILE类型的文件在删除时, ,则不会立即将该文件彻底删除,而是将其类型修改为TYPE_TRASH并且将该节点从文件树移除然后放到trash链表中表示该文件已经进入回收 若其trashtime大于0 站。 通过META文件系统来访问trash serve中。 sustained机制/reserve机制 当一个trashtime等于0的TYPE_FILE类型的文件被一个客户端正在打开,而同时有另一个客户端要删除它时,此时master对该文件节点的处理是并不立即删除该文件而是设置为TYPE_RESERVED类型并将该fsn ode连接到reserved链表中,使该文件虽然已经从文件树中删除掉,但因为另一个正在打开该文件的客户端因为持有该节点inodeid0 码力 | 15 页 | 325.42 KB | 6 月前3
Curve文件系统元数据管理(n)复杂度。 c++ stl unordered_map moose,使用c实现 4、curve文件系统的元数据内存组织 curve文件系统元数据主要有3个类型,inode, dentry, 。 extent 4.1 inode定义: inode定义见:curve文件系统元数据proto(代码接口定义,已实现)© XXX Page 5 of 24 typedef 400 200 + E → 300 0 + B → 200 这里rename的时候,涉及到inode信息跨节点迁移。需要引入分布式锁,是个难点。 symbolic link: 这个类型的文件和普通文件一样创建删除,区别在于,在inode信息中记录需要链接到的地址。 hardlink:生成一个hardlink /B/E,指向文件/A/C 1、client给server0发送请求: 缓存可以在挂载文件系统的时候缓存在client端。不缓存具体的Inode的结构体,仅仅缓存(inodeid, partitionid)的映射,如果inodeid为uint64类型,partitionid为uint64_t类型,那么一条记录需要16字节。一个文件系统按照10亿的元数据统计,10亿 * 16字节 = 1.5GB,全部缓存到内存需要1.5GB的内存。除了缓存需要占用的内存资源之外,如果涉0 码力 | 24 页 | 204.67 KB | 6 月前3
NJSD eBPF 技术文档 - 0924版本• map映射 • 验证器 • Hook • Helper api配置TCP Initial RTO • 场景 内核4.12之前 initial RTO是⼀个常数1s • 应⽤类型BPF_PROG_TYPE_SOCK_OPS • HOOK BPF_SOCK_OPS_TIMEOUT_INIT • 内核中调⽤栈 • tcp_timeout_init • tcp_c (filename, offset, len) = func (inodeid, offset, len) • 读cache流程 • 写cache流程基于inode cache优化 • bpf程序类型 BPF_PROG_TYPE_EXTFUSE • Hook点及⽅法 • fuse_request_send • FUSE_LOOKUP / FUSE_GETATTR / FUSE_SETATTR • inode map BPF_MAP_TYPE_HASH • key inode id • value fuse_attr (⽂件属性)基于data cache部分 • bpf程序类型 BPF_PROG_TYPE_EXTFUSE • Hook点及⽅法 • fuse_file_read_iter, fuse_file_write_iter • FUSE_READ / FUSE_WRITE0 码力 | 20 页 | 7.40 MB | 6 月前3
Curve核心组件之snapshotcloneTask user 快照元数据 2.创建内部快照 5.删除内部快照 快照数据 1.发起快照 SnapshotCloneServer 6.删除内部快照数据快照的元数据和数据组织 字段 类型 说明 uuid string 快照唯一Id user string 所属用户 fileName string 快照目标卷名 snapshotName string 快照名 seqNum uint64_t SnapFile的命名方式为“chunk_” + ChunkId + “_snap_”+ seqNum的形式,以区别于 ChunkFile。CHUNKSERVER端快照实现-SNAPFILE 字段 类型 说明 version uint8_t 文件格式协议 版本号 demaged bool 损坏标记 sn uint64_t 快照版本号 bits uint32_t 位图的位数 bitmap char[] chunk: 安装元数据时即分配好chunk。 无额外接口: 无需Flatten接口。 适用场景: 适用于从云主机或快照创建镜像CHUNKSERVER端克隆实现-CHUNKFILE 字段 类型 说明 version uint8_t 文件格式协议版本号 sn uint64_t chunk文件的版本号 correntSn uint64_t chunk的修正版本号 locationSi0 码力 | 23 页 | 1.32 MB | 6 月前3
共 17 条
- 1
- 2













