zoukankan      html  css  js  c++  java
  • Linux磁盘及文件系统(三)Linux文件系统

    一、文件系统的组成

      Linux常见的文件系统类型有ReiserFS,ext2,ext3,ext4,vfat,XFS等,文件系统是对一个存储设备上数据和元数据进行组织的机制。他的最终目的是把大量数据有组织的放入持久性的存储设备中,比如硬盘和磁盘。文件系统就是文件在逻辑上组织形式,他以一种更加清晰的方式来存放各个文件。数据被存放到某个分区中。一个典型的Linux分区包含有以下各个部分:

      

      boot block:任何分区的第一个块,存放系统的引导程序。

      super block(超级块):保存整个分区的全局信息:1.有多少个块组 2.每个块组包含多少个块 3.块大小 4.空闲磁盘块,已用磁盘块 5.空闲inode,已用inode.

      元数据:存放的是inode

      inode:每个文件的标识,inode包含inode号,权限,属主属组,时间戳,文件大小等。inodes 是实现文件存储的关键。在 Linux 中,文件系统中管理的每个对象(文件或目录)表示为一个 inode。inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。在 Linux 系统中,一个文件可以分成几个数据块存储在分区内。为了搜集各数据块,我们需要该文件对应的inode。每个文件对应一个 inode。这个 inode 中包含多个指针,指向属于该文件各个数据块。当操作系统需要读取文件时,只需要找到对应 inode,收集分散的数据块,就可以收获我们的文件了。注意:元数据和inode并不是一一对应的,当磁盘存放的是大文件,inode可以按照比例设定,较少。要是磁盘存放的是零碎的小文件,inode的个数必须要足够

      数据区:将文件划分为block,称为磁盘块。(逻辑块,大小为2的n次方字节,一般来讲只能是1024,2048,4096).存放的是通常是两类文件,分别为普通文件和目录文件,一个磁盘可以属于多个文件(硬链接),一个文件可以有不同的路径(软链接)。文件的内容不同不能存放在同一块磁盘上。

      内存中的空间划分为页块,叶匡大小通常为4K(对不同的CPU是不同的)注意:磁盘占有空间和文件实际大小

      

      ext2与ext3的不同:ext3是日志文件系统。日志是磁盘分区第三个独立区域(数据区,元数据区)。把inode创建在日志区,而不是元数据区。创建好inode后存数据,如果数据存储到一半断电了,只需要检查日志区。因为那些没来得及保存的数据包括正在修改的文件,把他的inode挪到了日志区,所以只要检查日志区,修复这些inode即可。如果没有断电,只需要将这些数据放回元数据区即可。坏处就是需要多一次IO操作。ext2用于对文件完整性要求不高的文件。

    二、inode读取文件

      inode读取文件的过程如下:   

        1.根目录文件的 inode:2,用于找到 var 的 inode id

        2.var 目录文件的 inode:10747905,用于找到 test.txt 的 inode id

        3.text.txt 文件的 inode: 10749034,用于找到 data blocks

      

      因此,当我们读取一个文件时,实际上是在目录中找到了这个文件的inode编号,然后根据inode的指针,把数据块组合起来,放入内存供进一步的处理。当我们创建一个文件时,是分配一个空白 inode 给该文件,将其 inode 编号记入该文件所属的目录,然后选取空白的数据块,让 inode 的指针指向这些数据块,并放入内存中的数据。

    三、文件系统的结构

      

        用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。

        VFS 是底层文件系统的主要接口,它是 Linux 内核中的一个软件抽象层。。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode 和 dentry)。它们缓存最近使用过的文件系统对象。因为有 VFS 存在,Linux 允许众多不同的文件系统共存,并支持跨文件系统的文件操作。它通过一些数据结构及其方法向实际的文件系统如 ext2,vfat 提供接口机制。

        每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。可以使用 sync 命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)

        

    四、VFS(虚拟文件系统)

      Linux中允许多种不同的文件系统共存,如ext2,ext3等。通过使用同一套文件IO系统调用即可对Linux中的任意文件进行操作而无需考虑具体所在的具体文件系统格式,即对文件的操作可以跨文件系统而执行。如图所示,我们可以使用 cp 命令从 vfat 文件系统格式的硬盘拷贝数据到 ext3 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件系统。

      

      过程:VFS调用 vfat 的读文件方法将 a.txt 的数据读入内存;再将 a.txt 在内存中的数据映射到b.txt对应的内存空间后,VFS调用ext3的写文件方法将b.txt写入磁盘;从而实现了最终的跨文件系统的复制操作。VFS看起来就像一个中间媒介一样,屏蔽了不同文件系统之间的差异,从而可以实现跨文件系统执行命令。

      

      

  • 相关阅读:
    第二次结对编程总结
    结对编程作业博客
    现状、经验和计划
    个人总结
    6月中旬开发心得
    读《软件开发沉思录》
    团队进度汇报
    个人课程总结
    Beta阶段总结
    冲刺第十天 1.11 FRI
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/7003899.html
Copyright © 2011-2022 走看看