Linux文件系统挂装与高层体系结构
2.1000 0 records in 3.1000 0 records out 4.$ losetup /dev/loop1 /mnt/point1/file.img 5.$ mke2fs -c /dev/loop1 1000 6.mke2fs 1.35 (28-Feb-2004) 7.max_blocks 1024000, rsv_groups = 125, rsv_gdb = 3 8.Filesystem label= 9.... 10.$ mkdir /mnt/point2 11.$ mount -t ext2 /dev/loop1 /mnt/point2 12.$ ls /mnt/point2 13.lost found 14.$ ls /mnt/point1 15.file.img lost found 16.$ 通过这个简单的演示很容易体会到Linux文件系统(和循环设备)是多么强大.可以按照相同的方法在文件上用循环设备创建加密的文件系统.可以在需要时使用循环设备临时挂装文件,这有助于保护数据.
文件系统体系结构 既然已经看到了文件系统的构造方法,现在就看看Linux文件系统层的体系结构.本文从两个角度考察Linux文件系统.采用高层体系结构的角度.然后进行深层次讨论,介绍实现文件系统层的主要结构. 高层体系结构 尽管大多数文件系统代码在内核中(后面讨论的用户空间文件系统除外),但是图 1 所示的体系结构显示了用户空间和内核中与文件系统相关的主要组件之间的关系.
用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口.系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点. VFS 是底层文件系统的主要接口.这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大.有两个针对文件系统对象的缓存(inode 和 dentry).它们缓存最近使用过的文件系统对象. 每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用.缓冲区缓存会缓存文件系统和相关块设备之间的请求.例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递.这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度.以最近使用(LRU)列表的形式管理缓冲区缓存.注意,可以使用 sync 命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备). 这就是 VFS 和文件系统组件的高层情况.现在,讨论实现这个子系统的主要结构. 主要结构 Linux 以一组通用对象的角度看待所有文件系统.这些对象是超级块(superblock)、inode、dentry 和文件.超级块在每个文件系统的根上,超级块描述和维护文件系统的状态.文件系统中管理的每个对象(文件或目录)在Linux中表示为一个 inode.inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作).另一组结构称为 dentry,它们用来实现名称和 inode 之间的映射,有一个目录缓存用来保存最近使用的 dentry.dentry 还维护目录和文件之间的关系,从而支持在文件系统中移动.,VFS 文件表示一个打开的文件(保存打开的文件的状态,比如写偏移量等等). 虚拟文件系统层 VFS 作为文件系统接口的根层.VFS 记录当前支持的文件系统以及当前挂装的文件系统. 可以使用一组注册函数在Linux中动态地添加或删除文件系统.内核保存当前支持的文件系统的列表,可以通过 /proc 文件系统在用户空间中查看这个列表.这个虚拟文件还显示当前与这些文件系统相关联的设备.在Linux中添加新文件系统的方法是调用 register_filesystem.这个函数的参数定义一个文件系统结构(file_system_type)的引用,这个结构定义文件系统的名称、一组属性和两个超级块函数.也可以注销文件系统. 在注册新的文件系统时,会 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |