1.前言
文件系统狭义的概念是一种对存储设备上的数据进行组织和控制的机制。在 Linux 下,文件不仅仅包含保存在磁盘的各种格式的数据,还包含目录,甚至各种各样的设备,如键盘、鼠标、网卡、标准输出等,引用一句经典的话“UNIX 下一切皆文件”。
2.系统文件分类
Linux 下的文件系统是对复杂系统进行合理抽象的一个经典的例子,它通过一套统一的接口函数对不同的文件进行操作。例如 open()函数不仅可以打开 ext2 类型的文件,还可以打开 fat32 类型的文件,并且包括如串口设备、显卡等,只不过打开设备的名称不同而已。 Linux 下的文件主要分为如下几种。
- 普通文件:例如保存在磁盘上的 C 文件、可执行文件,以及目录等,这种文件的特性是数据在存储设备上存放,内核提供了对数据的抽象访问,此种文件为一种字节流,访问接口完全独立于在磁盘上的存储数据。
- 字符设备文件:是一种能够像文件一样被访问的设备,例如控制台、串口等。
- 块设备文件:磁盘是此类设备文件的典型代表,与普通文件的区别是操作系统对数据的访问进行的重新的格式设计。
- socket 文件:它是 Linux 中通过网络进行通信的方式,对网络的访问可以通过文件描述符的抽象实现,访问网络和访问普通文件相似。
3.设备文件
Linux下用设备文件来表示支持的设备类型,每个设备文件除了设备名称,还有三个属性,即类型、主设备号和次设备号。
4.虚拟文件系统VFS
Linux 的文件系统是由虚拟文件系统作为媒介搭建起来的,虚拟文件系统VFS(Virtual File Systems)是Linux 内核层实现的一种架构,为用户空间提供统一的文件操作接口。用户应用程序通过系统调用,与内核中的虚拟文件系统交互,操作实际的文件系统和设备。
Linux 文件系统支持多种类型的文件,对多种类型的文件系统进行了抽象。通过一组相同的系统调用接口,Linux 可以在各种设备上实现多种不同的文件系统。例如,wrie()函数可以向多种不同的文件系统上写入数据。
Linux 的文件系统用一组通用对象来表示,这些对象是超级块(superblock)、节点索引(inode)、目录结构(dentry)和文件(file)。超级块是每种文件系统的根,用于描述和维护文件系统的状态。文件系统中管理的每个文件在 Linux 中表示为一个索引节点 inode。inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。另一组结构称为 dentry,它们用来实现名称和 inode 之间的映射,有一个目录缓存用来保存最近使用的 dentry。
在注册新的文件系统时,会把这个文件系统和它的相关信息添加到 file systems 列表中。在命令行上输入 cat proc/filesystems,就可以查看这个列表。