磁盘为系统提供了最基本的持久化存储。 而文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构。

文件系统

文件系统,本身是对存储设备上的文件,进行组织管理的机制。组织方式不同,就会形成不同的文件系统。

在 Linux 中一切皆文件。不仅普通的文件和目录,就连块设备、套接字、管道等,也都要通过统一的文件系统来管理。

为了方便管理,Linux 文件系统为每个文件都分配两个数据结构,索引节点(index node)和目录项(directory entry)。它们主要用来记录文件的元信息和目录结构。

换句话说,索引节点是每个文件的唯一标志,而目录项维护的正是文件系统的树状结构。目录项和索引节点的关系是多对一,你可以简单理解为,一个文件可以有多个别名。

<aside> 💡 举个例子,通过硬链接为文件创建的别名,就会对应不同的目录项,不过这些目录项本质上还是链接同一个文件,所以,它们的索引节点相同。

</aside>

文件系统的读写方式

磁盘读写的最小单位是扇区,然而扇区只有 512B 大小,如果每次都读写这么小的单位,效率一定很低。所以,文件系统又把连续的扇区组成了逻辑块,然后每次都以逻辑块为最小单元,来管理数据。常见的逻辑块大小为 4KB,也就是由连续的 8 个扇区组成。

文件系统在磁盘上的组织形式

在这上面, 目录项本身就是一个内存缓存, 同样的, 索引节点也会被缓存到内存中, 加速内存访问, 乃至于文件内容, 也可能会被缓存到页缓存 Cache 中

这里边磁盘被划分为了三个存储区域. 超级块,存储整个文件系统的状态; 索引节点区,用来存储索引节点; 数据块区,则用来存储文件数据

<aside> 💡 在 cp 时,会创建文件的 inode 和 datablock 同一分区下 mv,只会修改目录,不会修改 inode 和 datablock echo 追加的方式不会修改目录 vim 编辑的方式会修改 inode ( 使用硬连接方式则不会 ) 符号连接 ( ln -s ) 的 inode 是不一样的;而软链接 ln 的 inode 则是一样的,但是 ln 不能跨分区

</aside>

虚拟文件系统