文件系统层次

由上而下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层

  1. 用户层:最上面用户层就是我们日常使用的各种程序,需要的接口主要是文件的创建、删除、打开、关闭、写、读等。
  2. VFS层:我们知道Linux分为用户态和内核态,用户态请求硬件资源需要调用System Call通过内核态去实现。用户的这些文件相关操作都有对应的System Call函数接口,接口调用VFS对应的函数。
  3. 文件系统层:不同的文件系统实现了VFS的这些函数,通过指针注册到VFS里面。所以,用户的操作通过VFS转到各种文件系统。文件系统把文件读写命令转化为对磁盘LBA的操作,起了一个翻译和磁盘管理的作用。
  4. 缓存层:文件系统底下有缓存,Page Cache,加速性能。对磁盘LBA的读写数据缓存到这里。
  5. 块设备层:块设备接口Block Device是用来访问磁盘LBA的层级,读写命令组合之后插入到命令队列,磁盘的驱动从队列读命令执行。Linux设计了电梯算法等对很多LBA的读写进行优化排序,尽量把连续地址放在一起。
  6. 磁盘驱动层:磁盘的驱动程序把对LBA的读写命令转化为各自的协议,比如变成ATA命令,SCSI命令,或者是自己硬件可以识别的自定义命令,发送给磁盘控制器。Host Based SSD甚至在块设备层和磁盘驱动层实现了FTL,变成对Flash芯片的操作。
  7. 磁盘物理层:读写物理数据到磁盘介质。

常用的文件系统

应用分类

Linux:Ext4、XFS、ZFS、Btrfs
Windows和Mac OS X: NTFS 、 APFS

ExtX 发展过程


1992年:Ext2文件系统,Linux最早使用的文件系统
2001年:Ext3在Ext2基础上增加了日志功能
2008年:Ext4稳定版本发布,即Linux 2.6.28版本,可向前兼容Ext2/Ext3,Ext4((ext4日志文件系统、第四代扩展文件系统))是很多发行版如Debian、Ubuntu等的默认文件系统。

饿想她超市血拼记

Linux市(20多年前建立,进入信息化社会,信息就是能量,居民吃的食物叫做数据,单位是字节,bit是食物字节的基本元素)->饿想她超市(新开第四家分店EXT4)

蛋蛋(毕业于Linux市代码农业职业技术学院)

饿想她超市结构:

  • 货架:Block Group
    • 超市概览:Superblock 内容:超市有多少个盒子block,每个货物的标签inode,每个货架有多少个盒子block per group,超市开张时间mount time
    • 货架说明:Block Group Descriptor 内容:货架上标签分布表inode bitmap,标签表inode table在哪里,货物分布表block bitmap在哪里,货架上还有多少空盒子free block count,空标签,以及一些特殊的字符checksum来帮助检验有些重要的数据是不是写错了
    • 盒子分布表:Block bitmap 内容:哪些盒子里面有数据,用bit 0/1表示空/非空
    • 标签分布表:inode bitmap 内容:标签表inode table哪些条目是占用的
    • 标签表:inode table 60B 内容:货物权限,是否是VIP专享,是不是私人定制,是不是共享,是不是某些特殊货物,比如char设备(能够执行用户命令),block设备(批量执行用户的一串命令,存或查看数据),货物的大小,用了多少个字节,用了多少个盒子,货物的最近查看时间,维修时间,移走时间
    • 数据:Data block
  • 货架:

空间大小(最小单位块):

  • 扇区: Sector 512B
  • 块: Block 8*512B=4kB
  • 块组: Block Group 32768*4kB=128MB

三级映射

  1. 问题:货物是用字节组成的长串,有的只占用一个盒子,有的占用多个盒子,甚至成千上万个盒子,而标签表只留了60个字节保存查找信息,根本放不下那么多盒子的位置信息
  2. 方法:一个inode占128字节,其中60个字节用于指向存放文件内容的数据块指针。每个指针4字节,那么有15个指针。最后3个指针用分级间接寻址。 假设block为1KB最大可以表示(2563+2562+256+12)*1KB≈16GB的文件。
  • 12个直接指向,可以有12条记录。
  • 一级间接寻址:1024/4=1024,可以有256条记录。
  • 二级间接寻址,可以有256*256条记录。
  • 三级间接寻址,可以有256256256条记录。

ext4之前的文件系统(ext2、ext3)由文件逻辑地址寻址到物理块地址,采用的是直接+间接寻址的方式,间接寻址又细化为1级寻址、2级寻址、3级寻址.

ext4_extent

  1. 问题:三级映射位置固定不好修改;如果盒子连续防止,需要在映射里面逐条保存盒子的位置,效率不高,浪费空间。
  2. 方法:ext4_extent B+树组,树有一个根节点,后面有很多子节点,每个节点都有一个header,header后面的数据有两种类型,第一种是索引,就是树枝的位置,第二种是叶子,放数据盒子的位置,数据节点表示的是一连串盒子的开头和数量,
    一个ext4_extent可以表示文件一段逻辑地址与物理地址的映射关系,一个庞大的文件一般会有多段逻辑块,此时需要用多个ext4_extent结构表示每段逻辑块映射的物理块。当有非常多的ext4_extent,就需要用内核用ext4_extent B+树组织起来。
  3. 示例3层 B+树
  • 第1层:ext4_extent_header 根节点,作用:保存后几级统计信息
  • 第2层:ext4_extent_idx 索引节点(可以有多级),作用:位置索引信息
  • 第3层:ext4_extent 叶子节点,作用:放数据的盒子

按图索骥

  1. 要找到一个文件/var/test.txt
  • /->var
  • var->test.txt
  1. 多级寻址
  • /->inode
  • inode->10747905
  • 10747905->10749034
  • 10749034->test.txt

Hash Tree

  1. 问题:多级寻址麻烦
  2. 方法:根目录的盒子里面是个表,每个路径用hash算法算出一个hash值,每个hash值有一个自己的盒子,里面是所有的dentry
  3. Hash存储模型
  • 通过HashMap中的key找到对应的文件编号
  • 通过文件编号找到存储中的文件
  • 通过value长度和位置找到对应的行数据
  • 读取value值

参考:

  1. https://zhuanlan.zhihu.com/p/571235218?utm_id=0
  2. https://blog.csdn.net/xiaoqiaxiaoqi/article/details/80037963
  3. 大话ext4文件系统
  4. https://www.cnblogs.com/baomaggie/p/11238228.html
  5. https://zhuanlan.zhihu.com/p/472419492
  6. https://zhanghaiyang.blog.csdn.net/article/details/131148463?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~YuanLiJiHua~PayColumn-1-131148463-blog-126798909.235^v38^pc_relevant_sort&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~YuanLiJiHua~PayColumn-1-131148463-blog-126798909.235^v38^pc_relevant_sort&utm_relevant_index=1
  7. ext4 extent详解1之示意图演示
  8. 不同存储模型的应用情况
posted on 2023-07-17 15:42  /小小白/  阅读(135)  评论(0)    收藏  举报