文件系统是操作系统的一部分,负责组织、存储和管理存储在外部设备上的文件和目录,也就是操作系统管理外设中的文件的策略。本文讲解的是Ext2文件系统。Linux操作系统使用的就是Ext系列的文件系统。
磁盘是计算机上的唯一的机械设备,作为外设用于存储大量的数据,磁盘内部的物理结构示意图如下:
磁盘存储数据的原理: 计算机中的数据本质就是0和1的区别,因此磁盘只需要利用磁性来代表数据的0和1。
磁盘的每个盘片的盘面被划分成多个部分:
磁盘以扇区为单位进行数据的存储,一个磁盘文件会占据一个或多个扇区的位置来存储,要想加载磁盘文件到内存中,需要定位到磁盘文件所在的一个或多个扇区。
定位扇区的方法:
磁头(Heads)、柱面(Cylinder)(等价于磁道)、扇区(Sector)对应的编号。即可在磁盘上定位所要访问的扇区。这种磁盘数据定位方式叫做 CHS 。
磁盘需要抽象成逻辑结构的原因:
磁盘的逻辑结构就类似于拉开的磁带,将一个盘片抽象成被拉开的磁带,一圈磁带就类似于一个磁道。逻辑结构示意图如下:
扇区的大小是512字节,而OS一次IO操作的基本单位是4KB,因此OS将一次IO操作的数据抽象成数据块。逻辑结构示意图如下:
OS将整个磁盘最终抽象成了多个连续的数据块,也就是将物理结构转换成了线性逻辑结构,因此OS能够将磁盘看作是有对应下标的数组结构,每个下标指向的是一个数据块,每一个下标也被称作逻辑块地址,简称LBA。OS将磁盘看作是数组结构后,每次IO操作就是找到数据块的首地址,然后从该地址开始读取对应个数的扇区。
OS将磁盘看作是由数组结构组织起来的数据块,由于数据块的数量众多,OS将该数组结构划分成多个分区。逻辑结构示意图如下:
将磁盘进行分区后,OS为了更方便的管理,还将每个分区划分成多个分组。逻辑结构示意图如下:
Boot Block
区域,该区域存储着OS的开启相关信息,计算机进行开机操作时,会加载磁盘数据,并使用该区域的数据完成开机操作。将磁盘划分为若干个分组后,OS将一个分组的管理策略运用到每个分组中,实现对整个磁盘的管理。OS的具体管理策略如下:
Super Block: 记录该分区文件系统的重要信息,使得操作系统能够正确地使用和管理文件系统。
Group Descriptor Table: 记录改组的详细属性信息。
Block Bitmap: 每个bit表示一个Data Blocks中的数据块是否空闲可用,每个bit对应中的一个Data Blocks中的数据块。
inode Bitmap: 每个bit表示一个inode是否空闲可用,每个bit对应inode table中的一个inode。
inode Table: 记录该组所有文件的索引节点。
Data blocks: 记录了文件的内容。
分组中的以上每个区域都可能会使用若干个数据块。
Linux操作系统是通过文件的inode编号来区分文件的,inode节点中不记录文件名。
目录作为文件也有自己的inode节点。
目录文件中记录的是该目录下的文件的inode编号和文件名的映射关系。
Linux操作系统查询文件的过程:
Linux操作系统删除文件的过程:
Linux操作系统添加文件的过程:
Linux操作系统修改文件的过程:
Linux使用ls
指令时带-i
选项就可以查看到文件对应的inode编号:
文件的恢复
如果文件被误删后,首先要避免文件操作,以防被删除的文件数据被覆盖,然后通过日志记录等技术,找到被删除的文件对应的inode编号将inode编号对应位图置为1,对应数据块置为1,从而完成文件的恢复。
inode编号寻找对应分组的策略
在一个分区中,每个分组所使用的inode编号是有范围的,通过inode编号所在范围能够快速确定inode所在的分组。
分区和分组的完成
在安装操作系统时,会根据用户指定的各分区大小进行分区的设置,然后对会对每个分区进行格式化,格式化就是操作系统向分区写入文件系统管理信息的。
inode记录对应数据块的策略
inode节点中采用数组记录对应数据块,以至于inode节点的大小得以确定,但是如果数组中的一个数据只能对应一个数据块那么,一个inode节点能指向的数据块是有限的,因此inode节点采用三级索引的策略来映射对应的数据块,将该数组划分成三个部分,每个部分采用不同的索引方式。
inode映射的存在的问题
EXT2存储方案存在一个分组,数据块用完、inode没用完或者inode用完、数据块没用完的问题并且如果出现这种情况是无法解决的。
ln -s 被链接的文件名 软链接名字
指令能够创建软连接。ln 被链接的文件名 硬链接名字
指令能够创建硬连接。软链接:
硬链接:
实际上每个目录中的.
就是一个硬链接,链接是当前目录,.
硬链接实现了以相对路径访问当前目录文件的功能。
在目录下创建一个新目录后,Linux系统会为新目录创建一个..
硬链接,链接的就是上级目录,..
硬链接实现了以相对路径访问上级目录文件的功能。
可以看出一个目录的硬链接数(目录中的..
) = 目录下的目录数量 + 2(目录本身和目录中的.
):
注意: 用户不能给目录创建硬链接,避免出现路径环路问题,系统自己维护目录硬链接。
stat 文件名
查看文件信息,其中就有文件的这三个时间:
访问文件时 ,Access时间就会进行更新:
注意: 在最新的Linux版本中,为了节省IO操作造成的时间浪费,如果只是单纯的查看数据不一定会立刻修改Access时间。
修改文件内容时 ,Modify和Change时间都会进行更新:
修改文件属性时 ,Change时间会进行更新: