文件系统
- 文件系统构成
- 虚拟文件系统
- 文件的使用
- 文件的存储
- 连续存储
- 非连续空间存放方式
- 链表方式
- 索引方式
- Linux文件的实现方式
- 空闲分区的管理
- 文件系统结构
- 目录的存储
- 软链接和硬链接
文件系统构成
Linux的设计哲学有一点很重要:一切皆文件,不仅仅是普通的文件和目录,就连块设备,管道,socket都属于文件的范畴
Linux会为每个文件分配两个数据结构:索引节点和目录项
- 索引节点:inode,记录文件的元信息,比如inode编号,文件大小,访问权限,创建时间,数据在磁盘中的位置,同样是文件的唯一标识,索引节点同样占据磁盘空间
- 目录项:也就是dentry,记录文件名字,索引节点指针以及与其他目录项之间的层级关系,多个目录项关联起来,形成目录结构.与索引节点不同的是,目录项内核维护,不存放在磁盘,而是缓存在内存中
索引节点唯一标识文件,目录项记录文件的名字,实际上目录项与索引节点之间的关系是多对一的,硬链接的实现就是多个目录项中的索引节点指向同一个inode节点,目录不是目录项,目录是一个文件(inode),目录项的inode指针要么指向目录,要么指向文件
磁盘进行格式化时,会划分三个区域,分别是超级块,索引节点区和数据块区
- 超级块:存储文件系统的详细信息,比如块大小,块个数以及空闲块
- 索引节点区,存储索引节点
- 数据块,存储文件或者目录数据
上述区进入内存的时机是不同的,全部放入的话内存压力过大,加载进内存的时机如下
- 超级块:文件系统挂载时装载
- 索引节点区:当文件访问时进入
虚拟文件系统
文件系统种类众多,操作系统希望对用户提供一个同一的接口,引入了虚拟文件系统这个中间层
VFS定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解VFS提供的接口即可
linux提供的文件系统主要有以下三类
- 磁盘文件系统 :直接把数据存储在磁盘中,比如ext2/3/4 等
- 内存文件系统:文件系统的数据占用内存空间,代表有/proc,/sys(都是存放内核的统计数据和配置等信息),读写这类文件,实际上读取的是内核中的相关数据
- 网络的文件系统:访问其他计算机的文件系统,比如NFS等
文件系统需要挂载之后才能使用,比如Linux启动时,会把文件系统挂载在根目录下
文件的使用
用户使用文件的方式如下
打开文件后,操作系统为每个进程维护一个打开文件表,文件表中的每一项为文件描述符,中间的内容如下
- 文件指针:跟踪上次读写位置,对打开文件的某个进程来说是唯一的
- 文件打开计数器:文件关闭时,操作系统必须重用打开文件条目(否则存储压力过大),多个进程打开同一个文件,因此需要记录最后一个关闭的进程,最后一个关闭才删除
- 文件磁盘位置:文件操作修改数据,信息保存在内存中和,避免每个操作都是裸IO
- 访问权限:每个进程打开文件都有一个访问模式,以便操作系统允许或者拒绝后续的IO请求
文件的存储
文件的存储有以下两种方案:连续存储和非连续存储
连续存储
文件存放在磁盘连续的空间中,指定起始块位置和长度即可存储和访问文件,缺点磁盘空间碎片(外部碎片)和文件长度不易扩展的缺点
非连续空间存放方式
链表方式
链表方式存放的是离散的文件块,这样存放可以消除磁盘碎片,同时文件的长度可以动态扩展,根据实现方式的不同,链表方式还可以分为隐式连接和显示连接两种
- 隐式链接:文件头包含第一块和最后一块,每个文件快包含下一个文件块(很像自己实现的带头尾指针的链表)
- 显示链接:将数据块指针显式的存放在内存的链表中,这样的表格称为FAT
索引方式
索引方式是为每个文件创建一个索引数据块,里面放的是指向文件数据块的指针列表
当一个索引数据块存放不了索引时,有如下两种解决方式
上图的方式就是多级索引的雏形了,不过上面是二级索引
优点:
- 文件创建,增大,缩小很方便
- 不会有碎片问题
- 支持顺序读写的随机读写
Linux文件的实现方式
根据文件的大小,存放的方式有所变化
- 如果存放文件所需的数据块小于 10 块,则采用直接查找的方式
- 如果存放文件所需的数据块超过 10 块,则采用一级间接索引方式
- 如果前面两种方式都不够存放大文件,则采用二级间接索引方式
- 如果二级间接索引也不够存放大文件,这采用三级间接索引方式
那个索引节点inode包含13个指针,10个直接指向数据块的,第11个指向一级索引的,第12个指向二级索引的,第13个指向三级索引的
空闲分区的管理
磁盘的空闲分区也需要进行管理,几种常见的管理方式如下
- 空闲表法:为所有的空闲空间建立一张表,表内容为空闲区的第一个块号和空闲区块的个数,如果空闲区比较多的情况下,表的开销巨大
- 空闲链表法:使用链表的方式管理空闲空间,每个空闲的块中有下一个指针指向空闲块
- 位图法:位图利用二进制来表示磁盘中一个盘块的使用情况,值为0表示对应的盘块空闲,值为1表示对应的盘块已分配,linux系统即是采用位图的方式进行磁盘空间的管理,不仅是空闲磁盘空间的管理,还有inode空闲区间的管理
文件系统结构
Linux使用位图的方式管理空闲空间,用户创建新文件时,Linux通过inode的位图找到空闲可用的inode,进行分配,存储数据时,通过块的位图找到空闲的块并分配,一个页的位图最多能表示128Mb的数据,远远小于文件的大小,Linux提出了一个块组的概念
目录的存储
Linux将目录存储成了文件,甚至可以使用vim打开,普通的文件保存的是文件数据,目录文件保存的是目录中一项一项的文件信息
软链接和硬链接
硬链接和软链接用于提供文件共享使用功能,实现方式不相同
硬链接是多个文件目录项中的索引节点指向同一个inode,由于inode无法跨越文件系统,所以硬链接无法跨域文件系统,并且仅当所有硬链接和源文件被删除时,源文件才会被真正的删除
软链接相当于重新创建了一个文件,这个文件的inode独立,不过这个文件的内容是另一个文件的路径,因此软练可以跨越文件系统.