Heng30的博客
搜索 分类 关于 订阅

一篇文章带你了解文件是如何存储在磁盘的

2025-03-10

磁盘文件结构


格式化磁盘后,会将磁盘分割成一个个大小相同的块。这些块就是磁盘管理的最小单位。那么是如何找到空闲位置存储一个文件的呢?下面先来了解几个常用的概念。

  • 块位图:使用一个bit来标记一个块是否被占用。0表示空闲,1表示占用。

  • inode表:表中存放着inode项,一个项存储文件的元信息和所需要占用的块位置。如果文件太大,存储块位置的最后一项用来指向一个空闲块,这个空闲块用来存储需要占用的块位置。如果二级列表还不够,需要使用二级列表的最后一项存储三级列表的块位置。重复上面的过程,这些块会形成一个存储文件占用块位置的列表。

  • inode位图:如果每次存储文件都要遍历inode表,显然效率会很低。所以就出现了inode位图。使用一个bit来表示一个inode项是否可用。

  • 块组描述符:如果文件过多,一个块位图inode表inode位图显然无法存储所有文件,所以需要多个。块组描述符的作用就是用来标识块位图inode表inode位图的起始块位置。这样就能方便找到磁盘元信息。

  • 超级块:每次存储文件都需要通过块组描述符->inode位图来确定是否有空闲的inode项,而且会遍历查找inode文图,会降低效率。而超级块就是用来解决这个问题的。超级块中存储:空闲的块数量、使用的块数量、空闲的inode项和使用的inode项。这样就能够通过超级块快速知道是否有足够空闲位置存储文件了。


了解完上面的基本概念后。那么存储一个文件的步骤大概如下:

  • 查找超级块,看是否有足够的空间存储文件

  • 查找块组描述符,找到磁盘元信息的位置

  • 查找inode位图,找到空闲的inode项,更新位图信息

  • 根据上一步找到的空闲项下标,在inode表中找到对应的位置,写入文件的元信息

  • 查找块位图,找到空闲块来存储文件,写入文件

  • 更新inode项中文件占用的块位置

  • 更新块位图超级块

上面的更新并没有考虑失败和并发的可能。不过大概思路就是这样。