活腿肠 2020-03-01
在计算机出现之前其实就有文件系统的概念了,此时的文件系统是指用于管理(存储和检索等)纸质文件的系统。计算机及发明后,文件系统逐渐专指用于管理存储介质的系统。它通过简单的接口给用户,方便用户使用存储设备。
Linux操作系统下的文件系统基本上也是如此。当我们进入Linux操作系统时,首先看到的是各种类型的目录(参考一篇文章学会Linux系统目录管理)和各种文件。Linux有个理念就是“一切皆文件”,在Linux操作系统中几乎所有资源都是以文件的形式呈现的。比如磁盘是文件,套接字是文件,系统配置项也是文件。所有这些内容在Linux都是通过文件系统来管理的。
在操作系统中,文件系统的概念得到了延伸。Linux的文件系统分为两类,一类是真实的文件系统,用于存储数据;另一类是伪文件系统,这些文件系统并不会持久化数据。今天我们将对Linux下的文件系统进行整体的介绍,让大家对文件系统有个概括的了解。
文件系统的使用
在Linux操作系统中文件系统的使用是非常简单的。如果使用的是Ubuntu等有图形界面的操作系统,那么我们可以通过GUI浏览文件系统。这个跟使用Windows和Mac OS操作系统很像。从用户角度来看,文件系统的文件被组织成树形结构。用户可以自由的创建目录和文件。
但是如果是命令行的系统,那么就没有图形界面方便了。但是,从组织形式上来说,也是树形结构。只不过没有那么直观。如图我们通过tree命令可以看到文件系统的内容及结构。
当然,上面说的都是文件系统已经挂载的场景。有些情况下我们有一个新的磁盘,但并没有挂载,这个时候怎么才能使用这块磁盘呢?方法也是非常简单的,只需要做如下几步:
完成上述步骤后,/mnt/ext4_test目录就是新磁盘的根目录了,我们可以在其中创建子目录或者新文件了。从普通用户的角度来看,它只是一个子目录,并不会感知到其是一个新的磁盘,或者文件系统的具体类型。这一点与Windows有比较大的差异。
文件系统的基本原理
在操作系统层面,文件系统是其最关键的子系统之一,其核心功能是对存储资源的管理。也就是说文件系统是对磁盘(还包括光盘或者磁带等其它类型的存储介质)的空间进行管理的。文件系统对磁盘空间的管理其实还是比较简单的,就是将大的磁盘空间切割为很小的区域(例如4KB),然后通过对这些小区域的分配和释放来使用磁盘空间。
虽然文件系统是一个树形结构,但是磁盘本身的空间却是一个扁平的线性存储空间。以Ext4为例,文件系统将磁盘划分为若干个块组,每个块组又划分为若干磁盘块(可以在格式化时指定,默认是1KB)。
为了管理这些磁盘块,总是需要一些区域来记录哪些磁盘块已经被使用了,哪些还没有被使用。记录这些数据的数据通常在磁盘的特殊区域,我们称这些数据为文件系统的元数据。通过这些元数据文件系统实现了对磁盘空间的管理,最终为用户提供了简单易用的接口(使用接口,非API)。
文件系统的分类
前文我们介绍了基于存储介质的本地文件系统,对其基本原理也做了介绍。其实文件系统发展到现在,其种类也丰富多样。比如基于磁盘的普通本地文件系统除了Ext4外,还包括XFS、ZFS和Btrfs等等。其中Btrfs和ZFS不仅仅可以管理一块磁盘,还可以实现多块磁盘的管理,同时实现数据的冗余管理,这样可以避免磁盘故障导致的数据丢失。
另一个方面,除了对磁盘数据管理的文件系统外,还有一些网络文件系统。也就是说,这些文件系统看似在本地,但其实数据是在远程的专门的设备上。客户端是通过一些网络协议实现数据的传输的。比如NFS和GlusterFS等等文件系统。
几十年的发展,文件系统的种类也非常多,我们没有办法一一进行介绍。今天我们就按照大类对主要的文件系统进行介绍,不足之处还请指教。
1. 本地文件系统
本地文件系统是对磁盘空间进行管理的文件系统。从呈现形态上来看,文件系统就是一个树形的目录结构。前面我们已经介绍了比较多的概念,其本质上就是实现对磁盘空间的管理,实现磁盘线性空间与目录结构的转换。
从普通用户的角度来说,主要方便了对磁盘空的使用,降低了使用难度,提高了利用效率。常见的本地文件系统有Ext4、Btrfs、XFS和ZFS等等。
2. 伪文件系统
伪文件系统是对传统文件系统的延伸。伪文件系统并不会持久化数据,而是在内存中的文件系统。它以文件系统的形态实现用户与内核数据的交互。比如我们常见的伪文件系统包括proc、sysfs和configfs等等。
在Linux操作系统中伪文件系统主要实现内核与用户态的交互。比如获取IPv4协议的参数,我们只需要
3. 网络(分布式)文件系统
网络文件系统是一种将数据存储在远端的文件系统。网络文件系统通常分为客户端和服务端,其中客户端类似本地文件系统,而服务端则是对数据进行管理的系统。网络文件系统的使用与本地文件系统没有任何差别,只需要执行mount命令挂载即可。网络文件系统种类也很多,比如NFS、CephFS和Gluster等。
在用户层面,完成挂载后的网络文件系统与本地文件系统完全一样,看不出任何差异,对用户是透明的。网络文件系统就好像将远程的文件系统映射到了本地。
如图是将文件系统服务中文件系统映射到客户端的示意图。从用户的角度只是某个子目录,但实际上读写请求需要通过网络转发到服务端进行处理。
4. 集群文件系统
集群文件系统也是一种本地文件系统。与普通本地文件系统的差异在于其后端磁盘通常是基于网络的SAN设备,且在多个节点共享(非绝对)。集群文件系统可以实现多个节点对磁盘介质的共同访问。