文件系统
前言
Vue框架:
Vue驾校-从项目学Vue-1
算法系列博客友链:
神机百炼
linux文件属性:
- 查看多个文件的属性的命令:ls -l
- 查看单个文件详细属性的命令:stat 文件名.后缀
- 文件存储的结论:新建一个文件,查看其大小
不仅要存储文件内容本身,还要存储文件相关属性
硬盘存储方式:
硬盘结构:
- 从硬件和软件两个角度查看硬盘存储系统:
硬件上:
- 确定硬盘上某一具体位置所需坐标:盘片 -> 盘面 -> 柱面/轨道 -> 扇区
- 硬盘存储容量计算:磁头数 * 磁道数 * 扇区数 * 每扇区内字节数
- 每个扇区内字节数最小512字节,最大4096字节
软件上:
- 分区:硬盘之所以称为块设备,是由于按照块为单位作为存储空间,且每块容量相同
- 格式化:为每块添加附属管理信息,不同文件系统所添加的管理信息不同
- 分组:每块继续下分,分为一个起始块Boot Block和多个组块Block group[],但是并非所有块的Boot Block都填写内容
- 组内下分:每个组块Block group[i]都继续分为六个部分:Super Block + GDT + Block bitmap + inode bitmap + inode Table + Data Blocks
主板bios:
- bios:主板自身携带的一小块内存空间,记录硬盘的起始位置,即0盘面0助眠的0号扇区
- 分区表:在硬盘起始位置存储,记录每个分区的起始位置和终止位置
- OS的载入:在硬盘起始位置存储,但是部分分区会记载OS位置信息,计算机开机时OS从硬盘导入内容
inode:
group block[]内各部分含义:
Super Block:
- 作用:存放文件系统本身的结构信息
- block 和 inode的总量
- 未使用的block 和 inode数目
- 每个block 和 inode的大小
- 最近一次挂载到内存的时间
- 最近一次被写入数据的时间
- 最近一次检验磁盘的时间
- …………等其他文件系统相关信息
- 重要性:Super Block被破坏则整个文件系统结构就被破坏了
Group Descriptor Table:
- 作用:块描述符,描述group block相关信息
Block Bitmap:
- 作用:位图,记录当前group block[i]中所有Data Block的使用情况
- 重要性:某个inode
inode Bitmap:
- 作用:位图,记录当前group block[i]中所有inode节点的使用情况
- 重要性:
inode Table:
- 作用:inode Table是一个链表,其中节点称为inode,每新存储一项文件,inode链表中新增一个inode节点,用于存储文件的相关属性信息
- inode的重要性:我们识别文件一看路径,二看名称,但是OS识别文件只看inode信息
- inode的本质:一个结构体
//伪代码:
struct inode{
inodeID;
//inodeID,用于识别inode节点
blocks[12];
//每个文件用一个inode存储属性,同时默认用12个Data block存储内容,每个block有4KB
};
Data Blocks:
-
作用:具体存储文件内容的位置,每个group Block[i]中含有多个Data Block,每个Data Block可存储4KB文件
-
inode和Data Block的连接:依靠inode结构体中的blocks指针数组:
-
Data Block和Data Block的连接:每个Data Block中含有Data Block指针
-
OS 和 硬盘眼中的文件:inode Table中的一个inode节点(文件属性信息) + 该inode所指向的Data Blocks(文件本身内容)
文件存储过程:
1. 存储文件属性:
- 遍历inode Bitmap,寻找inode Table中空的inode节点
- 将文件相关属性信息存储到空白的inode节点中
2. 存储数据:
- 遍历block Bitmap,寻找Data blocks中空的Data block
- 将文件本身内容存储到空的Data block中
3. 关联inode和Data Block:
- 将使用的Data block的指针或编号,存放进入所使用的inode结构体中的block[12]中
4. 目录文件新增项:
- 目录文件:目录文件作为一种特殊的文件,其存储的内容是目录下各文件的inode地址和文件名
- 查找目录下文件:到目录文件inode对应的Data Block中查找文件名对应的inode,依据文件名对应inode中的block[12]找到Data Blocks下具体的文件内容
- 目录下新增文件:将文件的inode指针和文件名存储到目录文件的Data Block中
存储过程图示:
文件删除过程:
-
下载文件需要4步,但是删除文件只需要核心两步:
- 将文件原来占据的inode bitmap中的位置为0
- 将文件原来占据的block bitmap中的位置为0
- 将目录文件inode对应的Data block内的文件名和inode指针内容删除
-
这个原理解释了两种现象:
- 删除文件比新建文件块
- 删除掉的文件有概率恢复
-
删除目录文件的特殊性:
递归删除,先删除目录data block内所有inode指向的data block,再删除目录inode
软硬链接:
- 背景:硬盘和操作系统查找和区分文件时使用的是inode,而非路径+文件名
软链接:
-
创建过程:
新建inode,新开辟Data Block,存储原文件的inode指针
-
访问方式:
根据本文件的inode寻找到本文件的Data Block数据,即获取到原文件的inode,再根据原文件的inode寻找原文件的Data Block数据
-
删除源文件后:
由于源文件的Data Block和inode都被释放,所以无法按照本文件中存储的源文件inode去寻找原文件数据
-
相当于:快捷方式,原文件删除后快捷方式失效
-
指令:ln -s 原文件名 软链接文件名
硬链接:
-
创建过程:
新文件的文件直接使用原文件的inode,使用原文件的block
-
访问方式:
和直接访问原文件的过程一样,根据inode查找Data Blocks中的数据
-
删除源文件后:
硬链接的inode和Data Block保持不变
只有一个inode的所有硬链接都被删除,该inode及其Data Block才被释放 -
相当于:取别名,只要还存在一个别名,内容就未被释放
-
指令:ln 原文件名 硬链接文件名
- 删除原文件,查看软硬链接文件变化:硬链接文件没事,软连接文件报错
硬链接数:
- 创建一个普通文件,其硬链接数为1
- 创建一个目录文件,其硬链接数为2:本名 + .
- 目录文件下每多创建一个目录,其硬链接数+1:每个子目录可以通过…返回上级目录
- 可以通过目录文件的硬链接数来推断其下含有多少子目录文件