转载:https://developer.ibm.com/tutorials/l-linux-filesystem/?mhsrc=ibmsearch_a&mhq=linux
作者:M.TimJones
Linux文件系统架构是一个具有抽象性和复杂性的例子。通过使用一组通用的API函数,可以在多种存储设备上支持多种文件系统。以read函数调用为例,它允许从给定的文件描述符中读取一定数量的字节。在这过程中read函数不知道文件系统类型,它也不知道安装文件系统的特定存储介质,然而当read为打开的文件调用函数被使用时,数据会按照预期值进行返回。
文件系统
文件系统是存储设备上数据和元数据的组织。有了这样一个定义,您就会知道支持这一点所需的代码会很有趣。正如所提到的,有多种类型的文件系统和媒体,通过所有这些变化,您可以了解到Linux文件系统接口是作为分层架构实现的。
主要结构
Linux从一组通用对象的角度查看所有文件系统。这些对象是超级块、inode、dentry和文件。每个文件系统的根是超级块,它存储和维护文件系统的状态。在文件系统(文件或目录)中管理的每个对象在Linux中都表示为一个inode。inode包含管理文件系统中对象的所有元数据(包括可能对其进行的操作)。另一组称为dentries的结构用于在名称和inode之间进行转换,其中存在的目录缓存用来保留最近使用的内容。dentry还可以维护目录和文件之间的关系以遍历文件系统。
虚拟文件系统层
VFS充当文件系统接口的根级别。VFS跟踪当前支持的文件系统,以及当前挂载的文件系统。
可以使用一组注册函数从Linux中动态添加或删除文件系统。内核保留了当前支持的文件系统列表,可以通过/proc文件系统在用户空间查看。此虚拟文件还显示当前与文件系统关联的设备,这部分需要一个定义对文件系统结构(file_system_type)的引用参数,该结构定义了文件系统的名称、一组属性和两个超级块函数。
inode和dentry
inode代表文件系统中具有唯一标识符的对象,各个文件系统提供了将文件名转换为唯一的inode标识符,然后转换为inode引用的方法。特别注意inode_operations和file_operations,结构中的每一个都是指可以在inode上执行的单个操作。例如,inode_operations定义那些直接对inode进行操作的操作,并将file_operations引用那些与文件和目录相关的方法。
缓冲区缓存
除了单独的文件系统实现,文件系统层的底部还采用了缓冲区的形式进行缓存。该元素跟踪来自各个文件系统实现和物理设备的读写请求。为了提高效率,Linux 维护了请求的缓存,以避免所有请求都必须返回到物理设备。
总结
虽然文件系统的实现绝不是仅文中提到的这些的,但它是可扩展和可扩展架构的一个很好的例子。文件系统架构经过多年发展,已成功支持多种不同类型的文件系统和多种类型的目标存储设备。在不久的将来观察 Linux 文件系统的演变将会很有趣。