学习笔记5
学习笔记: EXT2 文件系统
知识点归纳
EX2文件系统数据结构
通过mkfs创建虚拟硬盘
命令为:mke2fs [-b blksize -N ninodes] device nblocks
虚拟磁盘布局
超级块
Block#1:超级块,容纳整个文件系统的信息
u32 s_blocks_count://文件系统中块总数
u32 s_r_blocks_count://为超级用户保留的块数
u32 s_free_blocks_count: //文件系统中空闲块总数
u32 s_mtime://文件系统的挂接时间
u32 s_wtime://最后一次对该超级块进行写操作的时间
u32 s_magic ://魔数签名,用于确定文件系统版本的标志
u32 s_inodes_per_group://表示每个组块的inode数目,查找文件inode所在块的位置很重要
u32 s_mnt_count://文件系统挂接计数
u32 s_max_mnt_count://文件系统最大挂接计数
u32 s_state://文件系统的状态
u16 s_magic;//魔术签名
块组描述符
Block#2:块组描述符,每组用一个块组描述符结构体来描述。
块和索引节点位图
BLOCK#8:块位图
BLOCK:9:索引节点位图,一个索引节点就是代表一个文件的数据结构。
索引节点
BLOCK#10:索引节点
直接块
间接块
双重间接块
三重间接块
数据块
紧跟在索引节点块后面的是文件存储数据块
目录条目
包含dir_entry结构,是一种可扩充结构
3级文件系统函数
支持系统文件支持文件系统的挂载、卸载和文件保护
挂载算法
mount filesys mount_point
可将某个文件系统挂载到mount_point目录上
卸载算法同理
卸载算法
交叉挂载点
*向下遍历
*向上遍历
文件保护
9个权限位
文件系统项目拓展
多个组-4KB大小块-管道文件-I/O缓冲
实践##
编程项目:编写一个c程序来显示设备上EXT2文件系统的块组描述符
相关的代码:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
int main() {
int fd = open("/dev/sda1", O_RDONLY); // 替换为你的设备路径,比如 "/dev/sdb1"
if (fd == -1) {
perror("open");
return 1;
}
struct ext2_super_block superblock;
if (ioctl(fd, EXT2_IOC_SUPERBLOCK, &superblock) == -1) {
perror("ioctl");
close(fd);
return 1;
}
printf("Block Group Descriptor:\n");
printf("Block Bitmap Block: %u\n", superblock.s_block_bitmap);
printf("Inode Bitmap Block: %u\n", superblock.s_inode_bitmap);
printf("Inode Table Block: %u\n", superblock.s_inode_table);
printf("Free Blocks Count: %u\n", superblock.s_free_blocks_count);
printf("Free Inodes Count: %u\n", superblock.s_free_inodes_count);
printf("Used Directories Count: %u\n", superblock.s_used_dirs_count);
close(fd);
return 0;
}
运行结果:
苏格拉底挑战
-
知识点1:EXT2文件系统数据结构
我在学习EXT2文件系统数据结构知识点,请你以苏格拉底的方式对我进行提问,一次一个问题。
- 针对我EXT2文件系统数据结构知识点,我理解了吗?
- 我的回答结束了,请对我的回答进行评价总结。
-
知识点2:三级文件操作系统
我在学习使用三级文件操作系统知识点,请你以苏格拉底的方式对我进行提问,一次一个问题。
-
针对我三级文件操作系统知识点,我理解了吗?
-
我的回答结束了,请对我的回答进行评价总结。
-
问题与解决思路
在学习过程中,我遇到了以下问题,并使用chatgpt等AI工具解决:
- 问题1:缺少必要的头文件库
gpt回答添加头文件#include <ext2fs/ext2_fs.h>