文件系统
文件系统
生磁盘(raw disk)中盘块是磁盘访问的基本单位,将盘块划分成更高层次的抽象就是文件。Linux中用文件头来代表一个文件,也叫Inode,其指向了磁盘上数据块的位置。
-
文件的存储方式
- 连续空间存放方式:数据都是紧密相连,读写效率很高,文件头里需要指定「起始块的位置」和「长度」。但有「磁盘空间碎片」和「文件长度不易扩展」的缺陷。
- 链表方式:文件头要包含「第一块」和「最后一块」的位置,并且每个数据块里面留出一个指针空间,用来存放下一个数据块的位置,写速度快,缺点是随机访问性能差。
- 索引方式:为每个文件创建一个「索引数据块」,里面存放的是指向文件数据块的指针列表,因此读写速度都快。
- 链表 + 索引:在「索引数据块」留出一个存放下一个索引数据块的指针,形成链表,原先数据索引块不足时方便扩充。
- 索引 + 索引:也称为「多级索引块」,通过一个索引块来存放多个索引数据块。
-
空闲空间管理
- 空闲表法。空闲表法就是为所有空闲空间建立一张表,当请求分配磁盘空间时,系统依次扫描空闲表里的内容,直到找到一个合适的空闲区域为止。
- 空闲链表法。指向下一个空闲块的方式变成了一个指针。
- 位图法。Linux 文件系统就采用了位图的方式来管理空闲空间,不仅用于数据空闲块的管理,还用于 inode 空闲块的管理
-
文件系统的结构
Linux 文件系统,把这个结构称为一个块组,文件系统中最开始的块组叫引导块,后面有N个块组。每个块组包含:
- 超级块,包含的是文件系统的重要信息,比如 inode 总个数、块总个数、每个块组的 inode 个数、每个块组的块个数等等。
- 块组描述符,包含文件系统中各个块组的状态,比如块组中空闲块和 inode 的数目等,每个块组都包含了文件系统中「所有块组的组描述符信息」。
- 数据位图和 inode 位图, 用于表示对应的数据块或 inode 是空闲的,还是被使用中。
- inode 列表,包含了块组中所有的 inode,inode 用于保存文件系统中与各个文件和目录相关的所有元数据。
- 数据块,包含文件的有用数据。
-
目录的存储
Linux中万物皆文件,目录也是个文件,普通文件的块里面保存的是文件数据,而目录文件的块里面保存的是目录里面一项一项的文件信息(如文件名、文件 inode、文件类型等)。
-
软链接和硬链接
- 硬链接:硬链接是多个目录项中的「索引节点」指向一个文件,也就是指向同一个 inode,但是 inode 是不可能跨越文件系统的。只有删除文件的所有硬链接以及源文件时,系统才会彻底删除该文件。
- 软链接:相当于新的文件, 有独立的inode,文件的内容是另外一个文件的路径,所以访问软链接的时候,实际上相当于访问到了另外一个文件,所以软链接是可以跨文件系统的,甚至目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。
-
文件 I/O
- 缓冲与非缓冲 I/O。「是否利用标准库缓冲」来区分。
- 直接与非直接 I/O。直接IO不会经过内核缓存。
- 阻塞与非阻塞 I/O、同步与异步 I/O。