Linux文件系统的inode、数据区块与文件大小的关系

我们知道文件系统在格式化的时候会创建多个区块群组(block group),每个区块群组又包含inode表,inode对应表,数据区块(block),区块对应表,文件系统描述,超级区块等,那么文件系统是如何运作的?

首先文件的权限(rwx)和文件的属性(owner,group,时间参数等)数据是存放在inode中,实际数据存放在数据区块中,超级区块则是记录整个文件系统的整体信息,包括inode与数据区块的总量,使用量,剩余量等。

每个inode和数据区块都有编号,我们需要了解的是:

  • inode:记录文件属性,一个文件占用一个inode,同时记录此文件的数据所在的区块号码;
  • 数据区块:记录实际数据。每个区块最多只能存放一个文件。这和Windows的NTFS文件系统的簇的概念差不多。当文件大小小于数据区块大小时,则文件也会占用整个区块;如果大于数据区块大小,那么占用多个区块。比如数据区块大小为4K,文件大小为1K,那么这个文件也会占用4K的空间。所以服务器要根据实际情况规划区块的大小,从而减少磁盘空间的浪费。
  • 超级区块:记录整个文件系统的整体信息,包括inode与数据区块的总量,使用量,剩余量等。

假如一个文件的属性记录在inode 3号,而inode 3号记录了文件数据实际存放的区块号码为3,5,7,那么系统就能够根据区块号码找到文件的实际数据,这种方法称为索引式文件系统

在Windows系统优化常常会提到碎片整理。碎片整理的原理就是将文件过于离散的区块整合到一起,从而加快文件的读取速度。

了解以上概念之后,我们现在来讨论inode、数据区块与文件大小的关系。

以CentOS7为例:

  • ext4文件系统格式的inode size为256B,block size为4096B。通过dumpe2fs命令可以查看。
  • xfs文件系统格式的inode size为512B,block size为4096B。xfs_info命令可以查看。

我们要知道的是inode记录一个数据区块要占用4B的空间,假设有一个4MB大小的文件,那么inode至少需要1000个区块的记录。那么系统是如何实现的?系统将inode记录区块号码的区域指向区块来记录文件区块号码。

inode将记录区块号码的区域定义为12个直接,一个间接,一个双间接,一个三间接记录区。

示意图如下(图源网络,侵权请联系删除):

概念如下:

  • 直接区域:直接指向区块号码对照,那么12条记录能够直接获取区块号码;
  • 一间接:使用一个区块来记录区块号码;
  • 双间接:第一个区块仅指出下一个记录编号的区块;
  • 三间接:依次类推,使用第三块区号记录编号。

也就说如果文件少于12条区块记录,inode本身就可以记录;如果大于12条记录,那么就需要借用区块来记录编号。

以4096B(4K)大小的区块来计算系统单个最大文件限制:

  • 12个直接指向:12*4K=48K,也就是12个区块的大小
  • 一个间接:1024*4K=4096K,一个区块大小为4K,因此可以记录4096B/4B=1024条记录,也就是可以指向1024个区块。
  • 双间接:1024*1024*4K=1024²*4K=4096MB
  • 三间接:1024*1024*1024*4K=1024³*4K=4096GB
  • 总大小约等于4TB

这时候你可能比较好奇,书上指出当block大小为4K时单个文件大小上限是2TB,那是因为Linux内核中对单文件上限upper_limit做了2T的限制,所以块大小为4k时,单文件最大为2T。

如果block大小为1K,那么就是256*256*256*1K=16384MB=16GB


「 文章如果对你有帮助,请点个赞哦^^ 」 

4+