文件系统

计算机的文件系统是一种存储和组织计算机数据的方法，它使得对其存取和查找变得容易，文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念，用户使用文件系统来保存数据不必关心数据实际保存在硬盘（或者光盘）的地址为多少的数据块上，只需要记住这个文件的所属目录和文件名。在写入新数据之前，用户不必关心硬盘上的那个块地址没有被使用，硬盘上的存储空间管理（分配和释放）功能由文件系统自动完成，用户只需要记住数据被写入到了哪个文件中。

文件系统通常使用硬盘和光盘这样的存储设备，并维护文件在设备中的物理位置。但是，实际上文件系统也可能仅仅是一种访问资料的界面而已，实际的数据可能是通过网络协议（如NFS、SMB、9P等）提供的或者暂存于内存上，甚至可能根本没有对应的文件（如proc文件系统）。

严格地说，文件系统是一套实现了数据的存储、分级组织、存取和获取等操作的抽象数据类型（Abstract data type）。

## 概述

<image>

文件系统是一种用于向用户提供底层数据存取的机制。它将设备中的空间划分为特定大小的块（或者称为簇），一般每块512字节。数据存储在这些块中，大小被修正为占用整数个块。由文件系统软件来负责将这些块组织为文件和目录，并记录哪些块被分配给了哪个文件，以及哪些块没有被使用。

不过，文件系统并不一定只在特定存储设备上出现。它是数据的组织者和提供者，至于它的底层，可以是磁盘，也可以是其它动态生成数据的设备（比如网络设备）。

### 文件名

在文件系统中，文件名是用于定位存储位置。大多数的文件系统对文件名的长度有限制。在一些文件系统中，文件名是大小写不敏感（如“AAA”和“aaa”指的是同一个文件）；在另一些文件系统中则大小写敏感。大多现今的文件系统允许文件名包含非常多的Unicode字符集的字符。然而在大多数文件系统的界面中，会限制某些特殊字符出现在文件名中。（文件系统可能会用这些特殊字符来表示一个设备、设备类型、目录前缀、或文件类型）然而，这些特殊的字符会允许存在于用双引号内的文件名。方便起见，一般不建议在文件名中包含特殊字符。

### 元数据（Metadata）

其它文件保存信息常常伴随着文件自身保存在文件系统中。文件长度可能是分配给这个文件的区块数，也可能是这个文件实际的字节数。文件最后修改时间也许记录在文件的时间戳中。有的文件系统还保存文件的创建时间，最后存取时间及属性修改时间。（不过大多数早期的文件系统不记录文件的时间信息）其它信息还包括文件设备类型（如：区块数，字符集，套接口，子目录等等），文件所有者的ID，组ID，还有存取权限（如：只读，可执行等等）。

### 安全访问

针对基本文件系统操作的安全访问可以通过访问控制列表或capabilities实现。研究表明访问控制列表难以保证安全，这也就是研发中的文件系统倾向于使用capabilities的原因。然而目前多数商业性的文件系统仍然使用访问控制列表。

## 类型

### 磁盘文件系统

磁盘文件系统是一种设计用来利用数据存储设备来保存计算机文件的文件系统，最常用的数据存储设备是磁盘驱动器，可以直接或者间接地连接到计算机上。例如：档案配置表（FAT12、FAT16、FAT32、exFAT）、New Technology File System、分层档案系统HFS、HFS Plus、延伸档案系统（ext1、ext2、ext3、ext4）、ODS、btrfs、XFS、UFS、ZFS。有些文件系统是行程文件系统（也有译作日志文件系统）或者追踪文件系统。

#### 光碟

ISO 9660和UDF被用于CD、DVD与蓝光光碟。

### 闪存文件系统

闪存文件系统是一种设计用来在闪存上储存文件的文件系统。随着移动设备的普及和闪存容量的增加，这类文件系统越来越流行。

尽管磁盘文件系统也能在闪存上使用，但闪存文件系统是闪存设备的首选，理由如下：

- 擦除区块：闪存的区块在重新写入前必须先进行擦除。擦除区块会占用相当可观的时间。因此，在设备空闲的时候擦除未使用的区块有助于提高速度，而写入数据时也可以优先使用已经擦除的区块。
- 随机访问：由于在磁盘上寻址有很大的延迟，磁盘文件系统有针对寻址的优化，以尽量避免寻址。但闪存没有寻址延迟。
- 写入平衡（Wear levelling）：闪存中经常写入的区块往往容易损坏。闪存文件系统的设计可以使数据均匀地写到整个设备。

日志文件系统具有闪存文件系统需要的特性，这类文件系统包括JFFS2和YAFFS。也有为了避免日志频繁写入而导致闪存寿命衰减的非日志文件系统，如exFAT。

### 数据库文件系统

文件管理方面的一个新概念是一种基于数据库的文件系统的概念。不再（或者不仅仅）使用分层结构管理，文件按照他们的特征进行区分，如文件类型、专题、作者或者亚数据进行区分。于是文件检索就可以按照SQL风格甚至自然语言风格进行。

例如BFS和WinFS。

### 网络文件系统

网络文件系统（NFS，Network File System）是一种将远程主机上的分区（目录）经网络挂载到本地系统的一种机制。

## 与操作系统的关系

### DOS / Microsoft Windows支援的档案系统

<image>

Windows｜FAT12/FAT16｜FAT32/VFAT｜FAT64/exFAT｜NTFS

Windows 3.x或更早（MS-DOS 6.22）（PC-DOS 7.0）｜可读/可写｜不支援｜不支援｜不支援

Windows 95｜可读/可写｜不支援｜不支援｜不支援

Windows 95（OSR2以后）Windows 98（含SE）ME｜可读/可写｜可读/可写｜不支援｜不支援

Windows NT 4.0 及以前｜可读/可写｜不支援｜不支援｜可读/可写

2000Windows XPWindows VistaServer 2003Server 2008 (R2)Windows 7Windows 8Server 2012 (R2)Windows 8.1 Windows 10｜可读/可写｜可读/可写｜可读/可写｜可读/可写

Windows CE｜可读/可写｜可读/可写｜可读/可写｜不支援

注意：除非NT4安装了FAT32 For Windows NT 4.0否则该系统不支援FAT32

### Linux支援的档案系统

随着Linux的不断发展，它所支持的文件系统也在迅速扩充，Linux系统核心可以支持十多种文件系统类型：Btrfs、JFS、ReiserFS、exFAT、ext、ext2、ext3、ext4、XFS、ISO 9660、Minix、MSDOS、UMSDOS、VFAT、NTFS（Linux Kernel内建的NTFS驱动程式，写入功能不稳定）、HPFS、NFS、SMB、SysV、PROC等。

注意：部分Linux发行版的Kernel预设不编译Kernel内建的NTFS文件系统支援，常见的在Linux下读写NTFS的解决方法是安装NTFS-3G或ufsd等NTFS驱动程序。部分Linux发行版对NTFS的支援度并不高。

### UNIX及BSD操作系统下的文件系统

柏克莱加州大学开发早期的伯克利快速文件系统（Berkeley Fast File System），再由各UNIX厂商开发不同的文件系统，包括IRIX上的XFS、IBM AIX的JFS、HP HP-UNIX的VxFS、迪吉多Tru64的AdvFS及Solaris的ZFS。

### macOS（Mac OS X）的文件系统

从1998年到2016年间使用HFS+，再早采用HFS。从2016年发布的macOS Sierra起，使用苹果文件系统（APFS）。

### OpenVMS的文件系统

OpenVMS为Wang Mainframe所使用的Operation System，以搭配Wang王安博士发明的Magnetic Drum的储存设备。