第八章(1)

EXT2文件系统

  • 磁盘组成

圆形的盘片(主要记录数据的部分)

机械手臂与机械手臂上的磁头(可读写盘片上的数据)

主轴马达,可以转动盘片,让机械手臂的磁头在盘片上读写数据

扇区(sector)为最小的物理存储单位,每个扇区为512bytes

将扇区组成一个圆,就是柱面(Cylinder),柱面是分区的最小单位

第一个扇区最重要,里面有磁盘主引导记录(Masterbootrecord,MBR)及分区表,其中MBR占有446bytes,而partion table则占有64

bytes

/dev/sd[a-p][1-15],为SCSI,SATA,USB,Flash等接口的磁盘文件名

/dev/ha[a-p][1-63],为IDE接口的磁盘文件名

  • 磁盘分区

所谓的磁盘分区指的是告诉操作系统"我这块磁盘在此分区可以访问的区域是由A柱面到B柱面之间的块",如此一来操作系统就能够知道它可以在所指定的块内进行文件数据的读写查等操作。磁盘分区意即指定分区的起始与结束柱面就可以。

指定分区柱面的范围,是第一个扇区的分区表中。分区表仅有64byte,因此只能记录四条分区记录。这四条记录称为主分区或扩展分区,其中扩展分区还可以再分出逻辑分区,而能被格式化的分区仅有主分区与逻辑分区。

  • 文件系统的特性

磁盘分区完后需要格式化的原因:因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统所能够利用的文件系格式。

文件系统的运行:linux操作系统的文件权限(rwx)与文件属性(所有者,群组,时间参数等)。文件系统通常会将这两部分的数据分别存放在不同的块,权限与属性放置到inode中,至于实际数据则放置到data block块中。超级块(superblock)会记录整个文件系统的整体信息,包括inode与block的总量,使用量,剩余量等。

  1. super block 记录此文件系统的整体信息,包括inode/block的总量,使用量,剩余量。以及文件系统的格式相关的信息。
  2. inode: 记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码,
  3. block:实际记录文件的内容,若文件太大时,会占用多个block

(通过inode的索引去找相应的block号码,然后排列block顺序,读取出来。)硬盘的这种数据访问方法我们称为索引式文件系统(indexed allocation)。

而U盘使用的文件系统一般为FAT格式。FAT文件系统没有inode,每一个block号码都记录在前一个block中。(链表的样子?)如果一个文件数据写入的block过于分散,那么磁盘磁头无法在磁盘转一圈就读到所有数据,因此磁盘就会多转好几圈才能完整地读取到这个文件的内容。

"碎片整理":需要碎片整理的原因就是文件写入的block太过于分散,此时文件读取性能就会变得很差,通过碎片整理将同一个文件所属的block汇合在一起,这样数据的读取会比较容易,FAT的文件系统需要经常碎片整理一下。

  • inode

Ext2就是使用这种inode为基础的文件系统

文件系统一开始就将inode与block规划好了,除非重新格式化(或利用resize2fs等命令更改文件系统的大小),否则inode与block固定后就不再变动。

鉴于将所有的inode和block放到一起,数据量大的时候很不好管理。因此Etx2文件系统在格式化的时候基本上是区分为多个块组的。每个块组都有独立的inode/block/superblock系统。如下图

在整体的规划中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装引导装载程序,这是个非常重要的设计,因为如此一来我们就能够将不同的引导装载程序安装到个别的文件系统最前端,而不用覆盖整块硬盘唯一的MBR。

data block(数据块)

data block是用来放置文件内容的地方。在ext2文件系统中所支持的block大小有1kb,2kb,4kb三种。在格式化block的大小就固定了。且每个block有编号,方便inode记录。

  • 由于block大小的区别,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。
  • 原则上block的大小与数量在格式化完后就不能改变了,除非重新格式化
  • 每个block内最多只能放置一个文件数据,如果文件大于block的大小,则一个文件会占用多个block数量,若文件小于block,则该block的剩余空间就不能够再使用了(磁盘空间会浪费)

这里注意block选的过大,可能造成磁盘空间浪费,选的过小,inode会记录过多block号码,可能导致文件系统不良的读写性能。

所以,在进行文件系统的格式化之前,先想好该文件系统预计使用情况。

inodetable(inode表格)

  • inode的内容主要是记录文件的属性以及该文件实际数据是放置在哪几号的block内。
  • 该文件的访问模式(r/w/x)
  • 该文件的所有者与组(owner/group)
  • 该文件的大小
  • 该文件创建或状态改变的时间(ctime)
  • 最近一次的读取时间(atime)
  • 最近修改的时间(mtime)
  • 定义文件特性的标志(flag),如setUID等
  • 该文件真正内容的指向。

inode的数量和大小也是在格式化的时候就已经固定了。

  • 每个inode的大小固定为128bytes
  • 每个文件都仅会占用一个inode而已。因此文件系统能够创建的文件数量与inode的数量有关。
  • 系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容。

inode/block关系分析

  • inode要记录的数据非常多,但只有128byte,而inode记录一个block号码就要花掉4byte,假如一个文件400M且每个block大小4K,那么至少要10条block号码记录。inode不可能直接记录这么多号码。系统将inode记录block号码的区域定义为12个直接,一个间接,一个双间接,一个三间接记录区。
  • 最左边为inode本身(128byte),里面有12个直接指向block号码的对照,这12个记录就能够直接取得block号码。间接就是再拿一个block来当作记录block记录block号码的记录区,如果文件太大时,就会使用间接的block来记录编号。如果文件持续长大,那么就会利用所谓的双间接,第一个block仅再指出下一个记录编号的block在哪里,实际记录的在第二个block中。三间接就是利用第三层block来记录编号。
  • 这样子inode能指定多少block。假定block大小为1k
  1. 12个直接指向12*1=12k  直接记录12条
  2. 间接:  一条号码记录4byte,指定一个block1k,所以可以记录256条记录,256*1k=256k 
  3. 双间接:第一层可以指定256个block,每个block可以指定256个号码,那么大小就是256*256*1k=256^2k
  4. 三间接:256*256*256*1k=256^3k,第一层block可以指定256个第二层,第二层可以指定256个第三层,第三层可以指定256个号码。
  5. 总计12+256+256*256+256*256*256(K)=16G
  6. 此时当block指定为1K大小时候,能容纳最大的文件为16GB。但此计算方法不能用于2k,4k的block块大小的计算。大于2k的block会受到ext2文件系统本身的限制。

superblock(超级块)

  • Superblock是记录整个文件系统相关信息的地方。没有Superblock,就没有这个文件系统了。主要记录
  • block与inode的总量
  • 未使用与已使用的inode/block数量
  • block与inode的大小(block为1k,2k,4k,inode为128bytes)
  • 文件系统的挂载时间,最近一次写入数据的时间,最近一次检验磁盘(fsck)的时间等文件系统相关的信息
  • 一个validit数值,若此文件系统已被挂载,则vaild bit为0,若未被挂载,则vaild bit为1
  • Superblock非常重要,文件系统的基本信息都在这里
  • 如果superblock死掉了,文件系统可能就需要花费很多时间去挽救。一般来说superblock的大小为1024bytes。

File system Description(文件系统描述说明)

  • 这个区段可以描述每个block group的开始与结束的block号码。以及说明每个区段分别介于哪一个block号码之间,这部分也能够用dumpe2fs查看

block bitmap(块对照表)

block bitmap中记录了空的block,系统可以快速找到没有使用的block,删除时,对应的block号码要释放出来,标志要改为"未使用中"。

inode bitmap(inode对照表)

这个其实与block bitmap是类似的功能,只是block bitmap记录的是与未使用的block号码,至于inode bitmap则是使用与未使用的inode号码。

  • 与目录树的关系

目录与文件在ext2文件系统当中如何记录数据?

  • 目录

当在linux下的ext2文件系统中新建一个目录时,ext2会分配一个inode与至少一块block给该目录。其中,inode记录该目录的相关权限与属性,并可记录分配到的那块block号码。而block则是记录在这个目录下的文件名与该文件名占用的inode号码数据。ls -li可以查看文件所占用的inode号码

  • 文件

当在linux下的ext2新建一个一般文件时候,ext2会分配一个inode与相对于该文件大小的block数量给该文件,

  • 目录树读取

文件名是记录在目录的block当中,因此当我们要读取某个文件时,就务必会经过目录的inode与block,然后才能够找到那个待读取文件的inode号码,最终才会读到正确的文件的block内的数据。

由于目录树是由根目录开始读起,因此系统通过挂载的信息可以找到挂载点的inode号码(通常一个文件系统的最顶层inode号码会由2号开始),此时就能够得到根目录的inode内容,并依据该inode读取根目录的block内的文件名数据,再一层一层地往下读到正确地文件名。

  • Ext2/Ext3文件地访问与日志文件系统的功能

新建一个文件或者目录,就需要blockbitmap及inode bitmap帮忙,那么此时文件系统行为:

  1. 先确定用户对于欲添加文件的目录是否具有w与x的权限,若有的话才能添加。
  2. 根据inode bitmap找到没有使用的inode号码,并将新文件的权限/属性写入
  3. 根据block bitmap找到没有使用的block号码,并将实际的数据写入block中,且更新inode的block指向数据
  4. 将刚才写入的inode与block数据同步更新inode bitmap与block bitmap,并更新superblock的内容

inode table与data block称为数据存放区域,super block,block bitmap,inode bitmap等区段就被称为metadata(中间数据),因为super block,inode bitmap及block bitmap的数据是经常变动的,每次添加删除编辑时都可能会影响到这三个部分的数据。

  • 日志文件系统(journaling file system)
  1. 当系统要写入一个文件时,会先在日志记录块中记录某个文件准备要写入的信息
  2. 实际写入:开始写入文件的权限与数据:开始更新meta data的数据
  3. 结束:完成数据与meta data的更新后,在日志记录块当中完成该文件的记录

猜你喜欢

转载自blog.csdn.net/weixin_42489582/article/details/86770709