ImageVerifierCode 换一换
格式:DOCX , 页数:77 ,大小:660.07KB ,
资源ID:6893069      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6893069.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Linux 文件系统.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Linux 文件系统.docx

1、Linux 文件系统Linux 文件系统 Linux 文件系统体系结构 Linux 文件系统 ext2、ext3 Linux ReiserFS 文件系统 Linux 新型文件系统 RAID JFS LVMLinux 文件系统体系结构Linux 文件系统剖析在文件系统方面,Linux 可以算得上操作系统中的 “瑞士军刀”。Linux 支持许多种文件系统,从日志型文件系统到集群文件系统和加密文件系统。对于使用标准的和比较奇特的文件系统以及开发文件系统来说,Linux 是极好的平台。本文讨论 Linux 内核中的虚拟文件系统(VFS,有时候称为虚拟文件系统交换器),然后介绍将文件系统连接在一起的主要

2、结构。基本的文件系统体系结构Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子。通过使用一组通用的 API 函数,Linux 可以在许多种存储设备上支持许多种文件系统。例如,read函数调用可以从指定的文件描述符读取一定数量的字节。read函数不了解文件系统的类型,比如 ext3 或 NFS。它也不了解文件系统所在的存储媒体,比如 AT Attachment Packet Interface(ATAPI)磁盘、Serial-Attached SCSI(SAS)磁盘或 Serial Advanced Technology Attachment(SATA)磁盘。但是,当通过调用rea

3、d函数读取一个文件时,数据会正常返回。本文讲解这个机制的实现方法并介绍 Linux 文件系统层的主要结构。什么是文件系统?首先回答最常见的问题,“什么是文件系统”。文件系统是对一个存储设备上的数据和元数据进行组织的机制。由于定义如此宽泛,支持它的代码会很有意思。正如前面提到的,有许多种文件系统和媒体。由于存在这么多类型,可以预料到 Linux 文件系统接口实现为分层的体系结构,从而将用户接口层、文件系统实现和操作存储设备的驱动程序分隔开。文件系统作为协议另一种看待文件系统的方式是把它看作一个协议。网络协议(比如 IP)规定了互联网上传输的数据流的意义,同样,文件系统会给出特定存储媒体上数据的意

4、义。挂装在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂装(mount)。使用mount命令将一个文件系统附着到当前文件系统层次结构中(根)。在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。为了说明 Linux 文件系统层的功能(以及挂装的方法),我们在当前文件系统的一个文件中创建一个文件系统。实现的方法是,首先用dd命令创建一个指定大小的文件(使用 /dev/zero 作为源进行文件复制) 换句话说,一个用零进行初始化的文件,见清单 1。清单 1. 创建一个经过初始化的文件 $ dd if=/dev/zero of=file.img bs=1k count=1000

5、010000+0 records in10000+0 records out$现在有了一个 10MB 的 file.img 文件。使用losetup命令将一个循环设备与这个文件关联起来,让它看起来像一个块设备,而不是文件系统中的常规文件:$ losetup /dev/loop0 file.img$这个文件现在作为一个块设备出现(由 /dev/loop0 表示)。然后用mke2fs在这个设备上创建一个文件系统。这个命令创建一个指定大小的新的 ext2 文件系统,见清单 2。清单 2. 用循环设备创建 ext2 文件系统 $ mke2fs -c /dev/loop0 10000mke2fs 1.3

6、5 (28-Feb-2004)max_blocks 1024000, rsv_groups = 1250, rsv_gdb = 39Filesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)2512 inodes, 10000 blocks500 blocks (5.00%) reserved for the super user.$使用mount命令将循环设备(/dev/loop0)所表示的 file.img 文件挂装到挂装点 /mnt/point1。注意,文件系统类型指定为ext2。挂装之

7、后,就可以将这个挂装点当作一个新的文件系统,比如使用ls命令,见清单 3。清单 3. 创建挂装点并通过循环设备挂装文件系统 $ mkdir /mnt/point1$ mount -t ext2 /dev/loop0 /mnt/point1$ ls /mnt/point1lost+found$如清单 4 所示,还可以继续这个过程:在刚才挂装的文件系统中创建一个新文件,将它与一个循环设备关联起来,再在上面创建另一个文件系统。清单 4. 在循环文件系统中创建一个新的循环文件系统 $ dd if=/dev/zero of=/mnt/point1/file.img bs=1k count=1000100

8、0+0 records in1000+0 records out$ losetup /dev/loop1 /mnt/point1/file.img$ mke2fs -c /dev/loop1 1000mke2fs 1.35 (28-Feb-2004)max_blocks 1024000, rsv_groups = 125, rsv_gdb = 3Filesystem label=.$ mkdir /mnt/point2$ mount -t ext2 /dev/loop1 /mnt/point2$ ls /mnt/point2lost+found$ ls /mnt/point1file.img

9、lost+found$通过这个简单的演示很容易体会到 Linux 文件系统(和循环设备)是多么强大。可以按照相同的方法在文件上用循环设备创建加密的文件系统。可以在需要时使用循环设备临时挂装文件,这有助于保护数据。文件系统体系结构既然已经看到了文件系统的构造方法,现在就看看 Linux 文件系统层的体系结构。本文从两个角度考察 Linux 文件系统。首先采用高层体系结构的角度。然后进行深层次讨论,介绍实现文件系统层的主要结构。高层体系结构尽管大多数文件系统代码在内核中(后面讨论的用户空间文件系统除外),但是图 1 所示的体系结构显示了用户空间和内核中与文件系统相关的主要组件之间的关系。图 1.

10、Linux 文件系统组件的体系结构用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。VFS 是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode 和 dentry)。它们缓存最近使用过的文件系统对象。每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求

11、。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。以最近使用(LRU)列表的形式管理缓冲区缓存。注意,可以使用sync命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)。什么是块设备?块设备就是以块(比如磁盘扇区)为单位收发数据的设备,它们支持缓冲和随机访问(不必顺序读取块,而是可以在任何时候访问任何块)等特性。块设备包括硬盘、CD-ROM 和 RAM 盘。与块设备相对的是字符设备,字符设备没有可以进行物理寻址的媒体。字符设备包括串行端口和磁带设备,只能逐字符地读取这些设备中

12、的数据。这就是 VFS 和文件系统组件的高层情况。现在,讨论实现这个子系统的主要结构。主要结构Linux 以一组通用对象的角度看待所有文件系统。这些对象是超级块(superblock)、inode、dentry 和文件。超级块在每个文件系统的根上,超级块描述和维护文件系统的状态。文件系统中管理的每个对象(文件或目录)在 Linux 中表示为一个 inode。inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。另一组结构称为 dentry,它们用来实现名称和 inode 之间的映射,有一个目录缓存用来保存最近使用的 dentry。dentry 还维护目录和文件之间

13、的关系,从而支持在文件系统中移动。最后,VFS 文件表示一个打开的文件(保存打开的文件的状态,比如写偏移量等等)。虚拟文件系统层VFS 作为文件系统接口的根层。VFS 记录当前支持的文件系统以及当前挂装的文件系统。可以使用一组注册函数在 Linux 中动态地添加或删除文件系统。内核保存当前支持的文件系统的列表,可以通过 /proc 文件系统在用户空间中查看这个列表。这个虚拟文件还显示当前与这些文件系统相关联的设备。在 Linux 中添加新文件系统的方法是调用register_filesystem。这个函数的参数定义一个文件系统结构(file_system_type)的引用,这个结构定义文件系统

14、的名称、一组属性和两个超级块函数。也可以注销文件系统。在注册新的文件系统时,会把这个文件系统和它的相关信息添加到 file_systems 列表中(见图 2 和 linux/include/linux/mount.h)。这个列表定义可以支持的文件系统。在命令行上输入cat /proc/filesystems,就可以查看这个列表。图 2. 向内核注册的文件系统VFS 中维护的另一个结构是挂装的文件系统(见图 3)。这个结构提供当前挂装的文件系统(见 linux/include/linux/fs.h)。它链接下面讨论的超级块结构。图 3. 挂装的文件系统列表超级块超级块结构表示一个文件系统。它包含

15、管理文件系统所需的信息,包括文件系统名称(比如 ext2)、文件系统的大小和状态、块设备的引用和元数据信息(比如空闲列表等等)。超级块通常存储在存储媒体上,但是如果超级块不存在,也可以实时创建它。可以在 ./linux/include/linux/fs.h 中找到超级块结构(见图 4)。图 4. 超级块结构和 inode 操作超级块中的一个重要元素是超级块操作的定义。这个结构定义一组用来管理这个文件系统中的 inode 的函数。例如,可以用alloc_inode分配 inode,用destroy_inode删除 inode。可以用read_inode和write_inode读写 inode,用

16、sync_fs执行文件系统同步。可以在 ./linux/include/linux/fs.h 中找到super_operations结构。每个文件系统提供自己的 inode 方法,这些方法实现操作并向 VFS 层提供通用的抽象。inode 和 dentryinode 表示文件系统中的一个对象,它具有惟一标识符。各个文件系统提供将文件名映射为惟一 inode 标识符和 inode 引用的方法。图 5 显示 inode 结构的一部分以及两个相关结构。请特别注意inode_operations和file_operations。这些结构表示可以在这个 inode 上执行的操作。inode_operat

17、ions定义直接在 inode 上执行的操作,而file_operations定义与文件和目录相关的方法(标准系统调用)。图 5. inode 结构和相关联的操作inode 和目录缓存分别保存最近使用的 inode 和 dentry。注意,对于 inode 缓存中的每个 inode,在目录缓存中都有一个对应的 dentry。可以在 ./linux/include/linux/fs.h 中找到inode和dentry结构。缓冲区缓存除了各个文件系统实现(可以在 ./linux/fs 中找到)之外,文件系统层的底部是缓冲区缓存。这个组件跟踪来自文件系统实现和物理设备(通过设备驱动程序)的读写请求。

18、为了提高效率,Linux 对请求进行缓存,避免将所有请求发送到物理设备。缓存中缓存最近使用的缓冲区(页面),这些缓冲区可以快速提供给各个文件系统。有趣的文件系统本文没有讨论 Linux 中可用的具体文件系统,但是值得在这里稍微提一下。Linux 支持许多种文件系统,包括 MINIX、MS-DOS 和 ext2 等老式文件系统。Linux 还支持 ext3、JFS 和 ReiserFS 等新的日志型文件系统。另外,Linux 支持加密文件系统(比如 CFS)和虚拟文件系统(比如 /proc)。最后一种值得注意的文件系统是 Filesystem in Userspace(FUSE)。这种文件系统可

19、以将文件系统请求通过 VFS 发送回用户空间。所以,如果您有兴趣创建自己的文件系统,那么通过使用 FUSE 进行开发是一种不错的方法。结束语尽管文件系统的实现并不复杂,但它是可伸缩和可扩展的体系结构的好例子。文件系统体系结构已经发展了许多年,并成功地支持了许多不同类型的文件系统和许多目标存储设备类型。由于使用了基于插件的体系结构和多层的函数间接性,Linux 文件系统在近期的发展很值得关注。参考资料学习 您可以参阅本文在 developerWorks 全球站点上的英文原文。 proc 文件系统提供了一种通过虚拟文件系统在用户空间和内核之间进行通信的新方式。“使用 /proc 文件系统来访问 L

20、inux 内核的内容”(developerWorks,2006 年 3 月)介绍了 /proc 虚拟文件系统并演示它的使用方法。 Linux 系统调用接口可以在用户空间和内核之间传递控制,从而调用内核 API 函数。“使用 Linux 系统调用的内核命令”(developerWorks,2007 年)介绍了 Linux 系统调用接口。 Y维护 Linux 文件系统、集群文件系统和性能计算集群的列表。还可以在File systems HOWTO中找到 Linux 文件系统的完整列表。Xenotime也描述了许多文件系统。 关于 Linux 用户空间编程的更多信息,请参考本文作者所著的GNU/Li

21、nux Application Programming。 在developerWorks Linux 专区中可以找到为 Linux 开发人员准备的更多参考资料,还可以查阅最流行的文章和教程。 查阅 developerWorks 上的所有Linux 技巧和Linux 教程。 随时关注developerWorks 技术活动和网络广播。获得产品和技术 Filesystem in Userspace(FUSE)是一个支持在用户空间中开发文件系统的内核模块。文件系统驱动程序实现将来自 VFS 的请求发送回用户空间。这是一种在不借助内核开发的情况下开发文件系统的好方法。如果您精通 Python,也可以通过

22、LUFS-Python用 Python 编写文件系统。 订购 SEK for Linux,这有两张 DVD,包含最新的 IBM Linux 试用版软件,涉及 DB2、Lotus、Rational、Tivoli 和 WebSphere。 下载IBM 产品评估版,试用来自 DB2、Lotus、Rational、Tivoli 和 WebSphere 的应用程序开发工具和中间件产品。讨论 通过新的 developerWorks 空间中的 blog、论坛、podcast 和社区主题,加入developerWorks 社区。Linux 虚拟系统文件交换器剖析 (New!)Linux 的最显著特征是灵活性和

23、扩展性,例如它的虚拟文件系统交换器(VFS)。您可以在各种设备上创建文件系统,包括传统的磁盘、USB flash 驱动、内存以及其他储存设备。您还可以在另一个文件系统环境中嵌入文件系统。探索导致 VFS 如此强大的因素,并了解 VFS 的主要接口和进程。Linux 文件系统的灵活性和扩展性支持直接源于一组抽象接口。这组接口的核心就是虚拟文件系统交换器(VFS)。VFS 为上层应用程序提供一组标准接口,用于对不同的文件系统执行文件 I/O。这组接口在一个或多个底层设备上支持多个并发文件系统。另外,这些文件系统可以不是静态的,可以根据储存设备而变化。VF 与 VFS您还可以看到 VFS 还被定义为

24、虚拟文件系统(virtual file system),但定义为虚拟文件系统转换器(virtual file system switch)更能说明其作用,因为虚拟层跨多个文件系统转换(即多路复用)请求。/proc文件系统在这里带来很多的混淆,因为它通常也被称为虚拟文件系统。例如,一个典型的 Linux 桌面在可用硬盘上支持 ext3 文件系统,并且在可用的 CD-ROM(或者称为CD-ROM 文件系统或 CDFS)上支持 ISO 9660 文件系统。因为 CD-ROM 是可以插入和移除的,所以 Linux 内核必须适应这些包含不同内容和结构的新文件系统。可以通过网络文件系统(Network F

25、ile System,NFS)访问远程文件系统。在此时,Linux 还可以挂载来自本地硬盘的 Windows/Linux 双引导系统的 NT File System (NTFS) 分区,并且能够向其读写数据。最后,可移除的 USB flash 启动(UFD)是可以热插拔的,它构成另一个文件系统。概而言之,可以在这些设备中使用同一组文件 I/O 接口,从而允许底层的文件系统和物理设备能够从用户中抽象出来(见图 1)。图 1. 在不同文件系统和储存设备之间提供统一接口的抽象层分层抽象现在,我们向 Linux VFS 提供的抽象特性添加一些具体的架构。图 2 从 VFS 的角度显示 Linux 结构

26、的高级视图。在 VFS 之上的是标准的内核系统调用接口(SCI)。这个接口允许用户空间发出要求转换到内核的调用(在不同地址空间中)。在这个域中,调用 POSIXopen调用的用户空间应用程序经过 GNU C 库(glibc)进入内核和系统调用去多元化(de-multiplexing)。最后,使用sys_open调用 VFS。图 2. VFS 的分层架构早期的 VFS 实现Linux 并不是第一个包含虚拟层以支持通用文件模型的操作系统。早期的 VFS 实现包括 Sun 的 VFS(SunOS version 2.0,大约出现在 1985 年),以及 IBM 和 Microsoft 的 “Inst

27、allable File System” for IBM OS/2。这些虚拟化文件系统层的方法为 Linux VFS 铺平了道路。VFS 提供抽象层,从而将 POSIX API 与特定文件系统如何实现该行为的细节分离开来。这里的关键之处是,不管底层文件系统是 ext3 还是 Btrfs,Open、Read、Write 或 Close API 系统调用都能正常工作。VFS 提供一个由底层文件系统(它们必须为各种 POSIX API 函数实现行为)继承的通用文件模型。另一个在 VFS 范围之外的深层抽象隐藏了底层物理设备(可能是磁盘、磁盘分区、网络储存实体、内存或其他能够储存信息的媒介 即使是暂时

28、性的)。除了从底层文件系统抽象文件操作的细节之外,VFS 还将底层块设备绑定到可用的文件系统。让我们看看 VFS 的内部结构及其工作原理。VFS 的内部结构在查看 VFS 子系统的总体架构之前,我们先看看所使用的主要对象。这个小节探索了超块(superblock)、索引节点(或inode)、目录条目(或dentry)和文件对象。在这里,其他一些组成部分也很重要,比如缓存。不过我将在后面的总体架构中讨论它们。超块超块(superblock)是关于文件系统的高级元数据的容器。超块是存在于磁盘上(实际上位于磁盘的多个位置上,以提供冗余)的结构。它是处理磁盘上的文件系统的基础,因为它定义文件系统的管理

29、参数(例如,块的总数、空闲块和根索引节点)。在磁盘上,超块向内核提供关于磁盘上的文件系统的结构的信息。在内存中,超块为管理活动的(已挂载)文件系统提供必要的信息和状态。因为 Linux 支持同时挂载多个并发文件系统,所以在一个列表中维护每个super_block结构(super_blocks在 ./linux/fs/super.c 中定义,结构在 /linux/include/fs/fs.h 中定义)。图 3 提供了超块及其元素的简化视图。super_block结构是指封装了其他信息的许多其他结构。例如,file_system_type结构维护文件系统的名称(比如ext3)以及各种锁和函数,以

30、获取和删除super_block。file_system_type对象由常见的register_file system和unregister_file system函数管理(见 ./linux/fs/file systems.c)。super_operations结构为读写节点和高级操作(比如重新挂载)定义大量函数。根目录条目(dentry)对象也缓存在这里,因为它是文件系统所在的块设备。最后,提供许多用于管理节点的列表,包括s_inodes(列出所有节点的列表)、s_dirty(列出所有脏节点的列表)、s_io和s_more_io以及s_files(列出特定文件系统的所有打开文件的列表)。图

31、 3. super_block 结构及其元素的简化视图注意,在内核内部,另一个称为vfsmount的管理对象提供关于已挂载的文件系统的信息。这些对象的列表引用超块,并定义挂载点、文件系统所在的 /dev 设备的名称以及其他高级附加信息。索引节点(inode)Linux 通过一个称为inode(index node的缩写)的对象管理文件系统中的所有对象。一个 inode 可以引用一个文件、目录或另一个对象的符号链接。注意,因为文件用于表示其他类型的对象(比如设备或内存),所以也使用 inode 来表示它们。我在这里所指的 inode 是 VFS 层 inode(常驻 inode)。每个文件系统也包含一个位于磁盘上的 inode,并且提供关于特定文件系统的特定对象的细节。VFS inode 使用 slab 分配器进行分配(来自inode_cache;参考资料部分提供一个介绍 slab 分配器的链接)。inode 由描述 inode、inode 内容和可能在 i

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1