Linux文件系统基础认识

一、概述

        Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。
        常见的文件系统类型有ext2、ext3、ext4、XFS和BTRFS,其中ext2为Linux的正统文件系统

二、文件系统存储结构

        对于操作系统中的每一个文件来说,除了含有文件实际内容外,通常还包括非常多的属性,例如Linux操作系统的文件权限(rwx)与文件属性(拥有者、用户组、时间参数等)。那么在Linux中文件系统是如何存储这些数据的呢?
        通常,文件系统会将这些数据分别存放在不同的区块中,这种存取数据的方法被称为索引式文件系统。具体存取方法如下:

区块存放内容
超级块记录此文件系统的整体信息,包括 inode 与数据区块的总量、使用量、剩余,以及文件系统的格式与相关信息等
inode记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的区块号码
数据区块实际记录文件的内容,若文件太大时,会占用多个区块

        由于每个 inode 和数据区块都有编号,而每个文件都会占用一个 inode,inode 内则有文件数据放置的区块号码。因此如果我们能够找到文件的 inode 的话,那么自然就会知道这个文件所放置数据的区块号码,当然也就能够读出该文件的实际数据了。这是个比较有效率的做法,因为如此一来我们的磁盘就能够在短时间内读取出全部的数据,读写性能比较好。
        对于我们生活中常用的U盘来说,它使用的文件系统一般为FAT格式。FAT这种格式的文件系统并没有 inode 存在,所以FAT没有办法将这个文件的所有区块在一开始就读取出来。由于每个区块号码都记录在前一个区块当中,所以在读取时,它要一个一个地将区块读出后,才会知道下一个区块在何处。如果同一个文件数据写入的区块太分散,则我们的磁头将无法在磁头转一圈就读到所有的数据,因此磁盘就会多转好几圈才能完整地读取到这个文件的内容。
        在实际的文件操作中,当文件写入的区块太过于离散时,此时文件的读写性能将会变得很差。为了解决这一问题,我们可以通过碎片整理将同一文件所属的区块集合在一起,这样数据的读写会比较容易。因此,FAT的文件系统需要不时地碎片整理一下,但由于ext2是索引式文件系统,所以基本上不太需要进行碎片整理。

三、文件存储结构

        在Linux中,大部分的文件系统(如ext2、ext3)规定,一个文件由以下几个部分组成:

组成意义
目录项包括文件名和与该文件名对应的 inode 节点号
inode又称文件索引节点,包括文件的基本信息以及数据块的指针
数据块包括文件的具体内容

        在Linux系统内部,对文件的操作并不是通过文件名来完成的,而是使用 inode 节点号来实现。对于系统来说,文件名只是 inode 节点号便于识别的别称或者绰号,而能唯一识别文件的是其 inode 节点号。

1. 创建文件的步骤
  • (1)存储属性
            内核先找到一块空的 inode 节点(如64),并把文件的信息记录到其中。
  • (2)存储数据
            假如该文件需要存储在三个数据块,那么内核找到三个空闲块(如100,300,500)后,再将内核缓冲区的第一块数据拷到100这个数据块中,后面以此类推。
  • (3)记录分配情况
            文件数据被保存到了三个数据块中,为了后续使用,所以必须要记录起来。内核会将分配情况记录在文件 inode 节点中的磁盘序号列表里。
  • (4)添加文件名到目录
            假如新文件的名字是test,内核则将文件的入口(64,test)添加到目录文件里。文件名和 inode 节点号之间的对应关系将文件名和文件的内容及属性连接起来,找到文件名就找到文件的 inode 节点号,通过 inode 节点号就能找到文件的属性和内容。
2. 打开文件的步骤
  • (1)系统在目录项中得到这个文件名对应的 inode 节点号;
  • (2)通过 inode 节点号,获取文件的所有信息;
  • (3)根据 inode 信息中的数据块指针,找到文件实际数据所在的数据块,读出数据。

四、ext2文件系统

        首先,在这里我们思考这样一个问题:当我们的文件系统高达数百GB时,那么将所有的 inode 与数据区块通通放置在一起将是很不明智的决定,因为 inode 与数据区块的数量太庞大,不容易管理。这就相当于把一个营的战士集中在一起进行管理,这明显是不太合理的。那么该如何解决呢?
        为了找到解决办法,我们还需了解到文件系统的一个特性。对文件系统来说,它在一开始就将 inode 与数据区块就划分好了,除非重新格式化(或利用 resize2fs 等命令修改其大小),否则 inode 与数据区块固定后就不再变动。所以解决问题的关键就是重新格式化文件系统,可是又该如何格式化呢?
        我们都知道,在军队管理上,一个营被划分成多个连,而一个连又被划分成多个排,通过这样划分的方式,人数逐级减少,从而大大降低了管理难度。对文件系统来说,我们亦可如此。一般而言,ext2 文件系统格式化的时候是区分为多个区块群组(block group),每个区块群组都有独立的 inode、数据区块、超级区块。具体情况如下图所示:

ext2文件系统示意图

        在整体的规划当中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装启动引导程序,这是个非常重要的设计,因为如此一来我们就能够将不同的启动引导程序安装到别的文件系统最前端,而不用覆盖整块磁盘唯一的MBR(Master Boot Record,主引导记录),这样也才能够制作出多重引导的环境。
        对于每一个区块群组(block group),它的六个主要内容如下:

1. 数据区块(data block)

        数据区块即存放文件实际内容的地方,在 ext2 文件系统中 所支持的区块大小有1K、2K 及 4K三种。在格式化时区块的大小就固定了,且每个区块都有编号,以方便 inode 记录。不过要注意的是,区块大小的差异,会导致该文件系统能够支持的最大磁盘容量与单一文件容量并不相同,因为区块大小而产生的 ext2 文件系统限制如下:

block 大小1KB2KB4KB
最大单一文件限制16GB256GB2TB
最大文件系统总容量2TB8TB16TB

        除此之外,ext2 文件系统的区块还有一些基本限制:

  • 原则上,区块的大小与数量在格式化完就不能再修改(除非重新格式化);
  • 每个区块内最多只能够存放一个文件的数据;
  • 承上,如果文件大于区块的大小,则一个文件会占用多个区块;
  • 承上,如果文件小于区块的大小,则该区块的剩余容量就不能再被使用了(磁盘空间会浪费)。

        如上面所说,若文件系统的区块过大,则可能会产生较严重的磁盘容量浪费;但若过小,那么一些大型的文件会占用多个数据区块,inode 也就要记录更多的区块号码信息,此时将可能造成文件系统读写性能不佳。所以,在我们对文件系统进行格式化之前,要想好该文件系统的预计使用情况,已达到最佳效果。

2. inode 表(inode table)

        如前所述,inode 记录的是文件的属性以及文件的数据所在的区块号码,基本上,inode 记录的数据至少包含以下几点:

  • 该文件的读写属性(read / write / excute)
  • 该文件的拥有者和所属组(owner / group)
  • 该文件的大小
  • 该文件建立或状态改变的时间(ctime,change time)
  • 最近一次读写的时间(atime,access time)
  • 最近修改的时间(mtime,modify time)
  • 定义文件特性的标识(flag),如SetUID
  • 该文件真实内容的指向(pointer)

        inode 的大小和数量也是在格式化的时候就固定了,这就使得 inode 有如下几点特性:

  • 每个 inode 大小均固定为 128B(新的 ext4 与 xfs 可设置到 256B);
  • 每个文件都仅会占用一个 inode ;
  • 承上,因此文件系统能够建立的文件数量与 inode 的数量有关;
  • 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合则能够读取区块的内容。
3. 超级区块(super block)

        超级区块是记录整个文件系统相关信息的地方,没有超级区块,就没有这个文件系统,它记录的信息主要有:

  • 数据区块与 inode 的总量
  • 未使用与已使用的 inode 与数据区块数量
  • 数据区块与 inode 的大小(block 为1K、2K、4K,inode 为 128B 或 256B)
  • 文件系统的挂载时间、最近一次写入数据的时间。最近一次检验磁盘的时间等文件系统的相关信息
  • 一个有效位数值,若此文件系统已被挂载,则有效位为 0;若未被挂载,则有效位为 1

        对文件系统来说,超级区块是至关重要的,因为文件系统的基本信息都存储在这里。如果超级区块遭到损坏,那么这个文件系统可能就需要花费很多时间去修复。
        一般来说,超级区块的大小为 1024B,想要获取更多信息我们可以通过 dumpe2fs 命令来查询。
        此外,每个区块群组(block group)都可能含有超级区块。但是我们也说一个文件系统应给仅有一个超级区块而已,这又是怎么回事呢?
        事实上,除了第一个区块群组内会含有超级区块之外,后续的区块群组不一定含有超级区块,而若含有超级区块则该超级区块主要是作为第一个区块群组内超级区块的备份,这样可以进行超级区块的恢复。

4. 文件系统描述(Filesystem Description)

        这部分主要描述每个区块群组的开始与结束的区块,以及说明每个区段(超级区块、区块对照表、inode 对照表、数据区块)分别介于哪一个区块之间。

5. 区块对照表(block bitmap)

        当新增某些文件时,我们需要选择空区块来记录新文件的数据,但是我们该如何确定哪些区块是空的呢?这就要通过区块对照表的辅助了。从区块对照表当中可以知道哪些区块是空的,这样我们的系统就能够很快地找到可使用的空间来处理文件。
        同样,当删除某些文件时,那么这些文件原本占用的区块号码就要释放出来,此时应该在区块对照表中将这些区块号码所对应的标志修改为【未使用】。

6. inode 对照表(inode bitmap)

        这个其实与区块对照表的功能类似,只不过区块对照表记录的是使用与未使用的区块号码,而 inode 对照表则记录的是使用与未使用的 inode 号码。




注:本文参见《鸟哥的LINUX私房菜-基础学习篇》第四版,电子版下载链接(提取码:mnhb)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值