目录
文件系统存储在磁盘上。大部分的磁盘能够划分出一到多个分区,叫做磁盘分区或者是磁盘分片。每个分区都有独立的文件系统,每块分区的文件系统可以不同。磁盘的0号分区称为主引导记录(Master Boot Record, MBR),用来引导计算机。在MBR的结尾是分区表(partition table)。每个分区表给出每个分区由开始到结束的地址。
Linux文件系统 -----》 Linux文件系统 《------
文件系统布局
引导块
MBR做的第一件事就是确定活动分区,读入它的第一个块,称为引导块(boot block)并执行。引导块中的程序将加载分区中的操作系统。为了一致性,每个分区都会从引导块开始,即使引导块不包含操作系统。引导块占据文件系统的前4096字节,从磁盘上字节偏移量0开始。引导块可用于启动操作系统。
超级块
紧跟在引导块后面的是超级块(Super block),超级块的大小为4096字节,从磁盘上的字节偏移4096开始。超级块包含文件系统的所有关键参数:
- 文件系统的大小
- 文件系统中的数据块数
- 指示文件系统状态的标志
- 分配组大小
在计算机启动或者文件系统首次使用时,超级块会被读入内存。
空闲空间块
使用位图或者链表两种方式,标记磁盘的利用情况。
inode
inode, 也称为索引节点。它是一个数组的结构, 每个文件有一个inode,inode非常重要,它说明了文件的方方面面。每个索引节点都存储对象数据的属性和磁盘块位置。inode节点主要包含了以下信息:
- 模式/权限
- 所有者ID
- 组ID
- 文件大小
- 文件的硬链接数
- 上次访问时间
- 最后修改时间
- inode上次修改时间
文件分为两部分,索引节点和块。一旦创建后,每种类型的块数是固定的。我们不能增加分区上inode的数量,也不能增加磁盘块的数量。
紧跟在inode后面的是根目录,它存放的是文件系统目录树的根部。最后,磁盘的其他部分存放了其他所有的目录和文件。
文件系统实现
最重要的问题是记录各个条件分别用到了哪些磁盘块。不同系统采用了不同的方法。分配背后的主要思想是 有效利用文件空间 和 快速访问文件,主要有下面三种分配方案
连续分配
即把文件作为一连串连续数据块存储在磁盘上。
优点:
- 实现简单,只需要记住两个数字就可以:第一个块的文件地址和文件的块数量。给的一个块的编号,可以通过简单的加法找到任何其他块的编号。
- 读取性能比较强。可以通过一次操作从文件中读取整个文件。只需要一次寻找第一个块,后面就不再需要寻道时间和旋转延迟,所以数据会以全带宽进入磁盘。
缺点:随着时间的推移,磁盘会变得很零碎。
链表分配
为每个文件构造磁盘块链表,每个文件都是磁盘块的链接列表。
链表分配解决了连续分配造成的磁盘零碎问题。但是又引入了新的问题。
- 随机访问困难
- 由于指针占用了磁盘块空间,所以每个磁盘块实际存储的数据不再是2的幂。
inode