[Linux]——文件在磁盘中是如何存储的
文件系统
相信接触过Linux操作系统的同学一定使用过ls -l这个命令吧,你在你的命令行解释器下输入这个命令后,打印出了下图中的几列信息。
这些信息对应了文件下面的属性:
- 文件权限
- 文件硬链接数
- 文件所有者
- 文件所属组
- 文件大小
- 修改日期和文件名字
当然你也一定使用过cat,more或者less命令来查看文件内容,请注意,我们上面实际上是提到了文件的两个特点文件属性和文件内容,这篇博客就来给大家讲解文件是如何存在磁盘上的。
磁盘模型
你可以把箭头指向的这两个同心圆从某部分断开,就像拉成磁带的那样的长条一样。,磁盘是典型的块设备,所以这些条也就是硬盘分区被划分为一个个的block,每个块的大小被定为1024、2048或4096字节。
这些分区具体被分为多大其实这些分块是被一个叫boot block的东西管理着:
boot block:boot block 是芯片设计厂家在LPC2000系列微控制器内部固化的一段代码,用户无法对其修改和删除。这段代码在芯片复位后首先被运行,其功能主要是判断运行那个存储器上的程序、检查用户代码是否有效、判断芯片是否被加密、芯片的在应用以及在系统编程功能。
而我们的文件就被存在这些块上,我们现在来看看这些block group中的结构是怎么样的:
不明白这6部分到底是什么东西先不要着急,我们一个一个来说
inode table
首先你需要知道什么是inode,其实inode也是一个结构体,还记得我们之前提到的文件属性吧,inode结构体中存放的就是文件的属性,记住这里仅仅存放的是属性,内容会存放在另一个小部分中
这里有一个问题,一个空文件有inode结构体么?当然,我们说了,这里存放文件属性,所以空文件也有文件属性呀。
inode bitmap
我们每个文件都对应了一个inode,就像每个进程都有一个pcb一样,我们为了找到这些对应的inode,所以每个inode也拥有独一无二inode号,就好比pid一样。
说到这里,inode bitmap的作用就明了了,这个位图就是用来判断此位置映射的inode号有没有被其他文件所占用,占用了这个位就会设为1,否者为0,这些位图对应了inode table中的某一个位置
block bitmap
Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没 有被占用
data blocks
存放数据的数据块
super block
存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的 时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个 文件系统结构就被破坏了
group descriptor table
块组描述符,描述块组属性信息
数据存放
我们来看看一个文件的数据是如何存放到磁盘中的:
- 检查inode位图是否为空
- 如果某比特位为空则将其由0置为1
- 把对应的文件属性写在此inode位图相应的inode节点中
- 给这个对应的inode号分配block空间,写入数据
- 将这个block块号也存到inode中,并把对应的block bitmap所对应的位置置为1
- 将文件名字和ionde号映射关系写入目录文件的内容中
我们这里的最后一条为什么要把文件名字和ionde号映射关系写入目录文件的内容中呢?其实我们访问一个文件是通过inode号从磁盘中查找的,而我们发现我们访问文件时使用的都是文件名,那么说明一定有某个东西帮助我们将文件名字转化为inode号,这里的工作其实是目录文件帮我们完成的。
有没有发现一个文件下不可以拥有同名文件,所以目录的内容实际上维护了本目录中所有文件名字和其inode号的映射关系,这里也就是为什么需要有我们上面的最后一条。
再来看看如何删除磁盘中的一个文件:
- 将文件对应的数据block块从1置为0
- 将文件对应的inode号从1置为0
不要惊讶,有没有发现我们下载一个文件要几小时,而删除只需要几秒,这其实是一种假删除,我们并没有真正意义上删除数据,这也为恢复数据做了铺垫。
总结
其实文件在磁盘中的存储还有很多细节,有兴趣的同学可以自己下去查查哦。