【鸟哥的linux私房菜-学习笔记】EXT2 文件系统

EXT2文件系统

硬盘组成

这里写图片描述

这里写图片描述

整颗磁盘的组成主要有:

圆形的盘片(主要记录数据的部分);
机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据);
主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据。

盘片上的物理组成为(假设此磁盘为单盘片):

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

将扇区组成一个圆,那就是磁柱(Cylinder),磁柱是分割槽(partition)的最小单位;

第一个扇区最重要,里面有:(1)主要启动区(Master boot record, MBR)及分割表(partition table), 其中 MBR 占有 446 bytes,而 partition table 则占有 64 bytes。

各种接口的磁盘在Linux中的文件名分别为:

/dev/sd[a-p][1-15]:为SCSI, SATA, U盘, Flash闪盘等接口的磁盘文件名;
/dev/hd[a-d][1-63]:为 IDE 接口的磁盘文件名;

磁盘分区

磁盘分区:指定分割槽的启始与结束磁柱。

分割槽的磁柱范围记录在第一个扇区的分割表中。但是因为分割表仅有64bytes,因此最多只能记录四笔分割槽的记录,这四笔记录我们称为主要 (primary) 或延伸 (extended) 分割槽,其中扩展分配槽还可以再分割出逻辑分割槽 (logical) , 而能被格式化的则仅有主要分割与逻辑分割而已。

总结:
主要分割与扩展分配最多可以有四笔(硬盘的限制)
扩展分配最多只能有一个(操作系统的限制)
逻辑分割是由扩展分配持续切割出来的分割槽;
能够被格式化后,作为数据存取的分割槽为主要分割与逻辑分割。扩展分配无法格式化;
逻辑分割的数量依操作系统而不同,在Linux系统中,IDE硬盘最多有59个逻辑分割(5号到63号), SATA硬盘则有11个逻辑分割(5号到15号)。

文件系统相关基础知识

磁盘分区完毕后还需要进行格式化(format),之后操作系统才能够使用这个分割槽。因为每种操作系统所配置的文件属性/权限并不相同, 为了存放这些文件所需的数据,因此就需要将分割槽进行格式化,以成为操作系统能够利用的『文件系统格式(filesystem)』。

比如,windows 98 以前的微软操作系统主要利用的文件系统是 FAT (或 FAT16),windows 2000 以后的版本有所谓的 NTFS 文件系统,至于 Linux 的正统文件系统则为 Ext2 (Linux second extended file system, ext2fs)这一个。此外,在默认的情况下,windows 操作系统是不会认识 Linux 的 Ext2 的。

文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。

每个 inode 与 block 都有编号,至于这三个数据的意义可以简略说明如下:

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

由于每个 inode 与 block 都有编号,而每个文件都会占用一个 inode ,inode 内则有文件数据放置的 block 号码。 因此我们是通过文件的inode来索引文件的数据内容的。

而FAT文件系统中没有inode,每个 block 号码都记录在前一个 block 当中,读取的时候是串行的,所以速度比较慢,特别是block比较分散时,因此需要偶尔进行“碎片整理”。

Linux 的 EXT2 文件系统(inode)

文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用 resize2fs 等命令变更文件系统大小),否则 inode 与 block 固定后就不再变动。但是如果仔细考虑一下,如果我的文件系统高达数百GB时, 那么将所有的 inode 与 block 通通放置在一起将是很不智的决定,因为 inode 与 block 的数量太庞大,不容易管理。

因此 Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。

这里写图片描述

data block (数据区块)

data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。

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

Ext2 文件系统的 block 的基本限制如下:

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

**目录档案中的block存放子目录的路径。

inode table (inode 表格)

基本上,inode 记录的文件数据至少有底下这些:

该文件的存取模式(read/write/excute);
该文件的拥有者与群组(owner/group);
该文件的容量;
该文件创建或状态改变的时间(ctime);
最近一次的读取时间(atime);
最近修改的时间(mtime);
定义文件特性的旗标(flag),如 SetUID...;
该文件真正内容的指向 (pointer);

inode 的数量与大小也是在格式化时就已经固定了,它的特点:

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

inode 要记录的数据非常多,但只有 128bytes 而已, 而 inode 记录一个 block 号码要花掉 4byte ,为此我们的系统将 inode 记录 block 号码的区域定义为12个直接,一个间接, 一个双间接与一个三间接记录区。

这里写图片描述

上图最左边为 inode 本身 (128 bytes),里面有 12 个直接指向 block 号码的对照,这 12 笔记录就能够直接取得 block 号码! 至于间接就是再拿一个 block 来当作记录 block 号码的记录区,如果文件太大时, 就会使用间接的 block 来记录编号。同理,如果文件持续长大,那么就会利用所谓的双间接,第一个 block 仅再指出下一个记录编号的 block 在哪里, 实际记录的在第二个 block 当中。依此类推,三间接就是利用第三层 block 来记录编号!

Superblock (超级区块)

他记录的信息主要有:

block 与 inode 的总量;
未使用与已使用的 inode / block 数量;
block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128 bytes);
filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;
一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。

事实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock , 而若含有 superblock 则该 superblock 主要是做为第一个 block group 内 superblock 的备份。

指令dumpe2fs可查询superblock的内容

**inode bitmap, block bitmap记录了inode和block的使用情况。

文件系统与目录树的关系

目录

创建一个目录时, ext2 会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。

ls -i:查看文件的inode号码

目录树读取

由于文件的信息是存放在目录的block中,所以新增/删除/更名文件名与目录的 w 权限有关,而与档案本身的权限无关。

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

数据的不一致状态

我们在新建or删除档案时,superblock,inode bitmap, block bitmap需要变动,如果未来得及变动就断电了,就会出现数据不一致的故障。

日志式文件系统(如EXT3)

为了避免上述提到的文件系统不一致的情况发生,我们的前辈们想到一个方式, 如果在我们的 filesystem 当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤, 那不就可以简化一致性检查的步骤了?也就是说:

预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
实际写入:开始写入文件的权限与数据;开始升级 metadata 的数据;
结束:完成数据与 metadata 的升级后,在日志记录区块当中完成该文件的纪录。

Linux 文件系统的运行

如果我们常常读写一个大文件,则可能要进行频繁的磁盘读写,影响效率。

为了解决这个效率的问题,Linux 使用的方式是异步处理 (asynchronously) :

当系统加载一个文件到内存后,如果该文件没有被更动过,则在内存区段的文件数据会被配置为干净(clean)的。 但如果内存中的文件数据被更改过了,此时该内存中的数据会被配置为脏的 (Dirty)。此时所有的动作都还在内存中运行,并没有写入到磁盘中! 系统会不定时的将内存中配置为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。 你也可以利用sync命令来手动强迫写入磁盘。

挂载点的意义 (mount point)

每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为『挂载』。

挂载点一定是目录,该目录为进入该文件系统的入口。 因此并不是你有任何文件系统都能使用,必须要『挂载』到目录树的某个目录后,才能够使用该文件系统的。

我们可以通过ls -lid 查看档案信息,其中第一个是inode号码,第三个是挂载点。通过挂载点号码可以判断是否同一个文件系统,通过inode号码可以判断是否为同一个文件(前提是同一个文件系统)

Linux VFS (Virtual Filesystem Switch)

整个 Linux 的系统都是透过一个名为 Virtual Filesystem Switch 的核心功能去读取 filesystem 的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值