Linux虚拟文件系统对物理文件的管理
2011-06-22侯旗陈慈发艾伟
侯旗,陈慈发,艾伟
(三峡大学,宜昌443002)
引 言
随着嵌入式技术的发展,越来越多的嵌入式设备采用Linux作为其操作系统。Linux支持各种物理文件系统,而不同物理文件系统具有不同的组织结构和不同的处理方式。为了兼容支持不同的文件系统,Linux设计了在系统启动时由系统在内存创建的文件系统,即虚拟文件系统(Virtual File System,VFS)。该文件系统对不同的物理文件系统的所有特性进行抽象,屏蔽各种文件系统的差别,向Linux内核和进程提供了一个处理各种物理文件系统的公共接口,从而实现了对不同文件系统的支持。而且,Linux系统把一切的设备也当作文件来处理。理解Linux虚拟文件系统机制对于学习Linux运行原理起着重要的作用。本文对Linux虚拟文件系统原理进行了较为详尽的分析。
1 Linux VFS基本原理
Linux以EXT2作为基本的文件系统,组成虚拟文件系统的超级块、索引节点、目录项等数据结构,兼容于各种文件系统的相应数据结构,从而实现了对多种文件系统的透明调用。
1.1 Linux所支持的文件系统的一般结构
Linux继承了Uinx,把文件名和文件控制信息分开管理。一个Linux所支持的物理文件系统使用的块设备上的一个独立逻辑分区可大致分为:引导块、超级块、inode块、data块4部分[1]。超级块是描述文件系统整体信息的数据结构,在系统运行期间被读入内存,在内存中建立一个超级块的映像。Linux所支持的文件系统的一般结构如图1所示。
图1 Linux所支持的文件系统的一般结构
1.2 VFS对物理文件系统的管理
Linux VFS采用超级块(super_block)和索引节点(inode)来描述文件系统。这里的super_block和inode不同于物理文件系统中的super_block和inode数据结构,VFS super_block是VFS把不同文件系统中的整体组织和结构信息进行抽象后形成的,兼顾不同文件系统的统一的超级块结构。在安装文件系统时,由系统在内存中建立,其内容主要由文件系统的超级块数据来填充。inode则是在系统打开文件时,由系统在内存动态建立,其内容主要由文件系统的inode节点的数据来填充。
Linux VFS除了没有存储文件内容的data块外,文件系统的结构与物理文件系统基本相似,如图2所示。
图2 Linux VFS文件系统结构
Linux进程通过VFS中相应的超级块和索引节点中的信息,准确地访问操作目的磁盘文件系统中的相应文件。
2 Linux VFS的实现
为了区分文件系统中的inode,这里把VFS中的inode称为vnode。
Linux系统支持文件系统目录树机制,根据路径名,如/home/xyz/work/test.c,就 可 以 在 磁 盘 上 找 到 文 件test.c的目录项和索引节点。在路径/home/xyz/work/test.c中,目录/、home、xyz、work以及普通文件test.c都对应一个目录项对象。目录项在磁盘文件系统中的数据结构是dir_entry,VFS在遍历路径名的过程中将其解析成内存目录项对象(dentry对象)和vnode对象。
vnode与某个文件的对应关系是通过设备号i_dev与inode号i_ino建立的,它们唯一地指定了某个设备上的一个文件或目录。vnode是设备上的文件或目录的inode在内存中的统一对应结构,并且给出了不同文件系统特有的信息,即各种文件系统的inode在内存中的映像。
如前所述,Linux继承了Uinx,把文件名和文件控制信息分开管理,由目录项(dir_entry)管理文件名,索引节点(inode)管理文件控制信息,并且通过dir_entry结构中的d_inode域指向文件的inode节点,建立与文件索引节点的联系。文件的索引节点(inode)结构体包含了关于文件的组织信息和管理信息,根据其中的i_info查找存储文件内容的数据块,根据i_op指向的inode_operations结构,通过其中的指针函数调用各自的inode操作函数。
系统进程使用文件由表示进程当前打开的所有文件的数据结构files_struct建立进程与文件系统的关系。指针fd和fd_array都指向代表打开文件对象数组。进程调用文件操作函数,依据文件路径打开文件,文件操作函数返回一整数,即文件描述符,例如int open(const char*pathname,int flages)[2]。之后,进程便用文件描述符来表示一个打开的文件,该整数文件描述符就是files_struct中file数组fd的下标。
图3描述了进程使用文件时用到的VFS中主要数据结构的关系。
图3 VFS中主要数据结构关系图
dentry结构描述的是逻辑意义上的文件,记录的是其逻辑上的属性。只要是有效的dentry结构,则其指针d_inode必定指向一个inode结构。而inode结构所代表的是物理意义上的文件,记录的是其物理上的属性。一个inode结构可能对应着不只一个dentry结构,因为一个物理意义上的文件可以被链接(link)其他路径名。
所以,在inode结构中有个队列i_dentry,凡是代表着这个文件的所有目录项(普通文件也是目录文件的一种)都是通过dentry结构中的d_alias挂入相应的inode结构中的i_dentry队列。
结 语
本文主要从数据结构的角度出发,对Linux虚拟文件系统的实现技术作了简要的分析。Linux系统把一切设备都作为文件看待,深入探究Linux虚拟文件系统的文件组织方式,可以为系统软件设计和嵌入式Linux驱动开发提供一定参考价值。
[1]毛德操.Linux内核源代码情景分析(上)[M].杭州:浙江大学出版社,2009:428-430.
[2]韩超,魏治宇,寥文江.嵌入式linux上的C语言编程实践[M].北京:电子工业出版社,2009:163-164.