文件系统:存数据的一个容器,对外提供的就是存取服务。
例如你到火车站使用寄存服务:
存行李的时候,需要登记名字+号码牌,来标识唯一的行李
取行李的时候,报名字+出示号码牌,才能在特定位置找到行李
类比文件系统:
空间管理
对于一个连续的大磁盘空间
如果将数据完整的放入:浪费空间、可能放不下
解决:
切分,这里放一点那里放一点。称为:小粒度的方式
存数据:数据切分成Block 粒度后存到文件系统中磁盘的各个角落、把 Block 所在的各个位置保存起来,即inode
取数据:读inode,找到各个 Block 的位置、读数据
- 粒度:每个小粒度的物理块命名为 Block,每个 Block 一般是 4K 大小。
- Block数组中每一项是4个字节
inode/block 概念
inode有文件元数据+Block数组(长度是15),数组中前两项指向Block 3和Block 11,表示数据在这两个块中存着。
Block数组存储数据的最大 = 15个元素 * 每个Block大小4KB = 60 K
问题1:但是一个最大的文件超过60K,怎么办?
解决:把这个Block数组长度给扩大
比如:让文件系统支持1MB的文件,Block数组长度=(1MB* 1024) / 每个Block大小4KB = 256
Block需要的数据空间 = (256*4【每一项是4字节】)/ 1024 = 1KB
问题2:如果文件本身只有0.1K,存1MB的文件,Block数组本身需要1KB,造成浪费
解决:间接索引
间接索引
直接索引:
能存 12 个 block 编号,每个 block 4K,就是 48K,
一级索引:
里存储的编号指向的 block 编号, 里面的编号指向用户数据。
一个 block 4K,每个元素 4 字节,也就是有 1024 个编号位置 = (4K【一个 block 4K】 * 1024)/ 4【每个元素 4 字节】 可以存储。
一级索引能寻址到1024个bock,一个block是4K的空间,也就是一级索引能寻址4MB= 1024*4K 的空间
二级索引:
有了 4M 的空间用来存储用户数据的编号。
二级索引可寻址 1024 * 1024个block
二级索引能寻址到1024*1024个bock,一个block是4K的空间,也就是一级索引能寻址4GB= 1024*1024*4K 的空间
三级索引:
有了 4G 的空间来存储用户数据的 block 编号
三级索引可寻址 1024 * 1024 * 1024个block
三级索引能寻址到1024*1024*1024个bock,一个block是4K的空间,也就是一级索引能寻址4TB= 1024*1024*1024*4K 的空间
在这种文件系统(如ext2)上,通过这种间接块索引的方式,最大能支撑的文件大小 = 48K + 4M + 4G + 4T ,约等于 4 T。
重点:文件 size 只是 inode 里面的一个属性,实际物理空间占用则是要看用户数据放了多少个 block ,没写数据的地方不用分配物理block块。
有些文件其实就是稀疏文件, 它的逻辑大小和实际物理空间是不相等的。