EXT2文件系统
EXT2(The Second Extended File System)是Linux的标准文件系统,一直以来被广泛使用。EXT3是EXT2的扩展版本,增加了一个日志系统。
文件系统背景
- Linux标准文件系统: EXT2是Linux的标准文件系统,多年来一直被广泛使用。
- EXT3的扩展: EXT3是EXT2的扩展版本,主要增加了一个日志系统,用于提高文件系统的容错性和恢复速度。
EXT2文件系统数据结构
虚拟磁盘布局
- Block#0 - 引导块: 通常用于引导程序,文件系统不使用。
- Block#1 - 超级块: 包含整个文件系统的信息,包括文件总数、块总数、保留块数、空闲块数等。
超级块结构
struct ext2_super_block {
u32 s_inodes_count; // 索引节点总数
u32 s_blocks_count; // 块总数
u32 s_r_blocks_count; // 保留块总数
// ... 其他字段 ...
u32 s_blocks_per_group; // 每组块总数
u32 s_clusters_per_group; // 每组片段总数
// ... 更多非必要字段 ...
};
块组描述符块
-
Block#2 - 块组描述符块: 文件系统将磁盘块划分为多个块组,每个块组包含一定数量的块。块组描述符用于描述块组的信息。
struct ext2_group_desc { u32 bg_block_bitmap; // 块位图块号 u32 bg_inode_bitmap; // 索引节点位图块号 u32 bg_inode_table; // 索引节点表开始块号 // ... 其他字段 ... u16 bg_free_blocks_count; // 空闲块数 u16 bg_free_inodes_count; // 空闲索引节点数 // ... 更多字段 ... };
块位图和索引节点位图
- Block#8 - 块位图 (Bmap): 用于表示磁盘块的分配状态。
- Block#9 - 索引节点位图 (Imap): 用于表示索引节点的分配状态。
索引节点结构
-
Block#10 - 索引节点表: 包含文件和目录的索引节点。
struct ext2_inode { u16 i_mode; // 文件模式和权限 u16 i_uid; // 所有者用户ID u32 i_size; // 文件大小 u32 i_atime; // 最后访问时间 u32 i_ctime; // 创建时间 u32 i_mtime; // 最后修改时间 // ... 其他字段 ... u32 i_block[15]; // 直接块和间接块 // ... 更多字段 ... };
目录条目
-
目录文件数据结构: 用于表示目录文件中的目录条目。
struct ext2_dir_entry_2 { u32 inode; // 索引节点号 u16 rec_len; // 条目长度 u8 name_len; // 文件名长度 u8 file_type; // 文件类型 char name[EXT2_NAME_LEN]; // 文件名 };
遍历EXT2文件系统树
遍历算法:遍历EXT2文件系统的基本算法包括读取超级块、块组描述符、InodeBegin块,然后从根目录开始搜索。
文件系统结构
文件系统层次结构: 文件系统通常通过层次结构来组织,包括基本文件系统、文件读写功能、系统挂载、卸载和文件保护。
util.c中的实用程序函数
get_block/put_block: 这两个函数用于从虚拟磁盘块读取数据并将数据写入内存中的缓冲区。get_block 用于读取,而 put_block 用于写入。
iget(dev, ino): iget 函数返回一个指向包含给定设备(dev)和索引节点号(ino)的内存 minode 结构的指针。这是用于索引节点的缓存,以提高文件系统性能。
*put(INODE mip): put 函数释放不再需要的 minode 结构。这是内存中索引节点缓存的管理。
getino(): 您提到 "getino" 函数实现文件系统树遍历算法。这可能是一个自定义函数,用于在文件系统中查找特定的索引节点。
文件系统操作
mkdir命令: mkdir 命令用于创建新目录。它在指定的位置创建一个新目录,使用户能够组织文件和子目录。
rmdir命令: rmdir 命令用于删除目录。只有在目录为空时才能成功删除目录。
2级文件系统操作: 您提到2级文件系统包括 open、close、lseek、read、write、opendir 和 readdir。这些函数是用于文件的打开、关闭、读写以及目录操作的函数。它们构成了文件系统的核心操作。
挂载操作命令: mount 命令用于将一个文件系统挂载到另一个文件系统中,使其成为现有文件系统的一部分。这允许您将不同的文件系统组合在一起,以便共享文件和资源。
实践
用dumpe2fs工具查看这个分区的超级块和块组描述表信息
(base)
1.
dumpe2fs 1.42.13 (17-May-2015)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: a00715b2-528b-4ca6-8c2b-953389a5ab00
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: ext_attr resize_inode dir_index filetype sparse_super
large_file
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type:Linux
Inode count: 128
Block count: 1024
Reserved block count: 51
Free blocks: 986
Free inodes: 117
First block: 1
Block size:1024
Fragment size: 1024
Reserved GDT blocks: 3
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 128
Inode blocks per group: 16
Filesystem created:Thu Sep 8 10:35:47 2022
Last mount time: n/a
Last write time: Thu Sep 8 10:35:47 2022
Mount count: 0
Maximum mount count: -1
Last checked: Thu Sep 8 10:35:47 2022
Check interval: 0 (<none>)
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size:128
Default directory hash: half_md4
Directory Hash Seed: e5c519af-d42e-43b5-bc8d-c67c5a79bcbe
Group 0: (Blocks 1-1023)
superblock at 1, Group descriptors at 2-2
标签:count,...,文件系统,笔记,学习,索引,u32,节点
From: https://www.cnblogs.com/zsy1748774883/p/17765845.html