您的位置:首页 > 运维架构 > Linux

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

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

文件系统通常会将文件权限和文件属性这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管理所有文件系统,省去我们自行设置读取文件系统的定义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息