一、EXT2文件系统
Linux一直将EXT2作为默认文件系统。EXT3是EXT2的扩展。EXT3中增加的主要内容是一个日志文件,他将文件系统的变更记录在日志中。日志可在文件系统崩溃时更快地从错误中恢复。没有错误的EXT3文件系统与EXT2文件系统相同。EXT3的最新扩展时EXT4。EXT4的主要变化是磁盘块的分配。在EXT4中,块编号为48位。EXT4是分配连续的磁盘块,称为区段。
二、EXT2文件系统数据结构
通过mkfs创建虚拟磁盘
在Linux下,命令
mke2fs [-b blksize -N ninodes] device nblocks
在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。设备可以是真实设备,也可以是虚拟磁盘文件。如果未指定blksize,则默认块大小为1KB。举例:
dd if=/dev/zero of=vdisk bs=1024 count=1440
mke2fs vdisk 1440
可在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1KB的块。
虚拟磁盘布局
EXT2将磁盘分为若干个块结构,每个块结构负责特定功能,包含:引导块、超级块、块组描述符块、块位图、索引点位图、索引节点、数据块和其它数据块。
Block#0:引导块。B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,从磁盘引导操作系统
Block#1:超级块。在硬盘分区中字节偏移量为1024)B1是超级块,用于容纳整个文件系统的信息
Block#2:块组描述符块。EXT2将磁盘块分成几个组。每个组有8192个块(硬盘上的大小为32K)。每组用一个块组描述符结构体描述)
Block#8:块位图(Bmap)bg_block_bitmap)位图用来表示某种项的位序列,例如,磁盘块或索引节点。位图用于分配和回收项。在位图中,0位表示对应项处于FREE状态,1位表示对应项处于IN_USE状态。一个软盘有1440块。
Block#9:索引节点位图(Imap)(bg_inode_bitmap)一个索引节点就是用来代表一个文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用B9中Imap中的一个位表示。在EXT2 FS中,前10个索引节点是预留的。
Block#10:索引(开始)节点(bg_inode_table)每个文件都用一个128字节(EXT4中的是256字节)的独特索引节点结构体表示。
i_block[15]数组包含指向文件磁盘块的指针,这些磁盘块有:
- 直接块:i_block[0]至i_block[11]指向直接磁块盘
- 间接块:i_block[12]指向一个包含256个块编号的磁盘块,每个块编号指向一个磁盘块
- 双重间接块:i_block[13]指向一个指向256个块的块,每个块指向256个磁盘块
- 三重间接块:i_block[14]对于小型EXT2文件可忽略
三、邮差算法
邮差算法是指将一个二元(多元)应表转换为一个一元的线性表的转换算法。邮差算法在文件访问上有重大意义,一个良好的算法可以大大加快文件访问速度。同时使用邮差算法和位屏蔽可以实现快速访问多维的数据个体,而不用转向复杂的结构体。具体的实现方式可以通过邮差算法将索引节点转为磁盘上的索引节点来完场。
将索引节点号转换为磁盘上的索引节点
在EXT2文件系统中,每个文件都有一个唯一的索引节点结构。在文件系统上,索引节点从inode_table块开始。每个磁盘包含
INODES_PER_BLOCK = BLOCK_SIZE / sizeof(INODE)
个索引节点。每个索引节点都有一个唯一的索引节点结构。在文件系统磁盘上,索引节点从inode_table块开始。每个磁盘块包含
INODES_PER_BLOCK = BLOCK_SIZE / sizeof(INODE)
个索引节点。每个索引节点都有一个唯一的索引节点号,ino = 1,2,...,从1开始线性计数。已知一个ino,如1234,那么哪个磁盘块包含该索引节点,以及哪个索引节点在该块中?我们需要知道磁盘块号,因为需要通过块来读/写一个真正的磁盘。
block = (ino -1) / INODES_PER_BLOCK + inode_table;
inode = (ino - 1) % INODES_PER_BLOCK;
同样,将EXT2文件系统中的双重和三重间接逻辑块号转换为物理块号也依赖于邮差算法。
将线性磁盘块号转换为CHS = (柱面、磁头、扇区)格式:软盘和旧硬盘使用CHS寻址,但文件系统始终使用线性块寻址。在调用BIOS INT13时,可用该算法将磁盘块号转换为CHS。
四、1级文件系统函数
mkdir:创建带路径名的新目录
creat:创建新的空文件
rmdir:删除为空的目录
link:链接两个文件
unlink:断连两个文件
symlink:实现任意两文件,包括文件夹的链接
readlink:读取符号文件的目录文件名并返回文件名长度
(1)手动实现mkdir
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int main(void) {
int status;
printf("Please input the name of dir: ");
char s[100];
scanf("%s", s);
status = mkdir(s, 0777);
if (!status) {
printf("Directory created\n");
} else {
printf("Unable to create directory\n");
}
system("ls"); /*显示创建后当前文件夹下的文件信息*/
return 0;
}
(2)手动实现rmdir
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int main(void){
int status;
printf("please input the name of dir:");
char s[100];
scanf("%s",s);
status = rmdir(s);
if(!status)
printf("\n\nDirectory deleted\n");
else
printf("Unable to delete directory");
system("dir");/*显示删除后当前文件夹下的文件信息*/
return 0;
}
五、CHATGPT
(1)苏格拉底挑战
- EXT2文件系统
- 邮差算法
(2)问题解决
- include <sys/stat.h>和include <stdio.h>头函数作用
include <sys/stat.h> 是一个C语言标准库的头文件,它包含了一些用于文件状态的函数和宏定义。其中最常用的函数是stat()和fstat(),它们可以用来获取文件的各种属性,如文件大小、文件权限、文件类型等。此外,sys/stat.h 还定义了一些用于文件权限设置和判断的宏,如S_IRUSR、S_IWUSR等。
include <stdio.h> 是另一个C语言标准库的头文件,它包含了一些用于输入输出的函数和宏定义。其中最常用的函数是printf()和scanf(),用于格式化输出和输入。此外,stdio.h 还定义了一些常用的数据类型和文件操作相关的函数,如fopen()、fclose()等。
综上所述,<sys/stat.h> 头文件提供了文件状态相关的函数和宏定义,而 <stdio.h> 头文件提供了输入输出相关的函数和宏定义。这两个头文件在C编程中经常被使用,用于处理文件和输入输出操作。
六、学习收获
- 本周进行了第一次实验课,发现自己对于gdb的实践还不够熟练,这周进行了巩固实践。
- 本周课堂学习了linux终端指令的C语言实现。
- 明确了EXT3系统中日志的功能和作用。
标签:11,文件,EXT2,文件系统,2024,索引,2023,磁盘,节点 From: https://www.cnblogs.com/yogahuu/p/17761783.htmlEXT3文件系统的日志功能是通过日志(journal)来实现的。日志记录了文件系统的操作,包括文件的创建、修改和删除等操作。当进行文件系统操作时,这些操作首先会被记录在日志中,然后再被应用到文件系统上。这样,在系统崩溃或意外断电等情况下,文件系统可以通过读取日志来恢复操作,以保持文件系统的一致性。
日志功能的作用是提高文件系统的稳定性和可靠性。它可以防止数据丢失或损坏,因为在发生系统崩溃或断电等情况下,文件系统可以通过读取日志来恢复未完成的操作。这样可以减少数据损失的风险,并提高文件系统的可靠性。