分类: LINUX
2013-09-21 21:57:27
原文地址:Unix / Linux 文件系统解析 作者:wangspace
文件系统是对存储设备上的数据和元数据进行组织的机制。Linux文件系统接口实现为分层的体系结构,从而建爱你个用户的接口层、文件系统实现和操作存储设备的驱动程序分割开。
2.挂载
在Linux中将文件系统与一个存储设备关联起来的过程为挂载(mount),使用mount command 将一个文件系统附着到文件系统层次结构中。在执行挂载时,要提供文件爱你系统类型、文件系统和一个挂载点。
从两个角度考察Linux文件系统。首先采用高层次体系结构的角度,然后,介绍实现文件系统层的主要结构。
3.1高层体系结构:
图1所示的体系结构显示了用户空间和内核中与文件系统的主要组件之间的关系。
用户空间包含一些应用程序(例如,文件系统的使用者)和GNU C Library(glibc),他们为文件系统调用(打开,读取,写和关闭)提供用户接口。系统调用接口的作用就像交换器,它将系统调用从用户空间发送到内核空间中的适当端点。
VFS是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode 和 dentry)。他们缓存最近使用过的文件系统对象。
每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问 物理设备的次数,加快访问速度。以最近使用(LRU)列表的形式管理缓冲区缓存。注意,可以使用 sync 命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)。这就是 VFS 和文件系统组件的高层情况。
5.虚拟文件系统层
VFS 作为文件系统待接口的跟层。VFS记录当前支持的文件的文件系统以及当前挂载的文件系统。
可以使用一组注册函数在linux中动态的添加或删除文件系统。内核保存当前的文件系统列表,可以通过/proc 文件系统在用户空间中查看这个列表。这个虚拟文件还显示当前与这些文件系统相关联的设备。在linux 中添加新文件系统的方法使用是调用 register_filesystem. 这个函数的参数定义一个文件系统结构(file_system_type)的引用,这个结构定义文件系统的名称、一组属性和两个超级块函数。也可以注销文件系统。
在注册新的文件系统时,会把这个文件系统和它的相关信息添加到 file_systems 列表中(见图 2 和 linux/include/linux/mount.h)。这个列表定义可以支持的文件系统。在命令行上输入 cat /proc/filesystems,就可以查看这个列表。
VFS 中维护的另一个结构是挂装的文件系统(见图 3)。这个结构提供当前挂装的文件系统(见 linux/include/linux/fs.h)。它链接下面讨论的超级块结构。
超级块
超级块结构表示一个文件系统。它包含管理文件系统所需的信息,包括文件系统名称(比如 ext2)、文件系统的大小和状态、块设备的引用和元数据信息(比如空闲列表等等)。超级块通常存储在存储媒体上,但是如果超级块不存在,也可以实时创建 它。可以在 ./linux/include/linux/fs.h 中找到超级块结构(见图 4)。
超级块中的一个重要元素是超级块操作的定义。这个结构定义一组用来管理这个文件系统中的 inode 的函数。例如,可以用 alloc_inode 分配 inode,用 destroy_inode 删除 inode。可以用 read_inode 和 write_inode 读写 inode,用 sync_fs 执行文件系统同步。可以在 ./linux/include/linux/fs.h 中找到 super_operations 结构。每个文件系统提供自己的 inode 方法,这些方法实现操作并向 VFS 层提供通用的抽象。
6.inode 和 dentry
inode 表示文件系统中的一个对象,它具有惟一标识符。各个文件系统提供将文件名映射为惟一 inode 标识符和 inode 引用的方法。图 5 显示 inode 结构的一部分以及两个相关结构。请特别注意 inode_operations 和 file_operations。这些结构表示可以在这个 inode 上执行的操作。inode_operations 定义直接在 inode 上执行的操作,而 file_operations 定义与文件和目录相关的方法(标准系统调用)。
inode 和目录缓存分别保存最近使用的 inode 和 dentry。注意,对于 inode 缓存中的每个 inode,在目录缓存中都有一个对应的 dentry。可以在 ./linux/include/linux/fs.h 中找到 inode 和 dentry 结构。
7.缓冲区缓存
除了各个文件系统实现(可以在 ./linux/fs 中找到)之外,文件系统层的底部是缓冲区缓存。这个组件跟踪来自文件系统实现和物理设备(通过设备驱动程序)的读写请求。为了提高效率,Linux 对请求进行缓存,避免将所有请求发送到物理设备。缓存中缓存最近使用的缓冲区(页面),这些缓冲区可以快速提供给各个文件系统。