【存储系统】文件系统

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)

  1. 查找文件的inode
    1. 在根目录查找foo目录
    2. 读取foo目录的内容
    3. 在foo目录中查找bar
    4. 每次查询先在缓存中进行查找
  2. 为inode创建vnode结构
    1. 判断inode是否在inode cache中,若不在则需要从磁盘中请求
    2. 请求后创建vnode缓存
  3. 初始化File Object
  4. 生成fd,填充数据信息
  5. 返回fd给进程

0x02 实现角度

0%