Linux磁盘、Ext文件系统、目录树

硬盘组成与读写


 

硬盘,拆过机的同志应该知道就是一块小刚体嘛。拆过主机硬盘和笔记本硬盘也应该知道不一样的硬盘的接口是不同的,主机的硬盘通常会有一条线链接到主板而笔记本的硬盘直接有插槽。这个概念只是为了引发硬盘有不一样的种类存在,当咱们在linux系统中输出命令fdisk -l的时候,大体会有设备名称等信息。其中有可能有/dev/sd[a-p][1-15]或者/dev/hd[a-d][1-63]等等,前者表示SCSI,SATA,USB等接口的磁盘文件名,后者表示IDE接口磁盘文件名(这个比较老了)。html

磁盘会有多个概念,为了方便理解,先设定一个场景,假定咱们在吃鸡游戏的地图上,这个地图只有一个圆柱大楼,每层楼都是一个环形操场跑道。node

  • track磁道,就是操场上的某一条跑道。
  • cylinder柱面,就是缩毒的时候毒边界所在的跑道,这指的是每层楼的处在毒边界的跑道。
  • Sector扇区,就是若是把跑道划成不一样小格的话,这么说吧,就是把环形甜甜圈切成好多小块,每一个小块近似于小矩形,这个矩形就是扇区。
  • Head磁头,如上图就是每层楼都有一只手臂读取某一跑道上的数据。

这是个人电脑的磁盘分布,一个扇区是512bytes,一次io读取是8个扇区能读到4KB。总的容量很明显是由255盘面*n柱面*m扇区(512bytes)构成的。linux

磁盘是如何读取数据的呢,咱们知道买磁盘是有转速指标的,因此咱们能够设想磁头不动当靠旋转就能够得到某柱面的全部磁道的数据。其实磁盘IO步骤就是如此。git

  1. 寻道时间,磁头径向移动到达指定的磁盘位置
  2. 旋转延迟,等到指定的扇区到达磁头下
  3. 存取时间,读取目标扇区的数据

时间花费,1w转的磁盘旋转一圈是不到6ms,存取也就是零点几毫秒否则磁盘都转过去了是否是还要等一圈再来读取。。因此咱们能够猜到寻道时间是最长的大概是3-15ms。github

所以进行磁盘分区的时候,咱们划分标准是以柱面做为分区partition的最小单位。否则按照盘面来分区,那寻道时间的比重会增长天然增长了IO时间。能够看到上图,按照扇区连续性进行了分区。数据库

咱们应该清楚,如今只是分区完成,每个区能够有本身独立的文件系统进行管理它所分配到的区域。有不一样的文件系统体制,咱们假定分配到的区域每一扇区给个序号从1到100。对于FAT格式,一个文件表示形式是链表的样式,多是8->6->7->67->5等等,对于ext2格式,它将1-4做为一个inode的节点表明了一个文件,存储了这个文件的实际数据存储的block序号(5,6,7,8,67),咱们成为索引式文件系统。缓存

以上说的概念能够这么理解,地球就是一块硬盘,每个国家就是一个分区,每个国家本身的文件系统格式能够是资本主义也能够是社会主义。spa

 

Ext2文件系统(inode)


 

虽然咱们标题说的是Ext2文件系统,可是图片放的是Ext4文件系统,区别只是GDT而已,为了跟进时代加进来无妨。操作系统

先谈谈该图的整体概念,Entire disk=MBR+Partition table+Partitions.  Partition=boot sector+block group.  block group=super lock+Group Descriptors+Reserved GDT Blocks+Data Block Bitmap+inode Bitmap+inode Table+Data Blocks.设计

其实这里设计到了启动操做系统的过程,这个之后再详细描述。大概思路是当咱们通过了通电自检等进入BIOS到指定到磁盘启动,第一扇区是MBR和Partition table,分区表只有64B,咱们知道磁盘分区最低单位是柱面,柱面范围是0-255,八个bit就能够表示,因此16B表示一个分区范围。一个磁盘理论上只能四个分区,因此为了拓展容许有3个主分区和一个扩展分区,这个扩展分区能够拥有多个逻辑分区。那么咱们分好的每个分区就是一个文件系统了。每个分区都预留的boot sector是载入操做系统内核的引导代码,它的副本将放在MBR中,固然说双系统你可能更容易理解,每一个分区能够指定一个系统,可是只有一个boot loader能放在MBR中,其中linux的boot loader能够释放权限加载别的文件系统的boot sector从而加载双系统了。

并且实际并非每个Block Group都是如此排布,太多super block说实话浪费空间,冗余的超级块和组描述符的副本只保留在组号为 0 或组号为 3,5,7 的倍数的块组中。同时还会有纯粹的数据存储块,只有后四者。

  • 图中Group 0 padding 只存在于Block Group 0 中,实际上它就是boot sector
  • Super Block,记录整个文件系统相关的信息,是整个文件系统的首脑。记录了inode、block等信息包括修改挂载时间等。因此它有备份Block。
  • Group Descrptor,文件系统描述符,具体记录inode的位置范围,block的位置范围等

  • Reserved GDT Blocks。用于文件系统将来的拓展 
  • Data Block Bitmap。用于记录块组内部数据块的使用状况。
  • inode Bitmap。用于记录 inode table 中的 inode 的使用状况。
  • inode table。每个文件的meta信息就是一个inode,这个table表示该块内能指示的全部文件表。
  • Data Block。文件的meta信息指向的实际存储内容数据段。

超级块信息

Group Block,注意信息有所不一样

G0是起始的primary superblock,G1是存有super block,G2是纯粹数据存储。

 

inodeTable

  • 每个文件仅占有一个inode而已。文件系统可以建立的文件数量和inode的数量有关系。
  • 一个inode文件信息中,包括了访问的模式权限,全部者和组,大小,create time,access time,last modification time,deletion time,pointer,flag等。其中时间属性在原来ext3以前是32bytes,后来进行扩展到64bytes,使得有效时间从2038延长到了2466年。
  • 就算是ext4中inode节点达到了256B(之前是128B),彷佛也没法记录该文件中那么多block节点,因此前12个是直接block索引,而后还有间接、双间接、三间接索引,原理就是以block存储block。因此看图大概能明白。

Block data

这是block块的一种线性目录结构,它表述了存储的特殊数据表示格式,例如是目录文件的block,它将目录下的文件名及其对应的inode号记录在目录的block中。

 

目录树


 

咱们知道目录也是一个文件,一个文件的文件名由目录文件存储,文件系统新建一个目录时会分配一个inode与至少一个block给该目录,inode记录目录的相关权限和属性,分配到的block记录目录下的文件名和该文件名占用的inode号码信息。因此indoe自己不记录文件名,文件名记录在目录的block中,所以新增/删除/重命名文件名与目录的w权限有关。那么由于文件名记录在目录的block中,所以当咱们要读某一个文件,必须通过目录的inode与block而后才能找到哪一个待读取的文件的inode才能读到block数据。

目录树是由根目录读起,系统经过挂载点的挂载信息就能够找到挂载点的inode号码,一般一个文件系统的最顶层indoe号码是2(1是指向不占空间的proc目录),而后经过根目录一层层往下读。

如图咱们访问/etc/passwd须要经过/+rx权限(r是读,x是进入该目录)而后一步步找到下一个inode节点。

 

 

其余


 

  • Ext3文件系统加入了日志文件系统,有点像数据库的日志模式,当系统要写入文件数据以前先记录,而后实际写入,跟新中间数据(super block等),结束后再日志中写上完成。
  • 文件系统的操做通常会有缓存,是为了不频发的IO,能够经过sync强迫内存中设置为Dirty的文件回写到磁盘。
  • 挂载点,一个文件系统和目录树结合的操做成为挂载,挂载点必定是目录,该目录为进行该文件系统的入口。以下图,不一样的目录对应inode都为初始的2,是不一样的文件系统。

  • VFS

 

 

参考

磁盘、分区及Linux文件系统 [Disk, Partition, Linux File System]

Ext4 文件系统简要总结

相关文章
相关标签/搜索