linux文件系统相关资料

         linux下文件系统通常是通过虚拟文件系统(VFS)蔽下层具体文件系统操作的差异,为上层的操作提供一个统一的接口。文件系统底层都是用系统IO缓存层提供的块读写接口,实现逻辑块到物理块的映射。作为应用程序底层的存储逻辑,通用文件系统的目的是提供目录/文件形式的逻辑到物理磁盘的映射。  文件系统本质上是磁盘块的逻辑组织方式。
       ext2文件系统使用组描述符,块位图,索引节点位图,索引节点表,数据区等组织磁盘空间,每个索引节点代表一个文件,存有该文件占用的磁盘块的位置。在Ext2中,目录是一种特殊的文件,它是由ext2_dir_entry这个结构组成的列表。目录中保存有该目录下所有目录及文件的名称及索引节点号。
 
        VFS提供一个统一的接口(实际上就是file_operatoin数据结构,稍后介绍),一个具体文件系统要想被Linux支持,就必须按照这个接口编写自己的操作函数,而将自己的细节对内核其它子系统隐藏起来。因而,对内核其它子系统以及运行在操作系统之上的用户程序而言,所有的文件系统都是一样的。实际上,要支持一个新的文件系统,主要任务就是编写这些接口函数。
概括说来,VFS主要有以下几个作用:
(1)对具体文件系统的数据结构进行抽象,以一种统一的数据结构进行管理。
(2)接受用户层的系统调用 ,例如write、open、stat、link等等。
(3)支持多种具体文件系统之间相互访问。
(4)接受内核其他子系统的操作请求,特别是内存管理子系统。
通过VFS,Linux可以支持很多种具体文件系统。

       为了能够支持各种实际文件系统,VFS 定义了所有文件系统都支持的基本的、概念上的接口和数据 结构;同时实际文件系统也提供 VFS 所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式 上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准 的接口,才能与 VFS 协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有文件系统都是相同的。

        VFS 记录当前支持的文件系统以及当前挂装的文件系统。
       可以使用一组注册函数在 Linux 中动态地添加或删除文件系统。内核保存当前支持的文件系统的列表,可以通过 /proc 文件系统在用户空间中查看这个列表。这个虚拟文件还显示当前与这些文件系统相关联的设备。在 Linux 中添加新文件系统的方法是调用 register_filesystem。这个函数的参数定义一个文件系统结构(file_system_type)的引用,这个结构定义文件系统的名称、一组属性和两个超级块函数。也可以注销文件系统。
在注册新的文件系统时,会把这个文件系统和它的相关信息添加到 file_systems 列表中(见linux/include/linux/mount.h)。这个列表定义可以支持的文件系统。在命令行上输入 cat /proc/filesystems,就可以查看这个列表。

           
 

      对于存储设备上的数据,操作系统向应用程序提供的逻辑概念就是"文件"。应用程序要存储或访问数据时,只需读或者写"文件"的一维地址空间即可,而这个地址空间与存储设备上存储块之间的对应关系则由操作系统维护。

      Linux 文件系统接口实现为分层的体系结构,从而将用户接口层、文件系统实现和操作存储设备的驱动程序分隔开。

      VFS 是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode 和 dentry)。它们缓存最近使用过的文件系统对象。
每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。

       在 VFS 中动态管理的两个主要对象是 dentry 和 inode 对象。缓存这两个对象,以改善访问底层文件系统的性能。当打开一个文件时,dentry 缓存将被表示目录级别(目录级别表示路径)的条目填充。此外,还为该对象创建一个表示文件的 inode。使用散列表创建 dentry 缓存,并且根据对象名分配缓存。

       缓冲区缓存会缓存文件系统和相关块设备之间的请求。文件系统层的底部是缓冲区缓存。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。
--------------------------------------------------------------------------------------------------------------------


        Linux 以一组通用对象的角度看待所有文件系统。这些对象是超级块(superblock)、inode、dentry 和文件。超级块在每个文件系统的根上,超级块描述和维护文件系统的状态。文件系统中管理的每个对象(文件或目录)在 Linux 中表示为一个 inode。inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。

       超级块结构表示一个文件系统。它包含管理文件系统所需的信息,包括文件系统名称(比如 ext2)、文件系统的大小和状态、块设备的引用和元数据信息(比如空闲列表等等)。超级块通常存储在存储媒体上,但是如果超级块不存在,也可以实时创建它。可以在 ./linux/include/linux/fs.h 中找到超级块结构.
       超级块中的一个重要元素是超级块操作的定义。这个结构定义一组用来管理这个文件系统中的 inode 的函数。例如,可以用 alloc_inode 分配 inode,用 destroy_inode 删除 inode。可以用 read_inode 和 write_inode 读写 inode,用 sync_fs 执行文件系统同步。可以在 ./linux/include/linux/fs.h 中找到 super_operations 结构。每个文件系统提供自己的 inode 方法,这些方法实现操作并向 VFS 层提供通用的抽象。

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 结构。

缓冲区缓存
       除了各个文件系统实现(可以在 ./linux/fs 中找到)之外,文件系统层的底部是缓冲区缓存。这个组件跟踪来自文件系统实现和物理设备(通过设备驱动程序)的读写请求。为了提高效率,Linux 对请求进行缓存,避免将所有请求发送到物理设备。缓存中缓存最近使用的缓冲区(页面),这些缓冲区可以快速提供给各个文件系统。

       每个块都需要自己的缓冲区,它是内核用来存放块内容的RAM内存区。当设备驱动程序从磁盘读出一个块时,就用从硬件设备中所获得的值来填充相应的缓冲区;同样,当设备驱动程序向磁盘中写入一个块时,就用相关缓冲区的实际值来更新硬件设备上相应的一组相邻字节。缓冲区的大小一定要与块的大小相匹配。

        从本质上讲,文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制信息。为了描述 这个结构,Linux引入了一些基本概念:
        文件 一组在逻辑上具有完整意义的信息项的系列。在Linux中,除了普通文件,其他诸如目录、设备、套接字等 也以文件被对待。总之,“一切皆文件”。

        总体上说 Linux 下的文件系统主要可分为三大块:一是上层的文件系统的系统调用,二是虚拟文件系统 VFS(Virtual Filesystem Switch),三是挂载到 VFS 中的各实际文件系统,例如 ext2,jffs 等。具体文件系统管理的是一个逻辑空间,这个逻辑空间就象一个大的数组,数组的每个元素就是文件系统操作的基本单位——逻辑块,逻辑块是从0开始编号的,而且,逻辑块是连续的。与逻辑块相对的是物理块,物理块是数据在磁盘上的存取单位,也就是每进行一次I/O操作,最小传输的数据大小。

 

------------------------------------------------------------------------------------------

包含在 / 中的每个目录都用于某个特殊的目的:
/bin 仅仅是包含应用程序和实用工具的许多目录中的一个。然而,/bin 通常包含那些对于系统操作而言基本的实用工具。因此,Shell 文件操作命令如 cp 和 chmod、压缩和解压缩,以及诊断命令都位于 /bin 中。


/sbin 同样包含那些对于系统操作和维护而言至关重要的实用工具。然而,只有超级用户才能够执行 /sbin 中的程序,因此这个目录称为“superuser-bin”或者 /sbin。


/dev 包含您的系统中所安装的所有硬件,包括终端和 USB 设备(以及从物理上连接到这台计算机的其他外围设备)、伪终端(用于与 X 终端窗口进行交互),以及硬盘驱动器,等等。


/etc(常常发音为“etsee”)专门用于系统配置。/etc 目录包含用于系统守护进程、启动脚本、系统参数和更多其他方面的配置文件。
/home 包含用户的 home 目录。例如,如果您的登录名是 joe,那么目录 /home/joe 就是您的个人文件存储库。


/lib 用于存储基本的系统库文件。在现代 UNIX 中,通常共享系统库,这意味着并不是每个二进制文件都链接和包括这些库(那样的话,至少将会浪费空间),但是当需要该库的时候,按需要加载它,并且同时可以由许多应用程序进行共享。因此,与 UNIX 一同安装的核心应用程序和实用工具的运行都需要使用 /lib 中的库,并且您至少需要拥有少量相应的库文件,以便从源代码创建新的可执行文件。其中所有的文件都是至关重要的,损坏或者删除(无论是有意的还是无意的)某个文件就可能使系统变得无法使用。


/mnt 是“mount”的缩写,是装入硬盘驱动器分区和其他设备的标准位置。如果您希望查看当前装入的并且可访问的所有设备,只需要运行 mount 命令。
/tmp 或者“temporary”,是系统范围的暂存存储区。您的 Web 服务器可能会将会话数据文件保存在这里,并且其他实用工具将使用 /tmp 中的空间对中间结果进行缓存。通常认为 /tmp 中的文件在使用后即被丢弃。实际上,您的系统管理员可能会在每天晚上删除其中比某个过期时间更早的所有文件。


/usr 用于存储大量文件。最终用户应用程序(从编辑器、游戏和接口,到系统特性)都位于其中,它是 man 页面和其他更多内容的存储库。有些文件很有价值,但并不是系统操作所必须的,那么您很可能会在 /usr 中找到它。


/var 是“variable”的简写,它是用于存储那些大小通常随时间而增大的文件的存储库。可以在 /var 中找到邮箱、日志文件、打印机队列和数据库。通常可以将 Web 站点保存在 /var 中,因为 Web 站点可能会在一段时间后异常地累积大量的数据。

原文地址:https://www.cnblogs.com/scw2901/p/4229030.html