上交os lec9 文件系统与存储

9.1 基于inode的文件系统

  • 文件系统是一种对于磁盘的组织形式,ext2存储布局由多个块组组成
  • 一个inode表示一个文件
  • 目录文件,目录项存储文件名文件inode的映射
  • 符号链接的内容就是路径
  • 硬链接不是文件,而是在目录文件中多存一个目录项(dentry)
  • 其他文件,比如字符/块设备文件FIFO文件,一般文件的读写使用write和read接口,而SOCK文件用socket接口,也就是send与receive接口,这些特殊文件本身并不是用来保存数据,而是复用了文件读写的api,也就是通过文件的接口使用文件的功能
  • 对于过大的文件,多级索引块仍然会占用很多内存,使用区段(Extent)优化,
  • ChCore使用基数树存储常规文件内容?基数树应该是用来存储存储块索引的只要有一个逻辑块设备,不需要磁盘,也能实现一个文件系统目录文件,用文件名做hash

9.2 基于inode的文件系统的基本操作

  • 查找如果是符号链接,那么需要解析它
  • 创建,先找到父目录,之后在父目录中创建目标文件,需要分配inode
  • 打开和读写文件,open/read/close文件
  • 使用mmap访问文件,可以像访问内存一样访问文件mmap减少数据copy可以使用madvice提供访问提示

9.3 基于Table的文件系统

  • 基于table的文件系统,它会将数据分成若干个簇
  • 一个文件的标识就是其第一个cluster的id其之后的cluster,可以通过查询FAT表,FAT一般放在存储设备的最头上
  • FAT目录项的组织形式,由于FAT中文件大小的字段是4个字节,也就是32个bit,那么一个文件最多4G大小扩展FAT,一般需要对size(文件大小字段)做扩充;U盘用FAT,比较简单,由于U盘容易写坏掉,FAT没有额外写log;FAT在设计的时候没有考虑link;FAT随机读写慢是因为它像链表,需要遍历FAT表
  • exFAT支持更大的文件
  • NTFS文件也是一种基于Table的文件系统NTFS中的MFT中存储了所有文件和目录的元数据,那么每一个文件记录中记录了文件名,由于这是ms的文件系统,所以windows的everthing查找文件起来很快,但是mac/linux这种基于inode的文件系统就很慢NTFS中小数据直接内嵌在NTFS中

9.4 虚拟文件系统(VFS)

  • 由于存在很多种文件系统(NTFS/FAT),那么如何在一个系统中支持多个文件系统需要对于磁盘分区,将不同的分区格式化为不同的文件系统
  • VFS是一个中间层,对上提供POSIX API,对下对接不同文件系统驱动
  • Linux中的文件系统VFS使用inode
  • VFS维护一个统一的文件系统树,其他文件系统会挂载在根文件系统上,比如这里文件系统1挂载到文件系统2(根文件系统)
  • linux的虚拟文件系统定义了一些inode操作接口ext2本身就是基于inode,那么其挂载就比较容易,但是FAT没有inode,如何挂载在VFS上FAT驱动需要提供inode;内存中的inode由VFS提供
  • VFS内存结构
  • 内存中存在各种各样的cache(比如pagecache,icache,dcache)
  • 存在很多不同的cache
  • 那么linux(宏内核)的存储栈是块抽象可以使得分布式的内存块作为一个文件系统,比如gfs,将文件系统分布在很多的机器上,而只是对用户提供接口

9.5 文件系统高级功能

  • mac的APFS的clone是文件系统层面的复制,也就是复制元数据,其他层面的复制使用COW
  • 对于文件系统做快照也是用COW
  • 稀疏文件COW
  • 其他高级功能,比如加密,压缩,去重,数据和元数据校验等
  • git也算是一个文件系统,内容寻址的文件系统git有三种对象
  • FUSE用户态文件系统框架FUSE接在VFS之上

9.6 崩溃一致性

  • 文件的数据与元数据(比如inode)应该一致
  • 文件的创建时,由于非原子化(分为三步),所以可能会出错
  • 崩溃的情况很多
  • 设备有电池是否还需要考虑文件一致性?
  • 崩溃一致性困难
  • 离线检查是指将数据全部读出,在检查一遍,又全部写会去在线恢复是指边运行边检查
  • 文件系统应该保证DAO

9.7 日志

  • 日志是实现崩溃一致性的一种方法
  • 先写日志
  • 日志的缺点是每次操作都要写磁盘,可以异步写数据到磁盘中批量处理日志
  • 日志有两种提交方式:定期触发以及用户触发
  • ext4用JBD2实现的三种日志模式

9.8 写时复制

  • 写时复制是指在修改数据的时候,不直接修改数据,而是将数据直接复制一份,在复制之上进行修改,比如修改子树的时候,只需要最后修改指向子树的指针,就可以完成原子操作
  • 运用写时复制构建文件系统

9.9 日志文件系统

  • 文件系统的修改以日志的方式顺序写到存储设备中创建file3
  • 空间回收
  • LFS假设大多数读请求可以通过内存缓存处理

9.10 新型文件系统: 闪存

  • FLash友好的文件系统
  • LFS与Flash很像

9.11 新型文件系统:瓦式磁盘

9.12 新型文件系统:非易失性内存

posted @ 2022-06-26 17:01  抿了抿嘴丶  阅读(22)  评论(0编辑  收藏  举报