什么是文件系统?
我们都知道,数据是存储在硬盘、u盘等存储设备中的,数据在这些物理设备中的最终形态,都是0和1这种二进制的形式。而我们平时在windows或linux操作系统中,都是以文件夹、目录的形式存放各种文件的。
那么如何把我们的文件从目录树的形式变成二进制的格式到存储设备中,主要就是文件系统的功劳了。文件系统就是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。

对于用户来说,一个文件中的数据是线性的,例如文件中几个G的数据也可以以线性的方式从前到后展示出来。但是在文件系统层面并非是线性的,这些数据在存储设备中可以存储在任意位置。
一个磁盘可以看作是一个线性空间,而文件系统在格式化磁盘时会将这个线性空间划分成若干大小相同的块,启动块的大小是由PC标准规定的1KB,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块。启动块之后的各个块才是文件系统的开始。
文件系统为了方便管理文件,会将一个文件分成许多个等长的数据块(例如4k或者8k),文件系统中存有各个数据块到磁盘物理存储位置的映射关系,也是我们在linux操作系统中经常听到的inode,一个文件对应一个inode。

inode除了逻辑地址与物理地址的映射关系以外,还会存储些其他的信息,比如文件的创建时间、文件权限、链接数等文件属性相关信息。而不同的文件系统,inode有所不同,存储逻辑地址与物理地址映射关系的方式也有所不同。

在构建文件系统时,会将存储设备的一部分分出来用于存储inode信息,所以inode节点的总数,在构建文件系统时就定好了,通过 df -i 可以查看设备inode的使用量,由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。

文件系统的分类
我们最常用的就是本地文件系统,也可以叫DAS直连附加存储,就是存储设备直接连接到计算机的主板上,然后在块设备上建立文件系统。例如linux中的ext4、xfs,我们可以将一块物理盘划分成多个文件系统,也可以将多块物理磁盘通过raid做成一个文件系统。本质就是实现目录树到磁盘存储的转换。
伪文件系统是linux中的概念,大家都听过,在linux操作系统中,一切皆文件。伪文件系统不会持久化数据,只存在内存当中,通过文件系统的形式为访问系统内核数据的操作提供接口,比如用户和应用程序可以通过/proc目录得到系统的信息,并可以动态改变内核的某些参数。
网络文件系统基于TCP/IP协议,从一个计算机访问另一个计算机的文件系统,就像访问本地文件系统一样,例如NFS,FTP。这种也可以叫做NAS存储。另外还有一种经常和NAS存储一起提到的SAN存储,它实现的是块级别的共享,就是将在另一个计算机的存储服务识别为一个块设备,在本地构建这个块设备的文件系统,这种方式对网络要求较高。
下篇写写和 inode 关系较紧密的文件描述符,欢迎关注~
