zoukankan      html  css  js  c++  java
  • 硬件知识——文件系统

    所谓的磁盘分区就是告诉操作系统,这个分区的可存取区域从A磁柱面到B磁柱面

    指定的分区磁柱面范围信息存放在第一个分区(MBR)的分区表(patition table)中
     
    linux中,IDE硬盘最多有59个逻辑分区(hd5~hd63),sata硬盘最多有11个逻辑分区(sd5~sd15)
     
    文件系统包括数据外还有很多信息,比如在linux中还有文件权限、文件属性
    文件系统通常把权限和属性放在inode块中,而把实际的数据放在data block中,还有一个superblock用来记录文件系统的整体信息,包括inode和data block的总量、使用量、剩余量等
     
    索引式文件系统(如ext2/ext3):
    inode和data block的每个小区都有编号,inode区记录了每个文件的权限信息,也有文件所在的block信息,所以inode可以作为索引
    如上图,操作根据文件的inode信息,排列读取顺序,然后一口气将4个block的内容读出
     
    非索引式文件系统(FAT)
    USB就是用的非索引式
    没有inode,每个block编号都记录在前一个block中
    如果文件分布的block分布得太离散(比如没有按一个方向在磁盘上顺序分布过去),磁头就没办法在磁盘转一圈就读到所有资料,有可能需要转好几圈才能读取到,所以FAT文件系统常常用久了就要进行磁盘重组,就是将属于同一个文件的blocks整合在一起,这样资料读取就比较容易
     
     
     
     
     
    data block
    ext2文件系统支持的block大小有1k、2k、4k三种
    • block的大小和数量在格式化时就确定了
    • 每一个block最多只能放一个文件的数据
    • 如果文件大于block的大小,则占用多个block
    • 如果文件小于block的大小,则该block剩余的容量就不能再被其他文件使用了
    block太大有可能会导致浪费,太小则会导致大文件占用更多block,inode要记录多个block,最后导致操作系统读取数据地性能下降
     
    inode  table
      该档案癿存取模式(read/write/excute);
      该档案癿拥有者与群组(owner/group);
      该档案癿容量;
      该档案建立或状忞改变癿时间(ctime);
      最近一次癿读取时间(atime);
      最近修改癿时间(mtime);
      定义档案特性的旗标(flag),如 SetUID...;
      该档案真正内容的指向 (pointer);
     
    每个inode大小均为固定的128bytes
    每个档案只会占用一个inode,因为文件系统能够建立的档案数和inode的数量有关
    系统读档案的时候先找到inode,分析inode所记录的权限是否符合,符合才能实际读取档案的内容
     
    由于inode中要记录的数据特别多(光是block号码的记录就有可能很多),所以应该是把inode定义为:
    12个直接、1个间接、1个二间接与1个三间接纪录区
    直接就是可以直接取得block号码,间接就是再拿一个block来当做block号码的纪录区。
    以较小的1k block说明:
    12个直接:12*1k = 12k
    间接:256*1k = 256k,每个block记录会花去4bytes,所以1k的block可以包含256个block记录
    二间接:256*256*1k = 256^2k
    三间接:同上,256^3k
    全部加起来,最后一个inode能够容纳的档案最大为16GB
    这个计算方法不适用于2k/4kblock,因为大于2K的block会受到ext2文件系统本身的限制。
     
     
    superblock
    Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem
    了。他记录的信息主要有:
      block 与 inode 的总量;
      未使用与已使用的 inode / block 数量;
      block 与 inode 癿大小 (block 为 1, 2, 4K,inode 为 128 bytes);
      filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统
    癿相关信息;
      一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为
    1 。
     
    一般来说,superblock的大小为1024bytes,可以用dumpe2fs命令来查看
    每一个block group都可能含有一个superblock的备份,用于进行superblock的救援
     
    Filesystem description
    用于描述每个block group的开始于结束的block号码,以及说明每个区段(superblock、bitmap、inodemap、data block)分别位于哪一个block号码之间,也可以通过dumpe2fs来查看
     
    block bitmap
    从block bitmap中可以知道哪些block是空的,因此我们的系统就可以很快速地找到可使用的空间来处理文件
     
    inode bitmap
    作用类似于block bitmap
     
     

    目录
    当在ext2文件系统建立一个目录时,ext2会分配一个inode和至少一个block给该目录,inode记录该目录的相关权限和属性,并可记录分配到的那块block号码,而block则记录在这个目录下的文件名和对应的inode号码。
    目录不会只占用一个block,如果在目录底下的文件太多而导致一个block不足以记录所有的表项时,linux会给该目录分配多一些block
    可以用ls -li 查看目录下每个文件的inode号码
    可以用ll 命令查看目录使用block大小(都是1024的倍数)
     
     
    文件
    在建立一个一般文件时,linux给文件分配一个inode和相对于文件大小的block数量
    例如:假设一个 block 为 4 Kbytes ,而要建立一个 100 KBytes 癿档案,那么 linux 将分配一个 inode 与 25 个 block 来储存该档案! 但同时请注意,由于 inode 仅有 12个直接挃向,因此还要多一个 block 来作为区块号码的记录
     
    目录树的读取
    由上可知,文件的inode本身并不记录文件名,文件名的记录是在目录的block中的,所以才会有“新增、删除、更名文件名与目录的w权限有关”。我们要读取某个文件时,必须先经过目录的inode和block,才能读取到那个待读文件的inode,最后才能读取到文件的内容。
     
    由于目录树是从根目录开始读起,因此系统通过挂载点可以找到挂载点的inode(通常一个文件系统的最顶层inode从2号开始),此时就能根据根目录的inode内容,并依据inode读取根目录的block内的文件名数据,再一层一层读正确的文件名。
     

    日志式文件系统
    为了避免文件系统不一致问题,我们在filesystem中规划出一个区块,专门记录写入或者修改文件时的步骤:预备、实际写入、结束。
    在这样的程序当中,万一数据的记录过程当中发生了问题,那么我们的系统只要去检查日志记录区块,
    就可以知道那个档案发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去
    检查, 这样就可以达到地速修复 filesystem 的能力了!这就是日志式档案最基础癿功能啰~
     
    异步处理:
    当系统加载一个文件到内存后,如果该文件没有被更动过,则在内存区段的数据会被设定为“干净的(clean)”,如果被改动过了,则被设定为“脏的(dirty)”,此时所有的动作还在内存执行,还没写回硬盘,系统会不定时地将内存中设定为dirty的数据写入硬盘。可以使用sync指令手动强迫写入硬盘
     

    挂载点的意义:
    每个filesystem都有独立inode、block、superblock等信息,这个文件系统需要能够连接到目录树才能被我们使用,将文件系统和目录树结合的动作称为“挂载”,挂载点一定是目录,该目录作为进入该文件系统的入口。并不是有任何文件系统都能使用,必须要挂载到目录树的某个目录后,才能使用该文件系统。
     
    比如有三个挂载点:/ , /boot , /home,
    调用ls -lid / /boot /home时,可以看到三个目录的inode都是2,因为filesystem最顶层的目录的inode一般都是2号
  • 相关阅读:
    C# 操作ACCESS数据库
    装饰模式(Decorator Pattern)
    桥接模式(Bridge Pattern)
    单件模式(Singleton Pattern)
    横竖不能重复的9个数,,,,,
    C#操作Access数据库的例子
    组合模式(Composite Pattern)
    建造者模式(Builder Pattern)
    工厂方法模式(Factory Method)
    外观模式(Façade Pattern)
  • 原文地址:https://www.cnblogs.com/amghost/p/3572220.html
Copyright © 2011-2022 走看看