目录项、索引节点、逻辑块以及超级块,构成了 Linux 文件系统的四大基本要。

1. 索引节点和目录项

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

文件系统的两种数据结构:

  • 索引节点,简称inode,用来记录文件的元数据。比如 inode 编号、文件大小、访问 权限、修改日期、数据的位置等
  • 目录项,简称dentry,用来记录文件的名字、索引节点的指针以及其他目录项的关联关系。(树状结构)

2. 虚拟文件系统

为了支持各种不同的文件系统,Linux 内核在用户进程和文件系统的中间,又引入了一个 抽象层,也就是虚拟文件系统 VFS(Virtual File System)。

VFS定义了一组所有文件系统都支持的数据结构和标准接口,这样用户进程和内核中的其他子系统,只要更VFS提供的统一接口进行交互就可以了

文件系统可以分三类:

  1. 基于磁盘的文件系统,也就是把数据存储在计算机本地挂载的磁盘中。Ext4、XFS、OverlayFS
  2. 基于内存的文件系统,也就是我们常说的虚拟文件系统。/proc文件系统、/sys文件系统
  3. 网络文件系统,用来访问其他计算机数据的文件系统。NFS、 SMB、iSCSI

3. 文件系统I/O

把文件系统挂载到挂载点后,就可以通过挂载点去访问它管理的文件了。VFS提供了一组标准的文件访问接口。

文件读写方式的各种差异,导致I/O的分类多种多样:

  1. 缓冲I/O与非缓冲I/O
  2. 直接 I/O 与非直接 I/O
  3. 阻塞 I/O 和非阻塞 I/O
  4. 同步和异步 I/O

4. 性能观察

容量

1
2
3
4
5
6
7
# 查看文件系统的磁盘空间
$ df /dev/fd
# 打印
Filesystem     1K-blocks  Used Available Use% Mounted on
proc                   0     0         0    - /proc/sysrq-trigger
# -h 简化
# -i 查看索引节点使用情况

缓存

1
2
3
4
5
$ cat /proc/meminfo | grep -E "SReclaimable|Cached"
# 打印
Cached:           360452 kB
SwapCached:            0 kB
SReclaimable:      21504 kB
1
2
# 打印所有目录项和文件系统索引节点的缓存情况
$ cat /proc/slabinfo | grep -E '^#|dentry|inode'
1
2
# 查找占用内存最多的缓存类型
$ slabtop