zoukankan      html  css  js  c++  java
  • Linux Ext2文件系统

      Linux最传统的磁盘文件系统使用的是EXT2。所以要了解文件系统就得要由认识Ext2开始。文件系统是创建在磁盘上面的,因此我先来了解一下磁盘的物理组成。

    磁盘组成与分区

      整块磁盘的组成主要有:

        圆形的盘片(记录数据)

        机械手臂与机械手臂上的磁头(可读写盘片上的数据)

        主轴马达,可以转动盘片,让机械手臂的刺头在盘片上读写数据

      数据存储于读写的重点在于盘片,盘片上的物理组成为

        扇区(Sector)为最小的物理存储单元,每个扇区为512bytes

        将扇区组成一个圆,那就是柱面(Cylinder),柱面是分区(partition)的最小单位

        第一个扇区最重要,里面有硬盘主引导记录(Masterbootrecord, MBR)及分区表(partition table),其中MBR有446bytes,而partition table占有64bytes。

                    

      各种磁盘在Linux中文件名

        /dev/sd[a-p][1-15]:为SCSI,SATA,USB,Flash等接口的磁盘文件名

        /dev/hd[a-d][1-63]:为IDE接口的磁盘文件名

      磁盘分区:

        所谓的磁盘分区指的是告诉操作系统“我在这块磁盘在此分区可以访问的区域是A柱面到B柱面之间的块”,如此一来操作系统就能够知道它可以在所

      指定的块内进行文件数据的读/写/查找等操作了。也就是说,磁盘分区即指定分区的起始与结束柱面就可以了。

        那么指定分区的柱面范围是记录在哪里?就是第一个扇区的分区表中。但是因为分区表仅有64byte而已,因此最多只能记录四条分区记录,这四条记录

      我们成为主(primary)分区或扩展(extended)分区,其中扩展分区还可以再分出逻辑分区(logical),而能被格式化的则仅有主分区与逻辑分区而已。

        - 主分区与扩展分区最多可以有4个(磁盘的限制)

        - 扩展分区最多只能有一个(操作系统的限制)

        - 逻辑分区是由扩展分区持续分出来的分区

        - 能够被格式化后作为数据访问的分区为主要分区与逻辑分区,扩展分区无法被格式化

        - 逻辑分区的数量依操作系统而不同,在Linux系统中,IDE硬盘最多有59个逻辑分区(5号到63号),SATA硬盘则有11个逻辑分区(5号到15号)

    文件系统特性

      磁盘分区完毕后还需要进行格式化(format),之后操作系统才能够使用这个分区。为什么要进行“格式化”?这是因为每种操作系统所设置的文件属性/权限不同

    为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够利用的文件系统格式。

      每种操作系统能够使用的文件系统不相同,传统的磁盘与文件系统应用中,一个分区就是只能被格式化为一个文件系统所以我们可以说一个文件系统就是一个分区。

    但是由于新技术的利用(LVM),目前我们在格式化时已经不再说成针对分区来格式化了,通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区。

       文件系统是如何运行的呢?这个与操作系统的文件数据有关。较新的操作系统的文件数据除了文件实际内容之外,通常含有非常多的属性(权限,所有者)。文件

    系统通常会将这两部分的数据分别放在不同的块,权限与属性放置到inode中,至于实际数据则放置到data block快中。另外,还有一个超级快(superblock)会记录整个

    文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。

      每个inode与block都有编号,至于这三个数据的意义如下:

      - super block :记录此文件系统的信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关文档

      - inode : 记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码

      - block:实际记录文件的内容,若文件太大时,会占用多个block

    由于每个inode与block都有编号,而每个文件都会占用一个inode,inode内则有文件数据放置的block号码。如果能够找到文件的inode的话,那么自然就会知道这个文件放置的block号码,读取

    实际数据,读写的效率比较好。

      inode和block快以图解的方式说明一下,如图:

      

      文件系统先格式化出inode与block的块,假设一个文件的属性与权限数据放置到inode4,此时我们的操作系统就能够据此来排列磁盘的阅读顺序。

    这种数据访问的方法我们称为索引文件系统。

      另一个管用的系统是我们U盘(闪存)使用的文件系统,一般为FAT格式。FAT这种格式的文件系统没有inode存在,所以FAT没有办法将一个文件的

    所有block在一开始就读出来。每个block号码都记录在当前一个block当中,它的读取方式如图:

      

    假设文件的数据依序写入1->7->4->15号这四个block,文件系统就没有办法一口气知道四个block的号码,他得一个一个的读block.如果同一个文件的数据写入

    的block分散的太厉害,我们的磁盘磁头无法在磁盘转一圈就读到所有的数据,因此磁盘就会多转好几圈才能完整地读到这个文件的内容。

      基本上,索引式文件系统,不太需要进行碎片的整理。如果文件使用太久,经常删除/编辑/新增文件时,还是会造成文件数据太过离散的问题。需要整理。

    Linux的Ext2文件系统(inode)

      文件系统一开始就将inode与block规划好了,除非重新格式化,否则inode与block固定后就不再变动。Ext2文件系统在格式化的时候基本上是区分为多个快组的

    每个快组有独立的inode/block/superblock系统。

    在整体规划中,文件系统最前面有个一启动扇区(boot sector),这个启动扇区可以安装引导装载程序,通过它我们就能够将不同的引导装载程序安装到个别的

    文件系统最前端,而不用覆盖整块硬盘唯一的MBR,这样也才能够制作出多重引导的环境。如图

      

      data block(数据块)

        放置文件内容的地方,在Ext2文件系统中系统支持的block大小有1KB,2KB及4KB三种。在格式化时block的大小就固定了,每个block都有编号,以方便

      inode的记录。不过要注意的是,由于block大小的区别,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。

        原则上,block的大小与数量在格式化完成就不能够再改变(除非重新格式化)

        每个block内最多只能放置一个文件的数据

        如果文件大于一个block的大小,则一个文件会占用多个block数量

        若文件小于block,则该block剩余空间就不能再被使用了。

      inodetable(inode表格)

        inode的内容主要记录文件的属性及该文件实际数据放置在哪几个block内。基本上记录的文件至少有一下这些:

          该文件的访问模式(read/write/execute)

          该文件的所有者与组

          文件大小

          改建创建或者状态改变时间,内容改变的时间

          定义文件特性的标志如SetUID等

          该文件真正内容的指向

        inode有哪些特色呢:

          每个inode128bytes

          每个文件占用一个inode

          文件系统能够创建的文件数量与inode的数量有关

          系统读取文件时,先找inode,分析inode所记录的权限,根据权限开始实际读取block内容

        因为inode大小有限(128bytes),为记录更多信息,系统将inode记录block号码区域定义为多层结构,如图:

        

      Superblock(超级块)

        Superblock是记录整个文件系统相关信息的地方,没有它就没有这个文件系统了。它记录的信息主要有:

          block与inode的总量

          未使用与已使用的inode/block数量

          block与inode的大小

          文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等文件系统相关时间

          一个validbit,若此文件系统已经被挂载,则为valid bit为0,否则为1

        如果superblock死掉了,你的文件系统可能要花很多时间去挽救,superblock一般大小为1024bytes。

        此外,每个block group都含有superblock。但是我们也说一个文件系统应该仅有一个superblock而已,这是怎么回事?事实上,除了第一个block group

      内含有superblock之外,后续的block group不一定含有superblock,而若含有superblock则该superblock主要是作为第一个block group内superblock的备份了,

      这样可以进行superblock的救援。

      File system Description(文件系统描述说明)

         这个区段可以描述每个block group的开始于结束的block号码,以及说明每个区段分别介于哪一个block号码之间。

      block bitmap(块对照表)

        记录系统中哪些block是未使用的

      inode bitmap(inode对照表)

        记录未使用的inode号码

      每个区段与superblock的信息都可以使用dumpe2fs命令来查询:

      

      

     目录

      ext2会分配一个inode与至少一块block给目录。inode记录该目录的相关权限与属性,并可记录分配到的那块block号码,而block则是记录在这个目录下的

    文件名与该文件名占用的inode 号码数据。

      想查看目录内的文件占用的inode号码,可以用ls-i参数来处理:

      

      由上面的结果我们知道目录并不只占一个block而已,在目录下面的文件数如果太多而导致一个block无法容纳下所有文件与inode对照表时,系统

    会给与该目录多于一个block来继续记录相关的数据。

    文件

      ext2会分配一个inode与相对该文件大小的block数量给该文件。注意inode仅有12个直接指向,因此还要多分配inode来作为块号码的记录。

    目录树读取

      因为文件名是记录在目录的block当中,以你当我们要读取这个文件时,就务必会经过目录的inode与block,然后才能找到那个待读取文件的inode号码,

    最终才会读到正确的文件的block内的数据。由于目录树是又根目录开始读起,因此系统通过挂载的信息可以找到挂载点的inode号码(通常一个文件系统的最顶层

    inode号码会由2号开始),此时就能够得到根目录的inode内容,并依据该inode读取根目录block内的文件名数据,再一层一层地往下读到正确的文件名。

    日志文件系统功能

       如果我们想要新增一个文件,此时文件系统的行为是:

        1. 先确定用户对于预添加文件的目录是否具有w与x的权限,若有的话才能添加

        2 根据inode bitmap找到没有使用的inode号码,并将新文件的权限、属性写入

        3. 根据block bitmap找到没有使用中的block号码,并将实际的数据写入block中,且更新inode的block指向数据。

        4. 将刚才写入的inode与block数据同步更新inode bitmap与block bitmap,并更新superblock的内容。

      一般来说,inode table与data block称为数据存放区域,至于其他例如super block、block bitmap与inode bitmap等区域就被称为metadata(中间数据)因为

    super block、inode bitmap及block bitmap的数据是经常变动的,每次添加、删除、编辑时都可能会影响到这个三个部分的数据,一次才会被称为中间数据。

      数据不一致状态,在早期的Ext2文件系统中,如果发现这个问题,那么系统在重新启动时候,就会通过Super block当中记录的valid bit与文件系统的state等状态来判断

    是否强制进行数据一致性的检查。若有需要检查时则以e2fsck这个程序来进行。但这个检查真的是很费时的,因为要针对meta data 区域与实际数据存放区来进行对比

    得要搜寻整个文件系统。

      日志文件系统,为了避免上述不一致情况发生,我们的前辈想到一个方式,如果在我们的文件系统当中规划出一个块,专门记录写入或者修订文件时的步骤:

        1. 预备:当系统要写入一个文件时,会现在日志块中记录某个文件准备写入的信息

        2. 实际写入:开会写入文件的权限与数据;开始更新meta data的数据

        3.结束:完成数据与meta data的更新后,在日志记录块当中完成该文件的记录

      在这样的程序当中,万一数据的记录过程发生了问题,那么我们的系统只要去检查日志记录块就可以知道哪个文件发生了问题,针对该问题来做一致性的检查即可,不必

      针对整块文件系统去检查,这样就可以达到快速修复文件系统的能力。这是日志式文件最基础的功能。

    Linux文件系统的操作

      所有的数据都得要加载到内存后CPU才能够对该数据进行处理。在编辑文件过程中会频繁地写入磁盘中,但磁盘写入的速度要比内存慢很多很没有效率。Linux

    使用异步处理的方式解决这个问题: 当系统加载一个文件到内存后,如果该文件没有被改动过,则在内存区段的文件数据会被设置为(clean)的。但如果内存中的

    文件数据被更改过了,此时该内存中的数据被设置为Dirty。此时所有的操作都在内存中执行,并没有写入到磁盘中。系统会不定时地将内存中设置为Dirty的数据协会

    磁盘,以保持磁盘与内存数据的一致性。

        系统会将常用的文件数据放置到主存储器的缓冲区,以加速文件系统的读写

        可以手动使用sync来强迫内存中设置为Dirty的文件写回到磁盘中

        若正常关机时,关机命令会主动调用sync来将内存的数据写入到磁盘

        若不正常关机,由于数据尚未写到磁盘,重启后可能会花很多时间进行磁盘检验,甚至可能导致文件系统损毁。

    挂载点的意义

      每个文件系统都有独立的inode,block,super block等信息,这个文件系统要能够链接到目录树才能被我们使用。将文件系统与目录树结合的操作我们成为挂载。

    重点是:挂载点一定是模流,该目录为进入该文件系统的入口。因此并不是你有任何文件系统都能使用,必须要“挂载”到目录树的某个目录后,才能够使用该文件系统的。

      

      由于文件系统顶层的目录inode一般为2号,因此/,/boot/,/home为三个不同的文件系统,因为每一行的文件属性不同,且三个目录的挂载点也不同。

      

      上面信息中挂载点均为/,因此三个文件都在同一个文件系统内,而中三个文件的inode号码均为2,因此这三个文件名都指向同一个inode号码,当然这

      三个文件的内容也就完全一样。

    Linux VFS

      Linux内核是如何管理文件系统呢?整个Linux文件系统都是通过一个名为Virtual Filesystem Switch(虚拟文件系统VFS)的内核功能区读取文件系统的。

    也就是说,整个Linux认识的文件系统其实就是VFS在进行管理,我们用户并不需要知道每个分区上头的文件系统是什么,VFS会主动帮我们做好读取工作。

      

  • 相关阅读:
    Node.js安装及环境配置之Windows篇
    [转]英语论文写作技巧-1
    [转]windows下安装python MySQLdb及问题解决
    SourceTree使用SSH克隆码云项目
    [吴恩达机器学习笔记]16推荐系统5-6协同过滤算法/低秩矩阵分解/均值归一化
    [吴恩达机器学习笔记]16推荐系统3-4协同过滤算法
    [吴恩达机器学习笔记]16推荐系统1-2基于内容的推荐系统
    [吴恩达机器学习笔记]15非监督学习异常检测7-8使用多元高斯分布进行异常检测
    如何求协方差矩阵[转载]
    [吴恩达机器学习笔记]15非监督学习异常检测4-6构建与评价异常检测系统
  • 原文地址:https://www.cnblogs.com/jixp/p/10840652.html
Copyright © 2011-2022 走看看