文件系统是什么?
- 存储数据的一般是磁盘这样的物理设备,但是一般直接购买磁盘不借助任何工具是无法直接使用的。
而操作系统中的文件系统就是抽象物理磁盘从而为用户提供存储服务
,其中文件
和目录
是文件系统为用户提供存储区域的抽象,文件
扮演了存储用户的数据的容器;目录
扮演存存储一组文件(包括文件和目录)
数据的容器。操作系统将用户存储的数据(文件和目录)的物理磁盘设备虚拟化为一组文件和目录,提供统一的视图。操作系统中的文件系统
本质是为用户提供创建、组织、存储、和检索
物理磁盘上的数据。
磁盘扇区大小一般是多大?
- 一个磁盘是由相同大小的物理块组织,这个物理块叫做
sector(扇区)
,一个扇区的大小一般为512个字节的或者512的整数倍字节,这个取决于存储的类型和容量;扇区一般是磁盘上最小的原子IO的单位。但是操作系统
并不是直接管理扇区,而是管理固定大小的block
(实际的存储文件或者目录数据的区域),每个block
是由一个或者多个扇区组成,操作系统中文件系统最小的IO单位是block
;那么磁盘内部最小的单位是扇区,而操作系统最小的单位是block
,这两者有啥关联呢?用户使用操作系统中的文件系统将数据以块的方式组织,最终是到了磁盘驱动层,驱动层是再将block
分解为多个扇区
将数据写入到磁盘。
什么是文件元数据?
- 对于操作系统而说文件元数据就是文件或者目录存储的
位置
和属性
信息(当数据小于某个预阈值时候,数据可以内嵌到元数据中),属性
信息包括文件文件操作时间、文件类型、访问时间。访问权限
。在内核中每个文件对应一个元数据,这个元数据成为inode
。文件系统保留一些磁盘块用于存储inode
,其他的用于文件的数据;文件系统需要追踪inode
和数据块的状态和空闲块,这是通过位图来实现,一个位图用于追踪空闲inode,另外一个位图用于追踪空闲数据块.
文件系统如何做数据映射?
- 文件系统中的
inode
记录了文件数据所在的位置和属性,根据文件的大小,每个文件占用n个数据块。那么这些文件数据位置信息如何映射数据块呢?文件系统目前采用第一种是一级间接索引
的技术来映射文件数据块,多级索引
涉及了部分直接指针
和间接指针
。比如一个inode中包含了N个直接指针和1个间接指针,每个间接指针指向包含直接指针的块,每个直接指针执行文件的数据块,这种方式为了支持存储大文件。
- 第二种是
二级间接索引
,这种方案支持更大的文件,双间接指针
包含指向。间接指针的块,每个块中的条目有指向包含直接指针的块。第三种是三级间接索引
,这个支持的比第二种方案文件更大,这种方案需要管理更多的元数据,效率并不是那么高;因此目前主流实现中采用了extent
的方式将数据块信息存储在inode中,extent
是指向起始数据块的指针,同时记录了长度,用来标识存储文件数据连续块的个数。其次是根据文件大小和磁盘的碎片成都,单个extent
会存在不足以指向文件的所有数据块,这时候文件系统设计中构建extent
链表,其中每个extent
都指向上一个连续数据块区域的起始地址和长度。
目录中存储的是什么?
- 文件系统将目录当做特殊的文件,它们在磁盘上也有一个
inode
来目录。inode
是通过type
字段来标识是文件还是目录。既然目录被当做文件,每个目录也会分配数据块,保存了整个目录中文件和子目录的数据,一个目录维护这文件记录,每个记录包含文件名称
和这个文件关联的inode
.