超级块:记录整个文件系统的元数据,如文件系统类型,版本等
块分配信息:使用bitmap
的格式记录数据区中各个块的使用情况。一个bit
代表一个块,表示该块有没有被分配
inode分配信息:记录inode
的使用情况,一个bit
表示一个inode
,表示该inode
有没有被分配
inode表:用数组的结构保存了整个文件系统所有的inode
,inode
号就是数组索引。一个inode
对应一个文件,记录了这个文件的数据存储在哪些块里
元数据:文件类型,文件大小 ,链接数,文件权限,拥有用户/组,时间(创建、修改、访问时间)
数据块指针:12个直接指针,1个间接指针,1个二级间接指针,1个三级简介指针
创建一个硬链接,不会新建一个inode
找到目标链接文件的inode
后,在目标路径的父路径下,创建一个指向次inode
的新目录项
创建一个符号链接,会创建一个新的inode
创建一个新的文件,文件的内容是到目标链接文件的文件路径
问题:在Ext2的设计中,保存一个1GB的视频文件,文件被拆成多少数 据块?需要多少元数据来维护这些数据块?
▲ 如果这些数据块物理上连续,只需要保存起始块地址和长度即可!
区段(Extent):是由物理上连续的多个数据块组成
- 一个区段内的数据可以连续访问,无需按4KB数据块访问
- 可以减少元数据的数量
为什么这样设计:
硬盘耗时在于最后读文件,前面内存操作耗时没关系
mmap可将文件映射到虚拟内存空间中
- mmap时分配虚拟地址,并标记此段虚拟地址与该文件的inode绑定
- 访问mmap返回的虚拟地址时,触发缺页中断(page fault)
- 缺页中断处理函数,通过虚拟地址,找到该文件的inode
- 从磁盘中将inode中对应的数据读到内存页中
- 将内存页映射添加到页表中
优势:
- 对于随机访问,不用频繁lseek (syscall)
- 减少系统调用次数
- 可以减少数据copy – 如拷贝文件,数据无需经过中间buffer
- 访问的局部性更好
- 可以用madvice为内核提供访问提示,提高性能
把文件映射到虚拟内存,访问文件就像访问数组一样方便
FAT其实就是一个大数组,每一个簇(类似于block)都在FAT里对应了一个数组项
该数组项的内容是下一个簇号,也就比如FAT[i]=j,说明簇i后面的数据就是簇j
十六进制的全F表示这是最后一个簇
构成了链表
目录项
目录项里存了:数据的起始簇号,文件名,文件大小,属性(只读,隐藏,子目录,系统文件,卷标等)
为什么FAT在目录项里区分了文件时目录还是普通文件,inode文件系统并没有在目录项里区分
因为在inode里面记录了是目录还是普通文件,但是FAT表里不能记录这些信息,所以只能记载目录项里
根文件夹
第一个数据块
为什么FAT不支持4G以上的文件
因为目录项里记录了文件大小(单位为KB?),有4个字节 $$ 4 byte=32bit\ 2^{32} = 4G $$
为什么U盘一般用FAT
为什么FAT不支持link
如果要支持link,需要记录文件的ref_cnt
放哪呢?
放目录项:不行这样会有多个
放FAT:没地方->每个FAT都要加,若加上浪费空间
为什么FAT的随机读取文件非常慢
因为访问一个文件的中间部分,FAT文件系统不得不逐个簇进行查找,使得访问变慢
MFT记录了保存了前十六个元数据文件的位置
MFT也记录了MFT元数据文件的位置,该文件记录了其他所有文件的位置和信息
文件所有的信息都在MFT里面,所以everything找文件超级快
- 非常驻文件(大文件/目录)
- 数据区的B+树和区段
- 常驻文件(小文件/目录)
- 大小不超过MFT记录的最大值(1KB)
- 内嵌在MFT中保存(在数据属性中)
- 目录项 – 包含文件名、文件ID(在MFT中的序号)
- FAT没有inode,如何挂载到VFS?
- VFS层对上提供的接口,每个文件都有一个inode
- FAT的inode从哪里来?
- FAT的驱动需要提供inode
- 磁盘上的FAT并没有inode:硬盘上的数据结构
- 内存中的VFS需要inode:只在内存中的数据结构
只复制inode(COW)
- 同样使用CoW
- 对于基于inode表的文件系统
- 将inode表拷贝一份作为快照保存
- 标记已用数据区为CoW
- 对于树状结构的文件系统
- 将树根拷贝一份作为快照保存
- 树根以下的节点标记为CoW
-
一个文件大部分数据为0,则为稀疏文件 – 如虚拟机镜像文件
-
稀疏文件中大量的0数据,白白消耗空间
-
在索引中增加标记
-
删除全0块
- 表面上GIT是一个版本控制软件
- 但实际上GIT是一个内容寻址的文件系统!
- 其核心是一个键值存储
- 值:加入GIT的数据
- 键:通过数据内容算出的40个字符SHA-1校验和
- 前2个字符作为子目录名,后38个字符作为文件名
- 所有对象均保存在.git/objects目录中(文件内容会被压缩)
- 是一个“文件系统之上的文件系统