9. Linux 磁盘与文件管理系统(inode 目录)

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

文件系统通常会将文件权限和文件属性这2部分数据分别存放在不同的块,权限和属性放置在
 inode 中,至于实际数据则存放在 data block 中。另外,还有一个 超级块(superblock),
 会记录整个文件系统的整体信息,包括inode和block的总量,使用量和剩余量等。

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

这种数据访问方法叫索引式文件系统。

U盘是FAT格式,没有 inode 存在,每个block号码记录在前一个block中。
如果 block 分散太厉害,磁盘磁头无法在磁盘转完一圈就读到所有欧数据。所以经常需要碎片整理。

Linux Ext2 文件系统

文件系统一开始就将inode和block规划好,除非重新格式。
如果inode与block的数量太大,不容易管理。

ext2 文件系统区分多个块组(block group),每个块组有独立的inode/block/superblock 系统。

文件系统的最前都有一个启动扇区,

data block :大小有,1kb,2kb,4kb.由于block大小区别,导致该文件系统能够支持的最大
磁盘容量和最大单一文件容量并不相同

block大小             1kb     2kb     4kb
最大单一文件限制        16GB    256GB   2TB
最大文件系统总容量     2TB     8TB     16TB

 - 原则上,block大小和数量在格式化后就不能被改变了
 - 每个block最多只能放置一个文件的数据
 - 如果文件大于block大小,则一个文件会占用多个block
 - 若小于block,则该block的剩余空间就不能被利用了
inodetable(inode 表格):记录文件属性和数据放在哪个block

 - 该文件的访问模式(rwx)
 - 该文件的所有者(owner/group)
 - 该文件大小
 - 文件的创建时间和改变时间(ctime)
 - 最近读取该文件的时间(mtime)
 - 最近修改时间(mtime)
 - 定义该文件的特性的标志(flag),如 SetUID - 该文件真正内容的指向(pointer)
 - 每个inode大小固定为128bytes
 - 每个文件都有占有一个inode
 - 因此,文件系统能够创建的文件数量与 inode数量有关
 - 系统读取文件时,先找到inode,并分析inode所记录的权限与用户是否符合,若符合才开
 始读取实际的block 内容

inode 记录一个block 要 4byte .所以inode 记录block的区域定义为 12个直接,1个间接,
一个双间接,和一个三间接。

所有间接,就是再拿一个block来当做block号码的记录区

1kb 的block 为例,12 + 256 + 256*256 + 256*256*256 =16GB与单一文件容量限制相同。
但不适用于2k,4k,因为ext2文件系统本身限制
superblock(超级块):

 - block 和 inode 总量
 - 未使用和已使用的 inode/block总量
 - block与inode的大小(block为 1kb,2kb,4kb,inode 为128bytes)
 - 文件系统的挂载时间,最近一次写入数据,最近一次检验磁盘(fsck)的时间等文件系统的相关信息
 - 一个validbit数值,若此文件被挂载,则valid bit 为0,若未被挂载 为 1
 - 一般来说 superblock的大小为1024bytes
 - 每个block group 都可能含有superblock,可以进行superblock救援
 - file system description(文件系统描述)
 - block bitmap(块对照表):知道哪些block为空的
 - inode bitmap(inode 对照表):未使用 的inode

df  // 查看目前挂载的设备
dumpe2fs 文件系统

这里写图片描述
这里写图片描述


与目录树的关系

目录:

当我们在ext2文件系统下创建一个目录时,ext2会分配一个inode和至少一块block给该目录。
block用来记录该目录下的文件名和该文件名占用的inode号码。
文件:

ext2 会分配一个inode 与相对于该文件大小的block数量给该文件
目录树的读取:

inode本身不记录文件名,文件名的记录是在目录的block 中。所以我们读取某个文件,就务必会经过目录的inode和block

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

这里写图片描述

例如:

 1.  / 的inode
 通过挂载点信息得到 /dev/hdc2 的inode号码为2的根目录 inode号码,且 inode 具有的
 权限让我们可以读取该 block 内容(rx)

 2.  / 的 block
经过上个步骤取得 block 号码,并找到该内容有 etc/ 目录的inode 号码(421825) 

 3.  etc/ 的inode
读取 421825 号的inode 得知具有 rx权限,因此可以读取etc/ 的block 内容
 4.  etc/ 的 block
经过上个步骤取得block号码,并且找到该内容有passwd文件的inode(424918)

 5. passwd 的inode
 读取424918号inode得知具有r权限,因此可以读取passwd的block内容

 6. passwd 的 block
 最后将该 block 内容的数据读取出来

文件系统大小与磁盘读取性能

由于硬盘上面的数据经常变动,数据只是填充式的填入没有被使用的block中。
如果填入的block太离散,因此会有文件数据离散的问题。
解决方法:重新格式化。

ext2/ext3 文件的访问与日志文件系统的功能

如果是新建一个文件或者目录, ext2 是怎么处理的呢。就需要 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 称为数据存放区域
    superblock,inode bitmap,block bitmap 为中间数据(metadata)
日志文件系统:
    在文件系统中规划出一个块,专门记录写入或者修订文件时的步骤。


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

万一数据的记录出了问题,那么我们的系统只要去检查日志记录块就知道那个文件出问题了。

这里写图片描述

通过inode8号记录journal块的block选项,而且具有4113k的容量在处理日志

Linux 文件系统的操作

由于磁盘写入的速度比内存慢很多,Linux采用异步处理(asynchronously).

当系统加载一个文件到内存后,如果该文件没有被修改过,则内存区段的文件会被标记为 clean.但如果内存中的文件数据被修改过了,此时内存中的数据会被设置为 Dirty。此时所有的操作还都在内存中执行,并没有写入磁盘。系统会不定时的将内存中设置为 dirty的数据写回磁盘,以保持磁盘与内存数据的一致性。也可以用 sync 手动强迫写回磁盘。

 - 系统会将常用的文件数据放置到主缓冲器的缓冲区,以加速文件系统的读写
 - 因此,Linux的物理内存最后都会被用光,这是正常情况,可加速系统性能
 - 你可以手动 sync强迫内存中设置为dirty的数据写回磁盘中
 - 若正常关机,关机命令会主动调用sync
 - 若不正常关机,由于数据未写回磁盘内,因此重启系统后可能会花很多时间在进行磁盘检查上,甚至可能导致文件损坏

挂载点的意义

每个文件系统都有inode,block,superblock信息,这个文件系统要能够连接到目录树才能被我们使用 。
将文件系统与目录树结合的操作我们称为挂载。

挂载点一定是目录,该目录为进入该文件系统的入口。

这里写图片描述

同一个文件系统的某个inode只会对应到一个文件内容而已。
上面的信息中,由于挂载点都为 / ,所以他们在同一个文件系统内。而inode都为2,说明是同一个文件。

Linux VFS

Linux 内核又是如何管理这些文件系统呢。是通过 Virtual Filesystem Swich(虚拟文件系统)的内核功能去读取文件系统。
用户并不需要知道每个分区上头的文件系统是什么,VFS会自动帮我们做好读取准备。
通过VFS管理所有文件系统,省去我们自行设置读取文件系统的定义。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值