标签:inode ext2 block bitmap vfs
文件系统是建立在硬盘上的,所以要了解文件系统首先要了解磁盘的基本组成:
1、硬盘的物理结构:
硬盘以存储容量大,价格低廉成为我们存储数据的主要介质,目前硬盘主要分为3.5寸桌面硬盘和2.5寸笔记本硬盘两种规格,在硬盘盒内主要由磁头、机械手臂、主轴马达和磁盘盘片组成:
数据主要是存储在盘片上的,一个硬盘有一块磁盘盘片或多块盘片;硬盘在读写时,盘片是由主轴马达带动高速旋转;当盘片旋转时,磁头若保持在同一个位置,则磁头会在盘面划出一个圆形轨迹,这个圆形轨迹称为磁道(Track),以盘片中心为圆心,由此可以划出多个磁道;硬盘上的信息便是沿着这样的轨道存放的;盘片上的轨道由外向内依次从0开始编号
每个磁道被划分成等分的弧段,这些弧段称为扇区(Sector),外圈磁道扇区的数量大于内圈磁道扇区的数量,每个扇区的大小为512Bytes,扇区是硬盘的最小存储单位
所有磁盘盘片上面的磁道组成磁柱(Cylinder),磁柱是分隔硬盘的最小单位
2、分区(Partition):硬盘的逻辑边界
当拿到一块硬盘时,是不能直接使用的,首先要做的就是分区、格式化;分区是为了创建文件系统;分区的类型有三种:主分区,扩展分区和逻辑分区
一块物理磁盘的第0磁道0扇区为MBR(Master Boot Record)即硬盘主引导记录;MBR不属于任何分区,也不能用操作系统提供的磁盘操作来读去它,但是可以通过命令来修改和重写
MBR前446Byte存放Bootloader信息,后64Bytes每16Bytes存放一个分区的起始柱面及结束柱面信息,最后两个字节为魔数(Magic Number)用来标示MBR是否有效
主分区也称为主磁盘分区,操作系统的引导信息必须存放在主分区中;主分区是在硬盘上直接创建的,主分区中不能再划分其他类型的分区;因此,每个主分区相当于一个逻辑磁盘;每块硬盘中最多只能有4个主分区
由于每块硬盘中只能创建4个主分区,为了解决这一问题可以创建一个扩展分区(Extended Partition),扩展分区最多只能有一个;扩展分区不能直接格式化使用,必须要在扩展分区中创建逻辑分区(Logic Partition),逻辑分区是硬盘上一块连续的区域,不同之处在于,每个主分区都有自己的独立引导块,而逻辑分区没有,逻辑分区可以有若干个
3、格式化(Format):格式化是对磁盘或磁盘分区进行初始化的一种操作
由于每种操作系统对文件的操作方式不尽相同,为了存储数据就需要对磁盘或分区进行格式化,以成为操作系统能够利用的文件系统(File System)格式;格式化分为两种:低级格式化和高级格式化;格式化操作会导致现有的磁盘或分区中的数据全部被清除
通常硬盘在出厂时厂商会对硬盘进行低级格式化,所谓低级格式化就是将空白硬盘划出磁道和柱面,再将磁道划分出扇区,每个扇区又划分出标示部分ID,间隔区GAP和数据区DATA等;低级格式化只能针对整块硬盘操作而不能对单一的分区进行
常说的格式化指的是高级格式化;所谓格式化就是对磁盘或分区创建文件系统
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。从系统的角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。文件系统本身只是一个软件
Linux中允许众多不同的文件系统共存,如ext2、ext3、vfat等。通过使用同一套I/O系统调用可对linux中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更近一步,对文件的操作可以跨文件系统执行
“一切皆文件”是Unix/linux的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、套接字等在Unix/linux中都是以文件被对待;他们虽然类型不同,但是对其提供的却是同一套操作界面
虚拟文件系统(VFS)正是实现linux特性的关键所在,VFS是linux内核中的软件层,用于给用户空间的程序提供文件系统接口;同时它也提供内核中一个抽象的功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖于VFS共存,而且也依靠VFS协同工作
为了能够支持各种实际文件系统,VFS定义了所有文件系统都支持的基本的、概念上的接口和数据结构;同时实际文件系统也提供VFS所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被linux支持,就必须提供一个符合VFS标准的接口,才能与VFS系统工作。实际文件系统在同一的接口和数据结构下隐藏了具体的实现细节,所以在VFS层和内核的其他部分看来,所有文件系统都是相同的。
都对于ext2文件系统来说,硬盘或分区首先被划分为许多个block,每个block大小是一样,block从0开始计数,,典型的大小是1024Bytes或4096Bytes,这个大小在创建文件系统时已经被决定,可以手动指定大小,但在创建完文件系统后无法更改;这些block聚集在一起被分成多个block group(块组),每个block group拥有的block数量是相等的
Block 是记录文件内容数据的区域,至于 inode(index node) 则是记录"该文件的相关属性,以及文件内容放置在哪一个 Block 之内"的信息,换句说, inode 除了记录文件的属性外,同时还必须要具有指向( pointer )的功能,亦即指向文件内容放置的区块之中,好让操作系统可以正确的去取得文件的内容,底下几个是 inode 记录的信息(当然不止这些):
该文件的拥有者与群组(owner/group)
该文件的存取模式(read/write/excute)
该文件的类型(type)
该文件建立或状态改变的时间(ctime)、最近一次的读取时间(atime)、最近修改的时间(mtime)
该文件的容量
定义文件特性的旗标(flag),如 SetUID...
该文件真正内容的指向 (pointer)
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,inode号码是从1开始计数
每个block group都有对应的group descriptor(组描述符),这些group descriptor被聚集在一起放在块的开头部分,跟在super block后面,用来描述块组的整体信息,存放block指针,就是指分区上block的编号
在 block group 中的 group descriptor 中,其中有一个 block 指针指向这个 block group 的 block bitmap,block bitmap 中的每个 bit 表示一个 block,如果该 bit 为 0,表示该 block 中有数据,如果 bit 为 1,则表示该 block 是空闲的。注意,这个 block bitmap 本身也正好只有一个 block 那么大小。假设 block 大小为 S bytes,那么 block bitmap 当中只能记载 8*S 个 block 的情况(因为一个 byte 等于 8 个 bits,而一个 bit 对应一个 block)。这也就是说,一个 block group 最多只能有 8*S*S bytes 这么大。
在 block group 的 group descriptor 中另有一个 block 指针指向 inode bitmap,这个 bitmap 同样也是正好有一个 block 那么大,记录inode的使用是未使用,里面的每一个 bit 相对应一个 inode。
在 block group 的 descriptor 中另一个重要的 block 指针,是指向所谓的 inode table。这个 inode table 就不止一个 block 那么大了。这个 inode table 就是这个 block group 中所聚集到的全部 inode 放在一起形成的。
super block(超级块):硬盘分区开头(开头的第一个 byte 是 byte 0)从 byte 1024 开始往后的一部分数据。由于 block size 最小是 1024 bytes,所以 super block 可能是在 block 1 中(此时 block 的大小正好是 1024 bytes),也可能是在 block 0 中
,当block size大于1024Bytes时。每个ext2文件系统都必须包含一个超级块,其中存储了该文件系统的大量基本信息,包括块的大小、每块组中包含的块数等。同时,系统会对超级块进行备份,备份被存放在块组的第一个块中。
本文出自 “杆儿男” 博客,请务必保留此出处http://wtime.blog.51cto.com/8829658/1538677
标签:inode ext2 block bitmap vfs
原文地址:http://wtime.blog.51cto.com/8829658/1538677