硬件知识——文件系统

所谓的磁盘分区就是告诉操作系统,这个分区的可存取区域从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号
posted @ 2014-02-27 19:10  amghost  阅读(681)  评论(0编辑  收藏  举报