文件系统 基础
什么是文件系统?
文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。
上文是维基百科对于文件系统的描述,我们将其精炼一下,得到以下结论:
- 文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型(Abstract data type)。其可以构建在磁盘、内存、甚至是网络上。
用于解决什么问题?
我们为什么要使用文件系统呢?换句话说,文件系统它解决了什么问题呢?
文件系统解决的是对磁盘空间使用的问题。 如果我们不抽象出一个文件系统,而是每个应用程序都独立去访问磁盘空间,那会出现什么样的情况呢?
- 磁盘空间的访问会存在冲突。 如果没有一个第三方去统一管理磁盘空间,那么此时应用程序的数据访问并不会进行隔离,而是会互相影响,产生冲突。
- 磁盘空间的管理会非常复杂。 由于文件有不同格式、大小,存储的设备与位置也有所不同(本地磁盘、内存、甚至远端机器)。直接管理磁盘空间将会非常的复杂。
文件系统正是为了解决这两个问题,而在应用程序与磁盘空间之间抽象出的一层。文件系统对下实现了对磁盘空间的管理,对上为应用程序呈现层级数据组织形式和统一的访问接口。
基于文件系统,应用程序只需要创建、删除或读取文件即可,他们并不需要关注磁盘空间的细节,所有磁盘空间管理相关的动作交由文件系统来处理。
相关概念
- 目录:在文件系统中目录是一种容器,它可以容纳子目录和普通文件。但同时目录本身也是一种文件。只不过目录中存储的数据是特殊的数据,这些数据就是关于文件名称等元数据(管理数据的数据)的信息。
- 文件:在文件系统中,最基本的概念是文件,文件是存储数据的实体。从用户的角度来看,文件是文件系统中最小粒度的单元。为了便于用户对文件进行识别和管理,文件系统为每个文件都分配了一个名称,称为文件名。同时为了方便用户辨别文件的类型,每个文件都会有一个拓展名来标识其类型。(但在文件系统中都以字节流存储)
- 链接:Linux 中的链接分为软链接(Soft Link)和硬链接(Hard Link)两种。其中,软链接又被称为符号链接(Symbolic Link),它是文件的另外一种形态,其内容指向另外一个文件路径(相对路径或绝对路径)。硬链接则不同,它是一个已经存在文件的附加名称,也就是同一个文件的第 2 个或第 N 个名称。
基本原理
文件系统的主要核心就是对下实现了对磁盘空间的管理,对上为应用程序呈现层级数据组织形式和统一的访问接口。
在文件系统中,为了简化用户对数据的访问,向用户屏蔽数据的存储方式,其会对磁盘空间进行规划、组织和编号处理。
以 Ext4 文件系统为例,它会将磁盘空间进行划分。 首先将磁盘空间划分为若干个子空间,这些子空间称为块组。然后将每个子空间划分为等份的逻辑块,逻辑块是最小的管理单元。
为了管理这些逻辑块,需要一些区域来记录哪些逻辑块已经被使用了,哪些还没有被使用。记录这些数据的数据通常在磁盘的特殊区域,我们称这些数据为文件系统的元数据(Metadata)。通过元数据,文件系统实现了对磁盘空间的管理,最终为用户提供了简单易用的接口。
当我们调用这些接口时,用户对文件的操作就转化为文件系统对磁盘空间的操作。 比如,当用户向某个文件写入数据时,文件系统会将该请求转换为对磁盘的操作,包括分配磁盘空间、写入数据等。而对文件的读操作则转换为定位到磁盘的某个位置、从磁盘读取数据等。
分类
目前,常见的文件系统有几十种。虽然文件系统的具体实现形式纷繁复杂,具体特性也各不相同,但是有一定规律可循。下面将介绍一下常见的文件系统都有哪些。
本地文件系统
本地文件系统是对磁盘空间进行管理的文件系统,也是最常见的文件系统形态。从呈现形态上来看,本地文件系统就是一个树形的目录结构。本地文件系统本质上就是实现对磁盘空间的管理,实现磁盘线性空间与目录层级结构的转换。
从普通用户的角度来说,本地文件系统主要方便了对磁盘空间的使用,降低了使用难度,提高了利用效率。常见的本地文件系统有 ExtX、Btrfs、XFS 和 ZFS 等。
伪文件系统
伪文件系统是 Linux 中的概念,它是对传统文件系统的延伸。伪文件系统存在于内存,不占用硬盘。它以文件系统的形态实现用户与内核数据交互的接口,其通过文件的形式向用户提供一些系统信息,用户通过读写这些文件就可以读取、修改系统的一些信息。 常见的伪文件系统有 proc、sysfs 和 configfs 等。
例如我们在 Linux 中通常用来检测性能的一些工具(如 iostat、top 等),其本质上就是通过访问 /proc/cpuinfo
、/proc/diskstats
、/proc/meminfo
等文件来获取内核信息。
网络文件系统
网络文件系统(Network File System)是基于 TCP/IP 协议(整个协议可能会跨层)的文件系统,它可以将远端服务器文件系统的目录挂载到本地文件系统的目录上,允许用户或者应用程序像访问本地文件系统的目录结构一样,访问远端服务器文件系统的目录结构,而无需理会远端服务器文件系统和本地文件系统的具体类型,非常方便地实现了目录和文件在不同机器上进行共享。
网络文件系统通常分为客户端和服务端,其中客户端类似本地文件系统,而服务端则是对数据进行管理的系统。网络文件系统的使用与本地文件系统的使用没有任何差别,只需要执行 mount
命令挂载远端文件系统即可。常见的网络文件系统如 NFS、SMB 等。
集群文件系统
集群文件系统(Clustered File System)是指运行在多台计算机之上,之间通过某种方式相互通信从而将集群内所有存储空间资源整合、虚拟化并对外提供文件访问服务的文件系统。
其本质上还是一种本地文件系统,但与 NTFS、EXT 等本地文件系统的目的不同,它通常构建在基于网络的 区域存储网络(SAN) 设备上,且在多个节点中共享 SAN 磁盘。前者是为了扩展性,后者运行在单机环境,纯粹管理块和文件之间的映射以及文件属性。
集群文件系统最大的特点是可以实现客户端节点对磁盘介质的共同访问,且视图具有一致性。其访问模式如下图:
其最大的特点是多个节点可以同时为应用层提供文件系统服务,特别适合用于业务多活的场景,通过集群文件系统提供高可用集群机制,避免因为宕机造成服务失效。
分布式文件系统
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点(可简单的理解为一台计算机)相连;或是若干不同的逻辑磁盘分区或卷标组合在一起而形成的完整的有层次的文件系统。
从本质上来说,分布式文件系统其实也是网络文件系统的一种,其与网络文件系统的差异在于服务端包含多个节点,也就是服务端是可以横向扩展的。