文件系统学习1——文件系统基本概念

2019.2.27
最近准备学习一下文件系统的基本知识,学习路线如下:
文件系统基本概念->文件系统磁盘布局->文件系统IO系统->MQ队列机制->IO管控。

下面开始简单介绍一下文件系统的一些基本概念,大部分来自于书籍和一些博客上的内容,相关链接如下:
Ext4专题文章索引
linux文件系统详解
鸟哥 Linux 磁盘与文件系统管理
Linux 的虚拟文件系统(强烈推荐)

1、什么是文件系统

文件系统是一种存储系统,通过文件的形式去存储和管理数据,通常来说在存储设备之上搭建一套方面用户以文件操作和管理数据的系统。从系统结构的角度看,它属于操作系统中的一员,同时它又高于硬件设备。

2、文件系统操作

文件系统所有的一切都是围绕文件展开的,常见的文件操作如下:

  • 创建文件
  • 打开文件
  • 删除文件
  • 复制文件
  • 剪切文件

3、文件系统的层次

这里给出了linux文件系统详解博客中的一张图,这张图简单秒回了文件系统在整个系统结构中的一个层次。文件系统学习1——文件系统基本概念_第1张图片
从这个图我们可以看到,由上而下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层。下面对这几层做个详细的介绍:
用户层: 用户层即是我们平时写程序会接触到的一些文件的操作,主要是文件的创建、删除、打开、关闭、写、读等,用户层由用户自己定义操作,用户无法感知底层用的哪样的存储设备,哪些文件系统。

VFS层: 虚拟文件系统层,主要功能是提供统一的文件系统调用接口,也就是我们写程序经常说的系统调用。用户通过system call去调用底层资源时候,都会陷入到VFS层由内核托管。

文件系统层: 这里给出了不同的文件系统,但是所有文件系统的宗旨都是把文件读写命令转化为对磁盘LBA的操作,起了一个翻译和磁盘管理的作用。 值得注意的是,不同的文件系统实现了VFS的这些函数,通过指针注册到VFS里面,在文件系统进行挂载的时候发生。

缓存层: 注意这里说的是page cache,是缓存cache而不是缓冲buffer。缓存层将用户下发的数据进行缓存起来,加速读写性能。

块设备层: 即所谓的抽象块层,和磁盘中的物理块做一个逻辑上的呼应,当文件进行读写时,读写命令在块设备层转换成为不同的命令组合,然后插入到对应的命令队列上,块设备层会有对IO优化的算法,例如:Linux设计了电梯算法等对很多LBA的读写进行优化排序,尽量把连续地址放在一起。

磁盘驱动层: 即所谓的硬件驱动层,驱动程序会把对逻辑块LBA的读写命令转换为各层存储设备的接口协议,例如sata接口的ATA命令,scsi接口的scsi命令,nvme接口的ssd协议。值得注意的是,对于目前openchannel的设备,它们在块设备层和磁盘驱动层实现了FTL,变成对Flash芯片的操作,驱动层直接对闪存进行读写即可。

磁盘物理层: 读写物理数据到磁盘介质。

4、文件系统的使用

  • 文件系统的创建:即是存储设备建立文件系统的过程,一般也被称为格式化或初始化,通过一些初始化工具来进行。
  • 文件系统的挂载(mount):将某一设备(dev_name)上某一文件系统(file_system_type)安装到VFS目录树上的某一安装点(dir_name)。
  • 文件系统的其他操作:目录操作,目录创建、目录删除等操作,及其文件操作等。

5、文件系统的分类

文件系统一般分为两类:
一类是索引式文件系统,例如linux系统中的etx3、ext4这一类;索引式文件系统最大的特点就是将数据的属性信息与数据分开存储,用一个专门的innode节点进行存储,其结构图如下图所示:
文件系统学习1——文件系统基本概念_第2张图片
例如一个文件的属性信息存放在innode4节点上,该节点存放了数据的真实存放区域,实际为数据块2、7、13和15,通过读取innode可以知道数据的存放位置,将数据按照有效块的顺序读取,提高读取率。

另外一类是指针式文件系统,例如U盘常见的FAT32系统,。
这类文件系统数据和属性存放在一起,那么数据块直接的关联用给一个指针地址来控制,也就是说通过找到一个块才能去读取第一个块,以此类推。其结构如下图所示:
文件系统学习1——文件系统基本概念_第3张图片
上图中我们假设文件的数据依序写入1->7->4->15号这四个 block 号码中, 但这个文件系统没有办法一口气就知道四个 block 的号码,他得要一个一个的将 block 读出后,才会知道下一个 block 在何处。 如果同一个文件数据写入的 block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容!

这类文件系统的缺点比较明显:

  • 通过指针的方式进行,数据的读取无法优化,导致磁盘可能不停的来回读取,大大降低读写速率。
  • 单个文件不超过4GB,这是一个文件最多分为的块数量是有限的,也就是用于关联的指针大小是有限的,一般是4个字节,所以2^32=4GB,最大文件不能超过4GB。

你可能感兴趣的:(文件系统)