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号
  • 相关阅读:
    Chrome开发者工具中Elements(元素)断点的用途
    最简单的SAP云平台开发教程
    Java实现 LeetCode 495 提莫攻击
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 492 构造矩形
  • 原文地址:https://www.cnblogs.com/amghost/p/3572220.html
Copyright © 2011-2022 走看看