1.Linux的文件系统特性
linux的正统文件系统是ext2,对于linux 的文件通常除了实际内容外,通常含有非常多的属性,例如文件权限(rwx)和文件属性(拥有者、用户组、时间参数等)。文件系统通常会将这两部分存放到不同的区块,权限和属性放到inode(unix系统中的一种数据结构)中,而实际的数据放入数据区块中。除此之外,还有一个超级区块(super block)会记录整个文件系统的整体信息,包括inode、数据区块的总量,使用量,剩余量。
linux的文件系统是采用索引式的文件系统,如下图例如某个文件的inode为1,inode会记录文件的世纪内容在区块4,7,13中,这样linux就可以方便的读取出文件的内容。这种文件系统的好处在于读取速度较快,但是牺牲了部分存储空间用来存放block的区号。

除了索引式文件系统之外,像我们平时采用的U盘是采用FAT文件系统,这种文件系统没有inode,每一个数据区块都记录了到下一个区块的号码,因此它的读取方法类似1->4->7->13。因为这种特性,文件系统只能一个区块一个区块读出来,但是如果文件太过于分散,消耗的时间就会很多。因此,需要经常的进行碎片整理,将同一个文件所属的区块集合在一起。

2.linux的ext2文件系统
文件系统在一开始就将inode和数据区块规划好了,除非重新格式化,否则inode与数据区块固定后就不再变动。并且采用多个区块群组的方式。每个区块群组都有独立的inode,数据区块,超级区块系统。

1.数据区块(data block)
数据区块是用来放置文件数据的地方,ext2文件系统中支持的区块大小有1k,2k,4k三种。在格式化时区块的大小就固定了,且每个区块都有区号。要注意的一点是,不同的区块大小所支持的最大文件系统容量和最大单一文件容量并不相同。
Block大小 | 1KB | 2KB | 4KB |
---|---|---|---|
最大单一文件限制 | 16GB | 256GB | 2TB |
最大磁盘容量限制 | 2TB | 8TB | 16TB |
除此之外,ext2文件系统的区块还有一些限制
- 区块的大小和数量在格式化完成之后无法修改
- 每个区块内最多只能放置一个文件的数据
- 如果文件大于区块的大小,一个文件将占用多个区块
- 如果文件小于区块的大小,该区块的剩余容量将无法被使用(被浪费)
所以,如何选择区块大小也是一门学问。如果我们的系统需要存放很多大的文件,而选择了较小的区块,就会占用过多的区块,降低读写性能。如果我们选择较大的区块,而小文件太多则会浪费过多的磁盘空间。
2.inode表(inode table)
上面我们已经提到inode将会记录文件的属性、权限和该文件实际内容存放信息。基本上,inode 记录数据如下所示
- 文件的读写属性(read,write,excute)
- 文件的拥有者和用户组(owner, group)
- 文件的大小
- 文件的时间参数(ctime, atime, mtime)
- 文件的特性标识(SUID, SGID等)
- 文件实际内容的指向
除此之外,inode还有一些特点
- 每个inode的大小固定128B
- 每个文件只会有一个inode
- 文件系统建立的文件数量与inode的数量有关
- 文件系统读取文件时要先找到inode,分析inode所记录的权限和用户是否相符,若符合再读取区块内容
可能会有一个疑问,inode的大小只有128B,但是记录一个数据区块就需要4B(指针的大小),好像能存储的数据非常小,那遇到很大的文件怎么记录呢?ext2文件系统很聪明的将记录区块的区域定义为12个直接,一个间接,一个双间接,一个三间接记录区。

我们可以计算一下一个inode最大能记录的文件大小,以1KB的区块为例子
- 12个直接记录区:\(12\times 1K = 12K\)
- 1个间接记录区:\(1K\times \frac{1K}{4B}= 256K\)
- 1个双间接记录区:\(1K \times (\frac{1K}{4B})^2 = 256^2K\)
- 1个三间接记录区:\(1K\times(\frac{1K}{4B})^3 = 256^3K\)
将四个记录相加\(12K+256K+256^2K+256^3K = 16GB\),与上文我们的表格1K对应的最大单一文件容量是相符的。
3.超级区块(super block)
超级区块是记录整个文件系统相关信息的地方,主要记录
- 数据区块与inode的总量
- 未使用与已使用的inode与数据区块数量
- 数据区块与inode的大小
- 文件的挂载时间,最近一次写入数据的时间,最近一次校验磁盘的时间等文件系统的相关信息
- 一个有效位信息,记录文件是否被挂载
4.文件系统描述(filesystem description)
用于描述每个区块群组的开始和结束的区块,和每个区段分别介于哪一个区块之间。
5.inode和区块对照表(inode/block bitmap)
用来记录哪些区块或者inode是空的,便于新建文件。在删除文件的时候,也会将对照表中对应位置标记为未使用。
6.dumpe2fs
:查询ext系列超级区块信息的命令
这是我在我的云服务器(centOS 6)上运行之后的截图
3.Linux的XFS文件系统
为什么CentOS要从ext文件系统xfs文件系统?
ext文件系统在linux上支持度较为完整,但是在当下磁盘容量越来越大的情况下,每一次格式化都是预先分配全部的inode和区块将会耗费大量的时间。特别是在虚拟化应用越来越广泛的当下,作为虚拟化磁盘来源的巨型文件(单一文件都好几十个G)也越来越常见,这种巨型文件在处理上需要考虑性能问题。因此从CentOS 7.x开始,文件系统已经转向xfs这种适合高容量磁盘和巨型文件,且性能较佳的文件系统。
XFS文件系统
XFS文件系统也是一个日志式文件系统,在数据的分布上,分为数据区(data section),文件系统活动登录区(log section),实时运行区(realtime section)
-
数据区(data section)
XFS的数据区和我们之前谈到的ext系列一样,包括inode,数据区块,超级区块等数据。这个数据区也和ext系列的快组类似,也分为多个块组,不过xfs称作AG(allocation groups)。并且它的inode和区块都是需要时才进行动态分配,因此格式化操作很快。
-
文件系统活动登录区(log section)
也称作日志区,文件的变化会记录下来,知道该变化完整地写入数据区后,该条记录才会结束。如果文件系统因为某些缘故而损坏,系统会检验这里,看看在系统down掉之前,文件系统正在进行的操作。这样可以保证文件系统的一致性
因为系统所有文件操作都会记录在这个区块,因此这个区块的磁盘活动非常频繁,一般会采用SSD作为XFS的日志区。
-
实时运行区(realtime section)
当有文件要被建立时,XFS会在这个区段里面找到数个extent区块,将文件放置在这个区块内,等到分配结束,再写入data section的inode和数据区块里。