【存储系统】文件系统
0x00 基本概念
文件的基本概念, 包含信息的比特流/块,计算机往往需要处理远高于主存容量的数据,需要使用文件来保存;文件的生命周期更长,不能存储在堆栈中;对文件的数据/信息对外进行分享的媒介。可以用于进程间的信息共享,自由性和容量上都优于共享内存的方式。
文件系统的功能
Namespace 命名空间
- 文件目录的建立、维护和检索(目录树)
存储管理
- 空间管理:存储空间的分配和管理(管理空闲的块)
- 文件块管理:逻辑地址与存储物理地址的映射(logical offset—Physical Block number)
数据保护
- 文件出现坏块
- 灾备
可靠性/一致性
0x01 用户视角
文件目录操作
文件操作:
- Create/Delete
- Open/Close 返回File Handle
- Read/Write
- Append 追加写入
- Seek 移动文件指针 offset
- Getattr/Setattr 读取/修改inode中保存的文件信息
- Rename
目录操作:
- Createdir/rmdir
- Link 软链接、硬链接 讲目录项目指向文件的inode
- Unlink
- Readdir 读取子目录以及目录项
- Rename
文件目录的构成
文件的组成:
- 文件内容,字节序列
- 文件的元数据metadata,文件控制块,Unix系统中称为inode(index node)
目录的组成:
- 本质是一种特殊的文件,内容是子目录、文件等目录项目
- 目录也有inode
File Handle
创建原文件的一个实例对象,对其进行读写,Offset可以共享给两个File Handle,也可以每个File Handle独有各自的Offset。
Linux VFS中为文件描述符fd,对应一个File Object,包含文件的信息,文件系统管理dentry、inode的缓存,用于查找文件在磁盘上的位置。关于Linux VFS的内容,计划再单独开个博客记录一下。
File Control Block (Inode)
每个文件唯一的id,包含以下结构
- Block的信息,文件在磁盘上的位置
- 数据大小
- Ctime创建时间,utime更新时间,access time最后一次访问时间
- 所有者信息,ACL(access control lists)访问控制
- 链接情况统计
Dirent - Directory Entry
目录项纪录子文件和子目录的名称
每个目录项的结构
类型 | 大小 | 字段 | 描述 |
---|---|---|---|
__le32 | 4bytes | Inode | inode编号 |
__le16 | 2bytes | Rec_len | 目录项的长度 |
__u8 | 2bytes | Name_len | 文件名长度 |
__u8 | 2bytes | File_type | 文件类型 |
char[EXT2_NAME_LEN] | 最大255个字符 | Name | 文件名 |
所有目录都包含的目录项包括当前目录和上级目录:.
,..
要对文件名进行4字节对齐,后面补\0
所有目录项顺序拼接组成目录信息,在进行查询时可以使用rec_len来计算偏移量,便于查找目录中的文件(顺序遍历)
目录树
目录树的结构如下图所示,每个目录都有自己的inode,同时还有direntry,对其中的子目录可以构建子树,文件可以建立文件子节点
根据Pathname查找文件的过程
- 从根目录
/
开始查询,解析出要查询的项目 - 获取当前目录的目录项(可能在内存中,也可能要向磁盘请求)
- 比对相应的纪录是否存在于目录项中,比对成功则获取其inode
查找过程中需要考虑的问题:
- 检查权限:在每级目录查找时,需要检查是否有对当前目录进行访问的权限,然后才能继续进行操作
- 检测是否为软链接/符号链接(Symbolic link):目录项可能指向同一个inode,防止出现循环链接
- 检测是否挂载了其他文件系统,文件名可以是挂在文件系统的挂载点,若出现此类情况需要进入新的文件系统进行查找
Access Control Lists 访问控制
基本ACL纪录内容:
记录类型 | 格式 |
---|---|
Owner | user::rwx |
Owning Group | group::rwx |
Others | other::rwx |
rwx为掩码形式,使用三位八进制,777
为可读可写可执行,系统调用为chmod
在文件系统中有扩展ACL,记录内容为:
记录类型 | 格式 |
---|---|
Owner | user::rwx |
Named User | user:name:rwx |
Owning Group | group::rwx |
Named Group | group:name:rwx |
Mask | mask::rwx |
Others | other::rwx |
对于文件的访问权限通过Named User,Owning Group和Named Group进行授权,同时可以使用Mask设置掩码对权限进行控制,例如有权限r-x
,对于Mask:mask::rw-
,最终的操作权限为r--
,将掩码和权限进行与操作
不同文件系统有对ACL不同的扩展和实现
Example
int fd = open("/foo/bar.txt", RO)
- 查找文件的inode
- 在根目录查找foo目录
- 读取foo目录的内容
- 在foo目录中查找bar
- 每次查询先在缓存中进行查找
- 为inode创建vnode结构
- 判断inode是否在inode cache中,若不在则需要从磁盘中请求
- 请求后创建vnode缓存
- 初始化File Object
- 生成fd,填充数据信息
- 返回fd给进程