ext2 文件系统

我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息。

首先来看一个简单文件系统,硬盘的读写以扇区为基本单位一个扇区的大小为512Byte。如下图所示一个hello文件要存在磁盘上,需要保存文件名,文件的起始位置,文件大小等信息。一个真正的文件系统远远比这复杂,文件系统可以看做是对磁盘的抽象,方便人们使用。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取等。


接下来我们将引入ext2文件系统,文件系统中存储的最小单位是块(Block),一个块究竟多大是在格式化时确定的,例如mke2fs的-b选项可以设定块大小为1024、2048或4096字。可以使用stat命令看下:stat 后跟文件名或者目录,如下图可以看到块大小是4096Byte


下图是一个磁盘分区格式化成ext2文件系统后的存储布局,其中块和inode是统一编号,比如第一个块组块编号为1~100,则第二块为101~200.

首先是1KB 的启动块,启动块之后才是ext2文件系统的开始,ext2文件系统将整个分区划成若干个同样大小的块组(Block Group)每个块组都由以下部分组成超级块(Super Block)、块组描述符表(GDT,Group Descriptor Table)、块位图(Block Bitmap)、inode位图、inode表、数据块。



那么一个文件是如何存储的呢?这里我们以一个神探狄仁杰.mp4 文件为例,首先文件系统为其分配一个INode,然后INode中有60Byte的数据块指针,很多人不禁要问,假设一个指针为4个字节,那么60Byte只能指向15个数据块,文件要是比较大怎么办?这里会采用一级索引、二级索引、三级索引。这样就可存下非常大的文件。对应的Block bitmap

和INode Bitmap的位为1。

删除文件或者格式化磁盘就是将对应的Block  Bitmap 和INode BItmap 反转即可,这也说明了为什么删除文件比较快,如果要想真正删除文件可以采用大文件覆盖的方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
共两个不同设计例子,都含详细的文档资料。 任务2.设计一个简单的二级文件系统 设计要求: 在任一OS下,建立一个大文件,把它假象成硬盘,在其实现一个简单的模拟文件系统。 编写一管理程序对此空间进行管理,要求: 1. 实现盘管理 2. 实现文件的读写操作 3. 每组最多2人,小组内要有明确分工,课程设计报告设计部分可以相同,个人实现部分不同 参考建议: 将模拟硬盘的文件空间划分为目录区,文件区;采用位示图进行空间管理,盘的分配使用显示链接(FAT表)的方式。 设计技术参数(数据结构)参考: #define MaxSize 100 #define Disk 512 //每个盘大小为512bit #define NumDisk 2048 //有2048个盘,既可分配空间为 1M /*************目录和文件的结构定义***********************/ struct DirectoryNode { char name[9]; /*目录或文件的名字*/ int type; /*0代表目录,1代表普通文件*/ struct DirectoryNode *next; /*指向下一个兄弟结点的指针*/ struct DirectoryNode *preDirFile; /*指向父结点的指针*/ struct DirectoryNode *subFile; /*指向第一个子结点的指针*/ int size; /*如果是文件则表示文件的大小*/ int first; /*起始盘号*/ int last; /*末尾盘号*/ int order; /*备用*/ }; //连续分配 struct FileSys { int VacTable[NumDisk]; //空闲表,0为空闲,1为被用 struct DirectoryNode root; //根目录 struct DirectoryNode Directory[NumDisk]; } *filesys; typedef struct { struct DirectoryNode *DirFile; char name[9]; }DataType; //包含一个指向目录的指针和名字 typedef struct { //队列结构的实现 DataType data[MaxSize]; int front,rear; //分别表示队列的头结点和尾结点 }Tp; void InitQueue(Tp *sq) //队列初始化 int EnAddQueue(Tp *sq,DataType data) //在队列增加元素 DataType EnDelQueue(Tp *sq) //从队列删除一个元素 int Empty(Tp *sq) //判断队列是否为空,返回0表示队列为空 ①.Dir:显示目录内容命令,显示当前目录下的文件和子目录。 ②.Md:创建目录操作。 ③.Create:创建文件,在当前目录下创建一个文件。 ④. all:显示从根目录开始的所有目录和文件及其层次结点。 ⑤.Cd:改变目录。 ⑥.Del:删除文件操作。 ⑦. Rd:删除目录操作,删除当前目录下的子目录。 ⑧. Ren:重命名函数 ⑨. Exit:退出命令

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值