磁盘为系统提供了最基本的持久化存储 。
文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构 。
那么,磁盘和文件系统是怎么工作的呢?又有哪些指标可以衡量它们的性能呢?
索引节点和目录项文件系统,本身是对存储设备上的文件,进行组织管理的机制 。组织方式不同,就会形成不同的文件系统 。
你要记住最重要的一点,在 linux 中一切皆文件 。不仅普通的文件和目录,就连块设备、套接字、管道等,也都要通过统一的文件系统来管理 。
为了方便管理,Linux 文件系统为每个文件都分配两个数据结构,索引节点(indexnode)和目录项(directory entry) 。它们主要用来记录文件的元信息和目录结构 。
索引节点,简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置等 。索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中 。所以记住,索引节点同样占用磁盘空间 。换句话说,索引节点是每个文件的唯一标志,而目录项维护的正是文件系统的树状结构 。目录项和索引节点的关系是多对一,你可以简单理解为,一个文件可以有多个别名 。
目录项,简称为 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联关系 。多个关联的目录项,就构成了文件系统的目录结构 。不过,不同于索引节点,目录项是由内核维护的一个内存数据结构,所以通常也被叫做目录项缓存 。
举个例子,通过硬链接为文件创建的别名,就会对应不同的目录项,不过这些目录项本质上还是链接同一个文件,所以,它们的索引节点相同 。
索引节点和目录项纪录了文件的元数据,以及文件间的目录关系,那么具体来说,文件数据到底是怎么存储的呢?是不是直接写到磁盘中就好了呢?
实际上,磁盘读写的最小单位是扇区,然而扇区只有 512B 大小,如果每次都读写这么小的单位,效率一定很低 。所以,文件系统又把连续的扇区组成了逻辑块,然后每次都以逻辑块为最小单元,来管理数据 。常见的逻辑块大小为 4KB,也就是由连续的 8 个扇区组成 。
为了帮助你理解目录项、索引节点以及文件数据的关系,我画了一张示意图 。你可以对照着这张图,来回忆刚刚讲过的内容,把知识和细节串联起来 。
文章插图
不过,这里有两点需要你注意 。
第一,目录项本身就是一个内存缓存,而索引节点则是存储在磁盘中的数据 。在前面的Buffer 和 Cache 原理中,我曾经提到过,为了协调慢速磁盘与快速 CPU 的性能差异,文件内容会缓存到页缓存 Cache 中 。
那么,你应该想到,这些索引节点自然也会缓存到内存中,加速文件的访问 。
第二,磁盘在执行文件系统格式化时,会被分成三个存储区域,超级块、索引节点区和数据块区 。其中,
- 超级块,存储整个文件系统的状态 。
- 索引节点区,用来存储索引节点 。
- 数据块区,则用来存储文件数据 。
VFS 定义了一组所有文件系统都支持的数据结构和标准接口 。这样,用户进程和内核中的其他子系统,只需要跟 VFS 提供的统一接口进行交互就可以了,而不需要再关心底层各种文件系统的实现细节 。
这里,我画了一张 Linux 文件系统的架构图,帮你更好地理解系统调用、VFS、缓存、文件系统以及块存储之间的关系 。
文章插图
通过这张图,你可以看到,在 VFS 的下方,Linux 支持各种各样的文件系统,如 Ext4、XFS、NFS 等等 。按照存储位置的不同,这些文件系统可以分为三类 。
- 第一类是基于磁盘的文件系统,也就是把数据直接存储在计算机本地挂载的磁盘中 。常见的 Ext4、XFS、OverlayFS 等,都是这类文件系统 。
- 第二类是基于内存的文件系统,也就是我们常说的虚拟文件系统 。这类文件系统,不需要任何磁盘分配存储空间,但会占用内存 。我们经常用到的 /proc 文件系统,其实就是一种最常见的虚拟文件系统 。此外,/sys 文件系统也属于这一类,主要向用户空间导出层次化的内核对象 。
推荐阅读
- Linux 查看进程的动态信息
- everything电脑文件搜索工具
- Snakeviz是一个python的交互式可视化的图形化文件分析库
- 时间管理专家的 Linux 工具
- 后端开发必备的 MySQL 日志文件知识点
- Linux中显示当前挂载的文件系统命令-findmnt
- Linux系统中虚拟设备文件的各种实用用法
- 开源!适用于Win和Linux平台的YOLO4和YOLO3
- Linux 物理内存外碎片化浅析
- 怎样用excel做库存管理系统 淘宝网店库存管理怎么做