1.1 磁盘组成与分区
磁盘的组成是由:圆形的盘片(主要记录数据部分)、机械手臂与机械手臂上的磁头(可读写盘片上的数据)、主轴马达可以转动盘片让机械手臂的磁头在盘片上读写数据。
因此数据的存储和读取重点在盘片,盘片的物理组成则为:扇区为最小物理存储单位主要有512Bytes和4K两种格式。将扇区组成一个圆就是柱面。现在多以扇区为最小分区单位。分区表的两种格式,现在多用GPT分区表。
1.2 文件系统特性
文件系统与操作系统的数据文件有关。文件除了文件实际内容以外其实还有很多其他属性,比如linux操作系统的文件权限和文件属性等,文件系统通常会将这两部分数据存放在不同的取快,权限和属性放置到inode中,实际数据放置到data block中。另外还有一个超级区块(super block)会记录整个我呢见系统的整体信息,包括inode和block的总量、使用量、剩余量等。
superblock:记录此filesystem的整体信息。
inode : 记录文件的属性,一个文件占用一个inode,同时记录文件所在的block号码。
block:记录文件实际内容,文件太大会占用多个block。
下图为inode/block数据存取的示意图:
文件系统先格式出inode和block,如上图,这个文件的权限和属性等是放在inode4号中,并且在inode中记录了文件实际内容是存放在2,7,13,15这四个block中的,这样就可以一下读取出来。这样的数据存取方式称为索引式文件系统。
FAT文件系统,没有inode,每个block号码是在前一个block中存储的,类似于链表,当文件写入的block太过于离散,那么文件读取的性能变得很差,这时候就需要通过磁盘重组将同一个文件所属的block汇整在一起。
1.3 linux 上的EXT2文件系统
EXT2文件系统在格式化的时候基本上是区分多个区块群组,每个区块群组都有独立的inode/block/superblock系统。如下图:
data block
data block是用来放置文件内容数据地方,在EXT2文件系统中所支持的block的大小有1K、2K、4K三种。格式化时block的大小就固定了,并且每个block都有编号,方便inode记录。由于block大小的差异会导致该文件系统所能支持的最大磁盘容量最大单一文件大小并不相同。如下图:
虽然该文件系统支持2GB以上的单一文件,但是某些应用程序并不支持。除此之外还有一些限制:原则上block的大小和数量在格式化以后就不能改变除非重新格式化,每个block最多只能放置一个文件的数据,如果文件大于block的大小会占用多个block,如果小于block那么剩余的容量不能再被使用。
inode table
inode记录的是文件的属性和文件实际数据放置在几号block。inode记录的文件数据至少有如下图的内容:
inode的数量和大小也是在格式化的时候就固定了,还有以下特性:
而inode实际记录block是通过12个直接,一个间接,一个双间接,一个三间接组成的,直接是直接记录block号,间接是通过一个block记录block号(也就是inode间接是只记录一个block,这个block并不是实际文件存放的block,这个block里面放的是实际文件存放的block的号),双间接和三间接是一样的道理。
Superblock(超级区块)
Superblock是记录整个filesystem相关信息的地方,没有Superblock就没有filesystem,记录的信息主要有:
Filesystem Description(文件系统描述说明)
这个区段用来描述每个block group的开始和结束的block的号码,用来说明每个区段分别介于哪一个block号码之间。可以用dumpe2fs来观察。
block bitmap(区块对照表)
主要作用是用来查询哪些block是空的,以及删除文件之后对应的block要修改成未使用。
inode bitmap(inode对照表)
和block bitmap类似,inode bitmap记录的是未使用的inode号码。
dumpe2fs:查询EXT家族superblock信息的指令。
如下图查询:
包含很多信息,主要分为两部分,上半部是superblock的内容,下半部是每个blockgroup的信息,
从上图能得到,Group0所占用的block从0-32767,superblock在第0号block。文件系统描述在1-2号,block bitmap在1025,inode bitmap在1041,inode table 在1057-1568等等信息。
1.4 与目录树的关系
每个文件至少会分配一个inode,并且一句文件内容大小分配block给文件使用,在权限说明中我们知道目录的内容在记录文件名,一般文件才是记录数据内容的地方,那么目录与文件在文件系统中是怎么样记录数据?
目录
当我们在linux中创建一个目录时,文件系统会分配一个inode和至少一块block给该目录,其中inode记录该目录的相关权限和属性,并记录分配到的那块block号码,而block记录在这个目录下的文件名与改文件名占用的inode号码数据,也就是说,目录所占用的block记录的是目录内的文件名与inode号码对应关系。
文件
当创建一个文件时,文件系统会分配一个inode和与相对于文件大小的block数量给该文件。
目录树读取
从上面来看,inode并不记录文件名,文件名的记录是在目录的inode中,要读取一个文件必然会经过目录的inode和block,然后才能找到待读取文件的inode号码,才能读取到正确的文件。由于目录树是从根目录开始读的,也就是系统通过挂在的信息可以找到挂载点的inde号码,此时就能能到根目录的inode内容,并且根据这个inode读取到根目录的block内的文件名数据,再一层层往下知道到正确的文件名。
filesystem大小和磁盘读取性能
当一个文件系统规划的很大时,整个文件系统上的文件就通常无法连续的写在一起,这就出现所谓的文件数据离散的问题。如果有这种情况那么可以把整个文件系统里面的数据复制出来,格式化之后再将数据重新放回去。文件系统如果太大,比如一个文件记录在文件系统的最前面和最后面的Block中,那么读取的时候,磁盘的机械手臂移动幅度过度会造成数据读取性能降低。
1.5 EXT2/EXT3/EXT4 文件的存取和日志式文件系统的功能
前面说到的只是读取,如果新建一个文件或目录文件系统的行为是:
(1)先确定使用者对欲新增文件的目录是否有w和x的权限,有才能新增。
(2)根据inode bitmap找到没有使用的inode号码,并将新文件的权限/属性写入。
(3)根据block bitmap 找到没有使用的block号码,并将实际数据写入block中,更新inode的block指向数据,
(4)将刚刚写入的inde和block数据同步更新inode bitmap 和 block bitmap,并更新superblock内容。
一般来说我们将inode table(文件的属性和文件实际数据放置在几号block)和data block(实际存放数据)称为数据存放区,而其他superblock 、inode bitmap 、block bitmap 数据经常变动,称为中介数据。
数据的不一致状态
如果文件在写入时因不知名原因造成系统中断,写入的数据仅有inode table和data block最后更新中介数据没有昨晚,,就会产生数据不一致情况,这也造就了日志式文件系统的兴起。
日志式文件系统
为了避免上述情况发生,在filesystem这家拍卖行规划出一个取快用来专门记录写入和修订文件的步骤:
(1)预备:当系统要写入一个文件时,会现在日志记录区块记录某个文件准备写入的信息
(2)实际写入:开始写入文件的权限和数据,开始更新metadata的数据。
(3)结束:完成数据与metadata的更新后,在日志记录区块中完成该文件的记录。
当数据记录出现问题时,只要去检查日志记录区块就可以。
1.6 linux文件系统的运行
所有数据都要载入内存之后CPU才能对数据进行处理,磁盘的处理速度比内存慢很多,为解决这个效率问题,linux通过一个非同步处理的方式。它的工作原理是:当系统载入一个文件到内存后,如果该文件没有被更改过,则在内存区段的文件数据设置为干净的(clean)但是如果数据被更改过,内存中数据会设置为脏的(dirty),此时所有的动作都还在内存中执行,并没有写入磁盘,系统会时不时将内存中设置为dirty的数据写回磁盘,保证数据的一致性。
文件系统和内存关系:
1.7 挂载点的意义
每个filesystem都有独立的inode/block/superblock等信息,这个文件系统要能够链接到目录树才能被我们使用,将文件系统与目录树结合的动作我们称为挂载。挂载点一定是目录,该目录是进入该文件系统的入口。因此并不是你有任何文件系统都能用,必须要挂载到目录树的某个目录后才能使用该文件系统。
1.8 其他linux支持的文件系统与VFS
linux还有支持很多文件系统格式,包括SGI和XFS等。整个linux系统文件系统都是通过VFS(virtual file system switch)再进行管理。
1.9 XFS文件系统简介
EXT支持度广但是格式化很慢,由于虚拟化应用越来越广泛,XFS适合大容量磁盘和巨型文件性能较佳。xfs就是一个日志式文件系统,主要分为三个部分,一个是数据区,一个是文件系统活动等录取以及一个实时运行区。