文件系统原理—作用与组成

发布时间:2026/6/25 22:33:02
文件系统原理—作用与组成 1、文件系统的作用我们一直听说操作系统而文件系统就是操作系统中负责管理持久数据的子系统。简单来说硬盘如果断电东西不会没但硬盘本身就是一堆存储空间电脑根本看不懂文件、照片这些东西。这时候文件系统就派上了用场。他就是一套管理规则帮电脑把你的照片、文档整齐地存放在硬盘里方便打开、查找、删除实现长期保存。2、文件系统的组成文件系统顾名思义所有的一切都是围绕文件展开。所以它面向用户的基本管理单位就是文件。文件的作用就是组织并管理磁盘中的数据因此由于不同文件系统采用的数据组织、空间管理方式不一样因此形成了多种不同类型的文件系统。2.1 不同设备下使用的文件系统a.在Linux中不同的Linux操作系统都搭配了不同的文件系统如下所示-RHEL系列7/8/9 版本默认用的是XFS文件系统6及更早则是ext4文件系统。-Debian/Ubuntu系桌面新版btrfs文件系统服务器版ext4文件系统。b.在Windows操作系统中主要文件系统为NTFS文件系统。c.在其他设备当中也就是咱们平时使用的U盘/游戏机等容量小的大多使用FAT32文件系统容量大的则使用exFAT文件系统。2.2 Linux文件系统Linux最经典的一句话便是「一切皆文件」。普通文件、目录、块设备、管道、socket都会被抽象为文件交由对应的底层文件系统磁盘文件系统 / 虚拟文件系统管理。不管是ext4还是XFS这些磁盘文件系统管理的都是普通文件和目录。但Linux除了这些还有管道、Socket、块设备文件等概念。其中管道由pipefs管理、Socket由sockfs管理、块设备文件在/dev归属devtmpfs它们都属于内存型虚拟文件系统。这三种数据仅存于内存当中一旦断电重启就会全部消失不会落地磁盘进行持久化存储。所有磁盘文件系统与虚拟文件系统全部依托内核的VFS虚拟文件系统抽象层做统一封装对外提供一致的文件读写接口这就是 “一切皆文件” 的底层支撑。Linux文件系统会为每个文件分配两个数据结构索引节点index node和目录项directory entry它们主要用来记录文件的元信息和目录层次结构。索引节点也就是inode用来记录文件的元信息比如inode编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识它们之间一一对应它同样会被存储在硬盘中所以索引节点同样占用磁盘空间。目录项也就是dentry用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来就会形成目录结构但它与索引节点不同的是目录项是由内核维护的一个数据结构不存放于磁盘而是缓存在内存但磁盘存有构建dentry所需的原始映射数据。由于索引节点唯一标识一个文件而目录项记录着文件的名所以目录项和索引节点的关系是多对一也就是说一个文件可以有多个别名。比如硬链接的实现就是多个目录项中的索引节点指向同一个文件。前提必须在同一分区也就是在同一文件系统下。因为ext4/XFS这类标准本地文件系统严格限定在单个分区内btrfs例外支持多磁盘多分区合并为一个文件系统并且一个分区只能装一种文件系统。值得一提的是这里也用到了引用计数相关的理念。inode自带引用计数每建一个硬链接计数 1删一个文件名计数 - 1只有引用计数归0磁盘数据块才会真正释放。文件刚创建时初始计数值为1。而硬链接本质上就是一条指向同一个inode的目录项二者是同一事物的两种描述。所以每生成一个目录项inode的计数自动 1。注意目录也是文件也是用索引节点唯一标识和普通文件不同的是普通文件在磁盘里面保存的是文件数据而目录文件在磁盘里面保存子目录或文件。目录项和目录是一个东西吗虽然名字很相近但是它们不是一个东西目录是个文件持久化存储在磁盘而目录项是内核一个数据结构缓存在内存。如果频繁从磁盘读取目录效率会很低。所以内核会把已经读过的目录用目录项这个数据结构缓存在内存下次再次读到相同的目录时只需从内存读就可以大大提高了文件系统的效率。注意目录项这个数据结构不只是表示目录也是可以表示文件的。那文件数据是如何存储在磁盘的呢磁盘读写的最小单位是扇区扇区的大小只有512B大小很明显如果每次读写都以这么小为单位那这读写的效率会非常低。所以文件系统把多个扇区组成了一个逻辑块每次读写的最小单位就是逻辑块数据块Linux中的逻辑块大小为4KB也就是一次性读写8个扇区这将大大提高了磁盘的读写的效率。索引节点是存储在硬盘上的数据那么为了加速文件的访问通常会把索引节点加载到内存中。另外磁盘进行格式化的时候会被分成三个存储区域分别是超级块、索引节点区和数据块区。超级块记录整个文件系统全局参数分区挂载时加载到内存索引节点区批量存放所有文件的inode元数据仅访问文件时加载对应单个inode至内存数据块区存放文件正文、目录映射数据。三者不会完整载入内存仅按需加载局部信息节省内存。它们加载进内存的时机是不同的超级块当文件系统挂载时进入内存索引节点区当文件被访问时进入内存3、虚拟系统文件系统的种类众多而操作系统希望对用户提供一个统一的接口于是在用户层与文件系统层引入了中间层这个中间层有两大部分与用户层直接相关的是系统调用层另一部分便是虚拟文件系统Virtual File SystemVFS。VFS定义了一组所有文件系统都支持的数据结构和标准接口这样程序员不需要了解文件系统的工作原理只需要了解VFS提供的统一接口即可。在 Linux 文件系统中用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间的关系如下图取自小林coding大佬的照片Linux支持非常多的文件系统按照数据存储载体与访问方式可以分为四大类磁盘文件系统数据持久化存储在本地磁盘块设备上读写会经过内核缓存、块设备驱动落盘典型代表有 Ext2/3/4、XFS、btrfs 等。内存临时文件系统数据存放于物理内存或交换分区断电后数据全部丢失典型为 tmpfs常用于 /tmp、/dev/shm临时目录。内核伪文件系统无实际存储介质不占用持久化空间读写操作会实时读取、修改内核运行时数据结构常见的有 procfs/proc、sysfs/sys、devtmpfs。网络文件系统通过网络协议访问远程主机上的文件数据本地不存储文件本体代表有 NFS、SMB/CIFS。Linux所有文件系统都必须挂载至系统目录树中的某个目录才能访问。系统开机时会先挂载根文件系统作为整个目录树的起点再根据配置将磁盘分区、内存文件系统、网络文件系统分别挂载到根目录下的各个子目录。