ext2文件系统(附dumpe2f命令),inode,区块,日志式文件系统,文件系统运行时与内存的异步处理、VFS、XFS

一、文件系统分类

  • 我们知道每种操作系统能够使用的文件系统并不相同
  • 例如
    • FAT(或FAT16):Windows 98以前的微软操作系统主要是用的文件系统。U盘通常也使用这个文件系统
    • NTFS:Windows 2000以后的版本使用
    • ext2:Linux的正统文件系统(默认情况下,Windows操作系统不支持ext2文件系统)

二、文件系统的分区特性

  • 传统的磁盘与文件系统应用中
    • 一个分区就能够被格式化成为一个文件系统
    • 所以说一个文件系统就是一个硬盘分区
  • 新技术下的文件系统
    • 由于新技术的利用。例如我们常听到的LVM与软件磁盘列阵
    • 这些新技术可以将一个分区格式化成为多个文件系统(例如LVM),也可以够将多个分区合并成一个文件系统(例如LVM,RAID)
    • 所以,目前我们在格式化时已经不再说成针对硬盘分区来格式化了,通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区

三、文件系统是如何运行的

  • 文件系统的运行与操作系统的文件有关
  • 文件系统通常将文件数据放在不同的区块:
    • inode:记录文件的权限(rwx等)与属性(拥有者、用户组等),同时记录此文件的数据所在的区块号码。一个文件占用一个inode
    • 数据区块:实际记录文件内容的地方。若文件太大时,会占用多个区块
    • 超级区块:记录此文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量,自己文件系统的格式与相关信息等
  • inode与数据区块的联系inode与数据区块都有编号。每个文件都只会且至多占用一个inode,inode里面记录了文件的数据区块编号。如果知道了文件的inode的话,自然就会知道这个文件所放置数据的区块号码,当然也就能够读出该文件的实际数据,这是个比较有效率的做法

四、文件系统数据存取的方法

索引式文件系统

  • 假设一个文件的属性与权限数据是放置在inode 4号,而这个inode记录了文件数据的实际放置点为2、7、13、15这4个区块号码。此时操作系统就能够据此来排列磁盘的读取顺序,可以一口气将4个区块内容读出来

FAT文件系统

  • FAT文件系统格式的文件系统没有inode存在,所以没有办法将这个文件所有区块在一开始就读取出来。每个区块号码都记录在前一个区块当中,存取文件时,依次读取。
  • 缺点:这种方式不能一次性知道文件数据存放在哪里,它要一个一个的将区块读取完之后,才会知道下一个区块在何处。如果一个文件数据写入的区块太分散,则我们的磁头无法在磁盘转一圈就能够读到所有的数据,效率低

五、碎片整理

  • 碎片整理的原因:文件写入的区块过于离散,此时文件读取的性能就会变得很差。这时就需要通过碎片整理将同一个文件所属的区块集合在一起,这样数据的读取会比较容易
  • 适用于:FAT的文件系统需要不时地碎片处理一下。ext2是索引式文件系统,基本上不太需要进行碎片处理
  • 前前面文章我们介绍过:
    • 文件系统中inode记录的是文件的属性与权限。数据区块记录的是文件的实际内容
    • 文件系统一开始就将inode与数据区块规划好了,除非重新格式化(或利用resize2fs等命令修改其大小),否则inode与数据区块固定后就不再变动

六、异步处理

  • 在计算机概论中,我们介绍过,所有的数据要写到内存中才能够被CPU处理。如果,数据不断地在内存与磁盘简进行写入和读取,会导致效率很低,因此,部分数据没有直接写入硬盘,而是存在内存中,等到后面一次性写入硬盘
  • 基本概念:当系统加载一个文件到内存中后
    • 如果该文件没有被修改过,则在内存区段的文件数据会被设置为“干净”(clean)
    • 如果内存中的文件数据被更改过,则此文件数据会被设置为“脏的”(dirty),此时所有的操作都还在内存中执行,并没有写入到磁盘中
    • 系统会时不时的将内存中的dirty数据写回磁盘,以保持磁盘与内存数据的一致性。(当然,你也可以使用sync命令将数据强制写入磁盘)
  • Linux文件系统与内存的关系:通过上面我们可以了解到,Linux文件系统与内存有很大的关系,关系如下
    • 系统会将常用的文件数据放置到内存的缓冲区,以加速文件系统的读写操作
    • 承上,因此,Linux的物理内存最后都会被用光,这是正常的情况,可加速系统性能
    • 你可以手动使用sync命令来强制内存中设置为dirty的文件会写到磁盘中
    • 若正常关机,关机命令会主动调用sync来将内存的数据会写入磁盘中
    • 若不正常关机,由于数据尚未会写到磁盘中,因此重新启动后可能会花很多时间在进行磁盘校验,甚至可能导致文件系统的损坏(非磁盘损坏)

七、ext2文件系统

  • 简介:ext2是Linux的标准文件系统
  • 组成:ext2文件系统格式化的时候基本上是区分为多个区块群组,每个群组都有独立的inode、数据区块、超级区块系统等
    • 启动扇区(boot sector):每个群组最前面有一个启动扇区,这个启动扇区可以安装启动引导程序。这是个很重要的设计,因此我们可以将不同的启动引导程序安装到别的文件系统的最前端,而不用覆盖整块磁盘唯一的MBR,这样才能够制作出多重引导的环境
    • 区块群组(block group):文件系统的一部分,其又由6个主要的部分组成,下面一一介绍

  • 区块群组分为:超级区块、文件系统描述、区块对应表、inode对应表、inode表、数据区块
  • 按其属性分为:
    • 数据存放区域:inode表与数据区块(都用来存放记录与数据)
    • 元数据:超级区块、区块对照表、inode对照表、文件系统描述(文件每次新增、删除、编辑都会影响到这几个区域,因此成为元数据)

data block(数据区块)

  • 概念:实际存放数据的地方
  • 特点
    • 在格式化时,每个数据区块都已经固定大小了,且每个区块都有编号,方便inode记录
    • 在ext2文件系统中所支持的区块大小有1K、2K、4K三种。不同的区块大小决定了文件系统能够支持的最大磁盘容量与最大单一文件容量。其限制特点如下表
数据区块大小1KB2KB4KB
最大单一文件限制16GB256GB2TB
最大文件系统总容量2TB8TB16TB
  • 原则上,区块大小与数量在格式化完就不能够再修改(除非重新格式化)
  • 每个区块内最多只能放置一个文件的数据
  • 承上,如果文件大小大于区块大小,则一个文件会占用多个区块
  • 承上,如果文件大小小于区块大小,则该区块的剩余容量就不能够再被使用(造成磁盘空间浪费)

inode table(inode 表)

  • 记录的内容有:
    • 该文件的读写属性(r、w、x)
    • 该文件的拥有者与用户组
    • 该文件的大小
    • 该文件建立或状态改变的时间(ctime)、最后一次读取的时间(atime)、最近修改的时间(mtime)
    • 定义文件特性的标识(flag),如Set UID
    • 该文件真正内容的指向
  • 特点
    • 每个inode大小均固定为128B(新的ext4与xfs可设置到256B)
    • inode记录一个数据区块使用4B
    • 每个文件都仅会占用一个inode而已(因此每个文件系统能够建立的文件数量用户inode的数量有关)
    • 系统操作文件时需要先找到inode,并分析inode所记录的权限与用户是否符合。若符合才操作区块的内容

inode结构图

  • 上面介绍过,ext2下每个inode大小均为128B,而inode记录一个数据区块使用4B,假设一个文件有400MB且每个数据区块为4K,那么至少有十万个区块的记录。那么inode如何记录这些信息哪?下面介绍我们的inode结构图
  • inode由下面部分组成:
    • 文件权限/属性等记录区域
    • 记录区域号码的区域(又分为12个直接、1个间接、1个双间接、1个三间接)

è¿éåå¾çæè¿°

  • 我们以1KB大小的数据区块来说明
    • 12个直接指向:12*1K=12K
    • 1个间接:256*1K=256K(每条区块号码记录会使用4B,因此1K的大小能够记录256条记录)
    • 1个双间接:256*256*1K=256^{2}K
    • 1个三间接:256*256*256*1K=256^{3 }K
    • 相加得:12+256+256^{2}+256^{3 }(K)=16GB
  • 由此,我们验证了上面的说法,1KB的数据区块能够容纳的最大文件为16GB

超级区块(super block)

  • 记录的内容有
    • 数据区块与inode的总量
    • 未使用与已使用的inode与数据区块的数量
    • 数据区块与inode的大小(data block分为1K或2K或4K,inode分为128B或256B)
    • 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验硬盘的时间等文件系统的相关信息
    • 一个有效位数值:若此文件系统已被挂载,则有效位为0。若此文件系统未被挂载,则有效位为1
  • 特点
    • 没有超级区块,可就没有这个文件系统
    • 一般来说,超级区块的大小为2014B
    • 每个区块群组可能含有超级区块,也可能不含有
  • 注意:一个文件系统仅有一个超级区块,为什么上面说每一个区块群组都可能含有区块群组哪?原因:若一个区块群组中的超级区块作为主区块,则其他群组内的超级区块将作为备份。这样超级区块受损时,就可以进行超级区块的恢复

文件系统描述说明

  • 功能:
    • 用来描述每个区块群组的开始与结束的区块
    • 以及说明每个区段(超级区块、对照表、inode 对照表、数据区块)分别介于哪一个区块之间,这部分能够用dumpe2fs来观察

区块对照表

  • 功能:
    • 记录使用与未使用的区块号码
    • 当你新增文件时,区块对照表会告诉哪个区块是空的,可以存放数据,这样你就可以很快的找到可使用的空间来处理文件
    • 如果你删除文件时,那么这些文件原来占用的区块号码就要释放出来。此时区块对照表就会将该区块号码的标志修改为“未使用的”

inode对照表

  • 功能:
    • 与区块对照表的功能类似
    • 区块对照表记录的是使用与未使用的区块号码,inode对照表记录的则是使用与未使用的inode号码

八、dumpe2fs命令

  • 功能:查询ext文件系统的设备的详细信息
  • 格式:
dumpe2fs  [选项]  设备文件名
  • 参数
    • -b:列出保留为坏道的部分(一般用不到)
    • -h:仅列出超级区块(superblock)的数据,不会列出其他数据

九、新建、读取一个目录或文件的步骤与区别

目录

  • 当建立一个目录时,文件系统会分配一个inode与至少一个区块给目录
  • inode
    • 记录该目录的权限与属性
    • 记录该目录分配到哪个区块的号码
  • 区块
    • 记录这个目录下的各个文件名(重点:因此inode不会记录文件名,文件名是记录在目录的区块中)
    • 目录下各文件的inode号码
  • 举例:我们可以使用 ls -li 命令查看目录下个文件/目录的inode号码

文件

  • 文件的结构特点,在上面已经介绍了

十、读取一个目录或文件的步骤

  • 通过前面的文章可以知道,inode记录文件/目录的属性与权限
  • 下面我们以读取/etc/passwd文件做一个介绍。我们先列出/  /etc  /passwd三者的inode号

  • 上图步骤
    • 使用dongshao账号去读取时,dongshao一直属于其他人
    • 先找到/的inode号码为2,规定其他人有r-x权限,dongshao可以读取并进去
    • 再找到/etc的inode号码为393217,规定其他人有r-x权限,dongshao可以读取并进入
    • 再找到/etc/passwd的inode号码为400379,规定其他人有r--权限,因此dongshao可以读取

十一、新建一个目录或文件的步骤

  • 通过上面介绍,我们知道了解了区块对照表与inode对照表的功能。那么,当我们去新建一个文件/目录时,就要借助到区块对照表与inode对照表了
  • 新建文件/目录时的步骤:
    • 先确定用户对于新增文件的目录是否具有w与x权限。有的话才能新增
    • 根据inode对照表找到没有使用的inode号码,并将新文件/目录的属性/权限写入
    • 根据区块对照表找到没有使用的区块号码,并将实际的数据写入区块中,且更新inode的区块指向数据
    • 将刚刚写入的inode区块数据同步更新到inode对照表与区块对照表,且更新超级区块的内容
  • 区块群组按其属性分为:
    • 数据存放区域:inode表与数据区块(都用来存放记录与数据)
    • 元数据:超级区块、区块对照表、inode对照表、文件系统描述(文件每次新增、删除、编辑都会影响到这几个区域,因此成为元数据)

十二、日志文件系统

为什么要使用日志式文件系统?

  • 我们使用ext2文件系统中的一种文件变动情况来说明
    • 当我们对文件进行操作时,出现了特殊情况(例如突然断电、系统内核发生错误等),那么写入的数据仅有inode对照表以及数据区块而已,最后一个同步更新元数据的步骤并没有完成,此时就会发生数据的内容与实际数据存放区不一致的情况
    • 早期的ext2文件系统中,如果发生了这种情况,那么系统在重新启动时,就会借助由超级区块当中记录的有效位(是否挂载)与文件系统状态(正确卸载与否)等状态来判断是否强制进行数据一致性的检查,若需要检查则以e2fsck这个程序来进行
    • 不过,这个检查真的是很浪费时间,因为要针对元数据区域与实际数据存放区来进行对比,得要检查整个文件系统,十分的浪费时间
    • 因此,为了更好的优化上面会出现的情况,就有了日志式文件系统

日志式文件系统

  • 概念:为了避免上述提到的文件系统不一致的情况发生,文件系统当中规划出了一个区块,该区块专门用于记录写入或修改文件时的步骤
  • 记录步骤:
    • 预备:当系统要写入一个文件时,会现在日志记录区块中记录某个文件准备要写入的信息
    • 实际写入:开始写入文件的权限与数据。并更新元数据中的数据
    • 结束:完成数据与元数据的更新后,在日志记录区块当中完成该文件的记录
  • 优点:有了日志文件后,万一数据的记录在中途发生错误,我们的系统只要去检查日志记录区块就可以了。这就是日志式文件最基础的功能
  • 常见的日志式文件系统:ext3、ext4、ReiserFS、Windows' NTFS、IBM's JFS、SGI's XFS、ZFS

十三、其他Linux支持的文件系统

  • 常见的支持的文件系统有:
    • 传统文件系统:ext2、minix、FAT(用vfat模块)、iso9660(光盘)等
    • 日志式文件系统:ext3、ext4、ReiserFS、Windows' NTFS、IBM's JFS、SGI's XFS、ZFS
    • 网络文件系统:NFS、SMBFS
  • 查看你的Linux所支持文件系统,可以查看:ls -l /lib/modules/$(uname -r)/kernel/fs
  • 系统目前以加载到内存中支持的文件系统有:cat /proc/filesystems

十四、VFS

  • 常见的支持的文件系统有:
    • 传统文件系统:ext2、minix、FAT(用vfat模块)、iso9660(光盘)等
    • 日志式文件系统:ext3、ext4、ReiserFS、Windows' NTFS、IBM's JFS、SGI's XFS、ZFS
    • 网络文件系统:NFS、SMBFS
  • 查看你的Linux所支持文件系统,可以查看:ls -l /lib/modules/$(uname -r)/kernel/fs
  • 系统目前以加载到内存中支持的文件系统有:cat /proc/filesystems
  • 概念:Linux的内核功能,用于读取文件系统
  • 特点:整个Linux识别的文件系统其实都是VFS在进行管理,我们用户并不需要知道每个硬盘分区上面的文件系统是什么,VFS会主动帮我们做好读取的操作
  • VFS文件系统的示意图:

十五、XFS

介绍xfs文件系统之前,与ext系统做一个简单的比较

  • ext文件系统(支持度最广、但格式化超慢):ext系列的文件系统,在文件格式化时,采用的是规划出所有的inode、区块、元数据等数据,未来系统可以直接使用,不需要再进行动态配置,但是这个做法在早期磁盘容量还不大的时候可以使用。如今,磁盘的容量越来越大,连传统的MBR都已经被GPT取代。当使用磁盘容量在TB以上的传统ext系列文件系统在格式化的时候,会消耗相当多的时间
  • xfs文件系统(容量高,性能佳):由于虚拟化的应用越来越广泛,虚拟化磁盘来源的举行文件越来越常见,这些巨型文件在处理上考虑到刑恩那个问题,因此xfs比较适合高容量磁盘与巨型文件,且性能较佳的文件系统、

XFS文件系统

  • 配置:几乎所有ext4文件系统有的功能,xfs都具备。xfs文件系统在数据的分布上,主要规划为3个部分
    • 数据区(data section)
    • 文件系统活动登录区(log section)
    • 实时运行区(realtime section)

数据区(data section)

  • 概念:
    • 与之前文章谈到过的ext文件系统一样,包括inode、数据区块、超级区块等数据都存储在这里
    • 这个区域类似于ext文件系统的区块群组,不过xfs将这个区域分为多个存储区群组(allocation groups,AG)来分别放置文件系统所需要的数据
    • 重点:inode与区块都是系统需要用到时才动态配置产生,因此格式化操作很快
  • 存储区群组包含了:
    • 整个文件系统的超级区块
    • 剩余空间的管理机制
    • inode的分配与追踪
  • 与ext不同之处:xfs的区块容量与inode容量有多种不同的容量可供设置
    • 区块容量:可在512B-64KB之间调整(不过,在Linux环境下,由于存储控制的关系(页面文件pagesize的容量之故),因此最高可以使用的区块大小为4k。如果设置、高了也没问题,但是Linux内核不给挂载,格式化完之后也无法使用)
    • inode:容量可在256B-2MB之间,不过保留256B默认值就够用了

文件系统活动登录区(log section)

  • 概念:
    • 这个区域主要用来记录文件系统的变化,有点像是日志区
    • 文件的变化都会在这里被记录下来,直到该变化完整地写入到数据区后,该条记录才会被结束
    • 如果文件系统因为某些缘故而损坏时,系统会拿这个登录区块来进行检测,看看系统挂掉之前,文件系统正在运行写啥操作,借以快速地修复文件系统
  • 注意:
    • 因为系统所有讲的操作都会在这个区块做记录,所以这个区块的磁盘活动相当的频繁
    • 另外,xfs设计这个区域中,可以指定外部的磁盘来作为xfs文件系统的日志区块。(例如:你可以将SSD磁盘作为xfs的登录区,这样可以更快速地工作)

实时运行区(realtime section)

  • 概念:当文件要被建立时,xfs会在这个区段里面找到一到数个extent区块,将文件放置在这个区块内,等到分配完毕后,再写入到数据区的inode与区块中
  • extent区块:
    • extent区块的大小在格式化的时候就已经指定好了
    • 最小值是4K,最大可达1G。一般非磁盘列阵的磁盘默认为64KB
    • 这个extent最好不要乱动,因为会影响到磁盘性能

xfs_info命令

  • 功能:查看xfs文件系统的超级区块内容
  • 格式:xfs_info 挂载点/设备文件名

  • 我是小董,V公众点击"笔记白嫖"解锁更多【Linux入门基础】资料内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值