目录
1 EXT2文件系统
Linux一直将EXT2作为默认文件系统。EXT3是EXT2的扩展。EXT3中增加的主要内容是一个日志文件,他将文件系统的变更记录在日志中。日志可在文件系统崩溃时更快地从错误中恢复。没有错误的EXT3文件系统与EXT2文件系统相同。EXT3的最新扩展时EXT4。EXT4的主要变化是磁盘块的分配。在EXT4中,块编号为48位。EXT4是分配连续的磁盘块,称为区段。
2 EXT2文件系统数据结构
(1)通过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的块。
(2)虚拟磁盘布局
EXT2文件系统的虚拟磁盘布局如图
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文件可忽略
3 邮差算法
邮差算法是指将一个二元(多元)应表转换为一个一元的线性表的转换算法。邮差算法在文件访问上有重大意义,一个良好的算法可以大大加快文件访问速度。同时使用邮差算法和位屏蔽可以实现快速访问多维的数据个体,而不用转向复杂的结构体。具体的实现方式可以通过邮差算法将索引节点转为磁盘上的索引节点来完场。
(1)将索引节点号转换为磁盘上的索引节点
在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。
4 1级文件系统函数
mkdir:创建带路径名的新目录
creat:创建新的空文件
rmdir:删除为空的目录
link:链接两个文件
unlink:断连两个文件
symlink:实现任意两文件,包括文件夹的链接
readlink:读取符号文件的目录文件名并返回文件名长度
(1)手动实现mkdir
#include <stdio.h>
//#include <process.h>
#include<pthread.h>
#include <sys/dir.h>
int main(void){
int status;
printf("please input the name of dir:");
char s[100];
scanf("%s",s);
status = mkdir(s);
if(!status)
printf("Directory created\n");
else
printf("Unable to create directory\n");
system("dir"); /*显示创建后当前文件夹下的文件信息*/
return 0;
}
(2)手动实现rmdir
#include <stdio.h>
//#include <process.h>
#include<pthread.h>
#include <sys/dir.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
perror("Unable to delete directory");
system("dir");/*显示删除后当前文件夹下的文件信息*/
return 0;
}
5 2级文件系统函数
open:打开文件
lseek:依据偏移量再读取文件内容
close:关闭文件
read:从读取文件读取数据
write:向文件写入数据
opendir/readdir:将目录视作文件,再打开/读
6 3级文件系统函数
挂载命令:
mount filesys mount_point
卸载算法
交叉挂载
文件保护
文件锁定
标签:11,文件,EXT2,文件系统,索引,2022,2023,磁盘,节点
From: https://www.cnblogs.com/cqszxy2020/p/16747538.html