1. 文件系统特性
磁盘分区完毕后需要进行格式化,之后操作系统才能够使用这个文件系统.
linux使用的正统文件系统为ext2.
文件系统不只包含文件的实际内容,还包括非常多的属性.如linux操作系统中的文件权限与文件属性.文件系统通常会将这两部分数据分别放在不同的区块,权限与属性放在inode中,文件的实际数据放置在数据区块中.另外还有一个超级区块记录整个文件系统的整体信息,包括inode与数据区块的总量,使用量,剩余量等等信息.
每一个inode与区块都有编号.
这三个数据的意义:
- 超级区块:记录此文件系统的整体信息,包括indoor与数据区块的总量,使用量,剩余量,以及文件系统的格式与相关信息
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的区块号码.
- 数据区块:实际记录文件的内容,如果文件太大,会占用多个区块.
2. linux的ext2文件系统
ext2文件系统格式化时将整个文件系统区分为多个区块群组,每个区块群组都有独立的inode,数据区块,超级区块系统.
(1). 数据区块
数据区块是用来放置文件数据的地方,在ext2文件系统中所支持的区块大小有1k,2k以及4k三种.每个区块在格式化时大小就被确定了,并且每个区块都有编号,方便inode记录.
ext2文件系统区块的限制:
- 原则上区块的大小和数量在格式化完成后就不可变了.
- 每个区块只能放置一个文件,
- 如果文件大于区块大小,则一个文件会占用多个区块.
- 如果文件小于区块,那么这个区块剩下的剩余容量就不能被使用了.
(2). inode table
一个inode记录的数据至少有以下这些:
- 该文件的读写属性
- 该文件的拥有者与用户组
- 该文件的大小
- 该文件建立或者状态改变的时间
- 最近一次的读取时间
- 最近修改的时间
- 定义文件特性的标识
- 该文件真正内容的只想
除此之外,inode的特点:
- 每一个inode大小固定为128b
- 每个文件都仅会占用一个inode
- 承上,所以文件系统能够建立的文件数量与inode数量有关
- 系统读取文件是需要先找到inode,并分析inode记录的用户权限,如果符合当前用户,通过记录的文件内容的指向找到文件的真正内容
一个inode有12个直接,一个间接指向,一个双间接和一个三间接记录区.间接指向就是指当前指向的是另一个用来存储文件编号的区块,这样可以扩展文件的大小.每个区块号码使用4b的空间.
如果一个区块可以存储1k数据,那么一个inode能存储的最大的文件为16G.
12 + (256) + (256*256) + (256*256*256)(K) = 16G
(3). Superblock
超级区块是记录整个文件系统相关信息的地方,记录的信息主要有:
- 数据区块与inode的总量
- 未使用与已使用的inode与数据区块的数量
- 数据区块与inode的大小(block为1,2,4k, inode为128或256b,具体与文件系统版本有关)
- 文件系统的挂载时间,最近一次写入数据的时间,最近一次检验磁盘的时间等等.
- 一个有效位数值,文件系统已被挂载为0,未被挂载则为1
3. 与目录树的关系
(1). 目录
当在linux下的文件系统机那里一个目录时,文件系统会分配一个inode与至少一块区块给该目录.其中inode记录该目录的相关权限与属性,和分配到的区块号码.区块记录在这个目录下的文件名与该文件名占用的inode号码数据.
(2). 文件
在linux下建立一个文件时,ext2会分配一个inode与相对该文件大小的区块数量给该文件.
(3). 目录树读取
inode本身并不记录文件名,文件名是记录在目录的区块中的,访问某个目录下的某个文件名,会现在该目录的inode中找到该目录对应的区块.从该区块中找到目录名对应的文件的inode号码,再访问该inode.在这个文件对应的inode中找到文件对应的区块号码从而找到存储该文件真正内容的区块的位置.
访问/ect/passwd文件的过程:
- /的inode:通过挂载点信息找到inode号码为128的根目录的inode,判断权限,向内访问
- /的区块:经上个步骤得到根目录区块的号码,访问该区块,找到区块内内容有/ect的目录的inode号码
- /ect的inode:读取上个步骤得到的inode号码,判断权限,向内访问
- /ect的区块:同2
- /ect/passwd的inode:根据上个步骤得到的inode号码,判断权限,找到目标文件的inode号码
- /ect/passwd的区块:从目标文件中的inode号码中找到该文件存储真实内容的区块号码.
4. linux文件系统的运行
当系统加载一个文件到内存后,如果该文件没有被修改过,那么这个区块内的文件数据会被设置为[干净(clear)],但如果内存中的文件被更改了(例如使用gedit修改了该文件的内容,但没有保存),此时该内存中的数据会被设置为[脏的(dirty)],所有的操作都在内存中进行,没有被写入磁盘.
系统会不定时的讲内存中设置为[dirty]的数据协会磁盘,以保持磁盘与内存数据的一致性.
linux系统上的文件系统与内存有很大关系:
- 系统会将常用的文件数据防止到内存的缓冲区,以加速文件的读写
- 承上,linux的物理内存最后会被用光,这是正常的
- 可以手动使用sync来是内存中的dirty文件写入磁盘中(shutdown前建议使用,虽然shutdown命令本身就会调用sync)
5. 挂载点的意义
每个文件系统都有独立的inode,区块,超级区块.这个文件系统要能链接到目录树才能被我们访问.将文件系统与目录树结合的操作我们成为挂载.
挂载点一定是目录,该目录为进入该文件系统的入口.