首页 > 代码库 > linux ext2 文件系统学习
linux ext2 文件系统学习
Linux ext2文件系统理解
- 硬盘组成:
硬盘由多个圆形硬盘片组成。按照硬盘片能够容纳的数据量分为单盘和多盘。硬盘的数据读取主要靠机械手臂上的磁头,在机械手臂上有多个磁头。机械手臂不动硬盘旋转一周划过的路径就是磁道。由于在一块硬盘上有多个硬盘片重叠放置,所以在硬盘旋转的时候在不同硬盘片上画出了多个相同的磁道,这些相同的磁道组成了柱面。柱面是分区的最小单位。由圆形向外画直线又可以将磁道划分为扇区,扇区是数据存储的最小单位,一个扇区的大小约为512字节。
磁盘容量 = 柱面 * 磁头 * 扇区 * 512字节
2.分区:
在使用一块硬盘之前首先要做的就是分区。分区的主要目的是告诉操作系统这块硬盘从哪个柱面到哪个柱面是可用区域。一块硬盘可以分成多个区,例如windows下的C、D、E、F。那么这些分区信息存储在什么地方? 在硬盘的第0轨上存储的是MBR(Master Boot Recorder)主引导区,分区信息就存储在MBR中。正因为如此,MBR是计算机启动时第一个读取的区域。
因为MBR的大小是存在限制的,最多只能够存储四个分区信息,这也是主分区和扩展分区最多只能有四个的原因。可以使用3P+E或者其他的方式对硬盘进行分区。
- 文件系统
在对硬盘进行分区了以后,要对分区进行格式化,ext2是Linux标准的文件系统格式。上面说过扇区是数据存储的基本单位,但是扇区容量太小,如果以扇区作为文件的基本存储单位,那么会导致硬盘的多次访问,从而导致系统性能的下降。格式化分区的一个主要任务是确定最小的数据存储单位----块的大小。一个块是由多个扇区组成,即 块容量 = 扇区容量 * 2 ^n,也就是说当格式化分区以后,文件的存储将以块为最小单位,例如一个块的大小为1k,那么如果我要存储0.1k的文件,就需要分配一个块给这个文件,虽然有0.9k的容量浪费;再比如要存储一个9.5k的文件,就需要分配10个块给这个文件。在Linux ext2文件系统中块只用来存储文件内容数据,那么文件还有很多的属性信息存储在什么地方? ext2 文件系统提出了inode这个数据结构,使用这个数据结构存储文件的相关属性,例如访问权限,所有者,所属组还用对应文件内容数据的存储块指针信息等。(inode也是用一个或者多个块存储的)在块和inode数据结构提出以后,格式化分区仍然存在以下问题:
1) 分区信息如何存储?例如分区大小,起始和结束柱面、创建时间等。
2) inode信息如何组织?
在使用ext2格式格式化分区以后,分区中的块和inode会被进行编号。而且会将0~x(x会因不同分区而异)的块规划成一个大的块,称为superBlock,在superBlock中存储了该分区的一些信息,例如块数目,inode数目,分区创建时间等,而且还有多个类似 Group x:(Block x ~ y)(这里的x,y表示的是数值编号)单元,这些信息存储的是什么?在ext2文件系统中将所有的块和inode又组成成多个块组,每个块组包含多个块和inode,也就是说块和inode是以块组进行管理的。在块组中包含的信息有:
Group 0: (Blocks 0-32767) [ITABLE_ZEROED] 1.Checksum 0xb986, unused inodes 49 2.Primary superblock at 0, 3.Group descriptors at 1-2 4.Reserved GDT blocks at 3-1024 5.Block bitmap at 1025 (+1025), Inode bitmap at 1041 (+1041) 6. Inode table at 1057-1568 (+1057) 7.22987 free blocks, 49 free inodes, 480 directories, 49 unused inodes 8.Free blocks: 9392, 9436, 9444, 9496, 9567-9571, 9790-32767 9.Free inodes: 8144-8192 |
- primary superblock : 存储分区信息的块
- Group descriptors : 存储块组信息的块
- Reserved GDT blocks : 预留块
- Block bitmap Inode bitmap: 分别表示块与inode是否可用,每一位表示一个块或者inode,为1表示存在有数据,为0表示没有存储数据为空
- inode table : 表示该块组包含的所有inode所在的块
- free Block, free inode : 空闲块和inode的数量
- free Block :空闲块所在块
- free inode : 空闲inode所在块
当你创建一个文件时 :
- 根据inode位图/块位图的信息,找到尚未使用的inode与块,进而将文件的属性与数据分别记入inode与块。
- 将刚刚使用的inode与块的号码告知superBlock、inode位图、块位图等,让这些数据更新信息。
Linux系统到底是如何读取一个文件内的内容呢?
目录:在Linux的ext2 文件系统建立一个目录时,ext2会给该目录分配一个inode与至少一个块。其中,inode记录该目录的相关属性,并指向分配到的那个块;块记录在这个目录下的相关文件的关联性 。
文件: 在ext2文件系统下创建一个文件时系统至少分配一个inode和对应于文件大小的块,inode本身并不记录文件名,它只记录文件相关属性,文件名则记录在该文件所属文件夹的块区域。在该文件夹的块区域记录了文件名和inode的相关连接。所以在ext2 文件系统下读取一个文件内容时,Linux会首先由根目录/获取该文件的上层目录所在的inode,在由该inode获取该目录所属的块,在块中找到该文件的inode,再通过该文件的inode得到该文件对应的块。例如读取 /etc/crontab文件: