分类:
2011-04-29 15:25:50
原文地址:文件系统典型实现方式 作者:zyd_cu
1. 用户空间文件系统
用户空间文件系统位十内核之外,实现为一个用户进程或者一个运行库。在用户空间开发文件系统的主要原因是,开发工作相对比较简单。这种方法避免了内核编程的复杂性,极大的简化了开发工作。用户级文件系统的另一个优点是,文件系统可以由用户自己安装,不需要系统管理员的参与,这给用户使用文件系统提供了很大的灵活性。一个运行在用户空间的文件系统这样与用户进程和操作系统进行交互(以读文件操作为示例):
1. 一个用户进程发出一个读文件的请求。
2. 这个请求被转换为一个内核系统调用,内核调用用户级文件系统。
3. 用户级文件系统产生另一个内核调用,从存储介质中提取读操作要求的数据。
4. 内核将数据返回给用户级文件系统。
5. 用户级文件系统再次调用内核操作,准备把数据返回给用户进程。
6. 内核将数据传给用户进程完成读操作。
这类文件系统的典型例子有以FUSE为模板开发出的各种文件系统。FUSE是一个用户空间文件系统的模板,它有一组文件操作例如read(), write(), lseek0)的接口,只要实现这些接口就能构建一个用户空间文件系统。例如,在这些接口中加入加密功能,就能实现加密文件系统,加入压缩功能,就能实现压缩文件系统。用户空间文件系统的主要缺点是性能不高,因为需要多次上下文切换。
2. 内核文件系统
内核文件系统是最典型的文件系统开发方式,常见的基十磁招‘的文件系统都是以这种形式实现的,如EXT2和JF S。实现一个内核文件系统通常要考虑如下细节:
1. 设计一合适的数据格式。这将决定文件系统的效率和磁盘的空间利用率。一般来说没有一种通用的数据格式可以适合所有的应用需求,有些格式适合存储大量的小文件,Ifu有些格式存储大文件具有更好的性能。
2. 如何保证文件系统的一致性。当计算机系统非正常终止时,很可能有存在于缓存中的数据还没有写入磁招‘,这可能会导致文件系统出现不一致的元数据。EXT3使用口志来保证一致性。
3. 提供用户工具。内核文件系统通常需要提供格式化、参数调整和磁盘碎片整理等用户工具。
开发一个内核文件系统要复杂的多,因为文件系统直接和存储设备的驱动程序交互,这要求开发者深入理解操作系统的内部结构。这种方法没有充分利用以前的开发成果,要重新设计文件系统的所有功能。
内核文件系统的主要优点是它的性能比用户空间文件系统要好得多,因为它作为内核特权模式运行,没有用户空间文件系统的附加的上下文切换操作。
3. 可堆叠文件系统
可堆叠文件系统是利用vnode堆叠技术实现的。vnode是指Unix系统在虚拟文件系统层用来表示一个打开的文件或目录的对象,具体到Linux来说vnode就是指VFS中的mode对象。vnode接口抽象出了内核其它部分能对一个文件系统进行的操作,隐藏了文件系统对文件操作的具体实现,从Ifu允许系统可以透明的访问一个文件系统,Ifu不用关心其具体类型。vnode节点概念的一个改进是vnode分层堆叠。这种技术让一个vnode接口调用另一个,从而使文件系统功能设计模块化。有了vnode分层堆叠后,可以有多个vnode并b_它们按顺序被调用。可堆叠文件系统实现了堆叠式的vnode接口,从Ifu可以工作在另一个文件系统之上,利用下层文件系统进行基本的数据访问,并在其之增加新的特性(如提供密和压缩功能)。
可堆叠文件系统实现了VFS定义的接口,因此可以象不同文件系统一样挂载在VFS之下工作,但与基十块设备的文件系统(如EXT2)或者网络文件系统(NFS)不同,可堆叠文件系统本身并不提供基本的文件数据存储,Ifu是依赖底层的文件系统来实现。它的基本工作原理是:接收文件系统相关的系统调用,对参数进行相关处理,然后转发到下层文件系统获取返回结果,进一步处理并返回最终结果。可堆叠文件系统可以在大部分Unix系统中实现。