ext2文件系统学习(一)
源码分析网上太多了,不写了,记录简单的实践步骤:
1. 创建ext2文件镜像并映射
cd /tmpdd if=/dev/zero of=ext2-1M.img bs=1024 count=1024mkfs.ext2 ext2-1M.imgmkdir ext2sudo mount -o loop ext2-1M.img ext2
2. 在ext2文件系统内创建一个普通文件,方便测试
cd ext2 touch test echo "test content" > test
3. 用vim打开ext2-1M.img,十六进制查看(:%!xxd)
4. 查看block大小,定位各个磁盘数据结构的位置
所以超级快的地址为1 * 1024 = 0x400,可以对照着数据结构ext2_super_block来分析文件内容,通过/sbin/dumpe2fs /dev/loop0来验证分析是否正确。
第一个组描述符在第二个block: 0x800,类似的可以对照着数据结构ext2_group_desc来分析文件内容,通过/sbin/dumpe2fs来验证结果。
找到了组描述符便可以找到数据快位图(bg_block_bitmap)、索引节点位图(bg_inode_bitmap)、索引节点表(bg_inode_table)等结构的位置。
5. 通过文件索引节点标号找到文件内容
查看测试文件的索引节点编号:
每个group里的索引节点个数为ext2_super_block.s_inodes_per_block,在结构体ext2_super_block中的偏移量40,也就是为0x28,因此在文件中的地址为0x428:
0x428处的值为0x00000080,也就是128,因此节点编号12(编号从1开始)所在的group为(12 -1 ) / 128 = 0,也就是第一个group;在inode table中的下标为(12 -1) % 128 = 11。
inode table的地址在ext2_group_desc.bg_inode_table,文件中地址为0x808,值为0x0008,也就是inode table起始于第八个blcok,地址为1024*8=0x2000。
每个inode大小为128字节,因此inode table index为11的inode地址为11 * 128 + 0x2000 = 0x002580:
该地址对应结构体ext2_inode:
struct ext2_inode {__le16 i_mode; /* File mode */__le16 i_uid; /* Low 16 bits of Owner Uid */__le32 i_size; /* Size in bytes */__le32 i_atime; /* Access time */__le32 i_ctime; /* Creation time */__le32 i_mtime; /* Modification time */__le32 i_dtime; /* Deletion Time */__le16 i_gid; /* Low 16 bits of Group Id */__le16 i_links_count; /* Links count */__le32 i_blocks; /* Blocks count */__le32 i_flags; /* File flags */union {struct {__le32 l_i_reserved1;} linux1;struct {__le32 h_i_translator;} hurd1;struct {__le32 m_i_reserved1;} masix1;} osd1; /* OS dependent 1 */__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */__le32 i_generation; /* File version (for NFS) */__le32 i_file_acl; /* File ACL */__le32 i_dir_acl; /* Directory ACL */__le32 i_faddr; /* Fragment address */union {struct {__u8 l_i_frag; /* Fragment number */__u8 l_i_fsize; /* Fragment size */__u16 i_pad1;__le16 l_i_uid_high; /* these 2 fields */__le16 l_i_gid_high; /* were reserved2[0] */__u32 l_i_reserved2;} linux2;struct {__u8 h_i_frag; /* Fragment number */__u8 h_i_fsize; /* Fragment size */__le16 h_i_mode_high;__le16 h_i_uid_high;__le16 h_i_gid_high;__le32 h_i_author;} hurd2;struct {__u8 m_i_frag; /* Fragment number */__u8 m_i_fsize; /* Fragment size */__u16 m_pad1;__u32 m_i_reserved2[2];} masix2;} osd2; /* OS dependent 2 */ };
i_size为0x0d,i_block偏移量为0x28,文件中地址为0x0025a8,i_block[0]的值为0x0026:
也就是说文件第一个block内容位于第0x26,也就是第38个block,地址为38*1024=0x9800,跳转过去便可以发现文件内容:test content
六:参考
- 《深入理解Linux内核》
- http://bbs.chinaunix.net/thread-2329690-1-1.html
- http://elixir.free-electrons.com/linux/v3.6/source
转载于:https://www.cnblogs.com/sduzh/p/7056933.html
ext2文件系统学习(一)相关推荐
- ext显示服务器文件,使用linux的fsck.ext2命令检查及修复ext2文件系统
使用linux的fsck.ext2命令检查及修复ext2文件系统 发布时间:2020-07-18 13:40:16 来源:亿速云 阅读:138 作者:清晨 栏目:服务器 不懂使用linux的fsck. ...
- 模拟实现EXT2文件系统
设计EXT2文件系统 实验目的 (1)掌握文件系统的工作原理 (2)理解文件系统的主要数据结构 (3)学习较为复杂的 Linux 下的编程 (4)了解 EXT2 文件系统的结构 实验内容 设计并实现一 ...
- linux 如何格式化ext2,Linux的Ext2文件系统(InodeBlock)详解
前述:Linux系统管理员很重要的任务之一就是管理好自己的磁盘文件系统,每个分区不可太大也不可以太小,太大会导致磁盘容量的浪费,太小会导致产生的文件无法存储的问题.在Linux里面文件是由两部分数据组 ...
- 嵌入式linux培训教程,嵌入式Linux开发学习之Linux文件系统学习
导读 操作系统的基本功能之一就是文件管理,而文件的管理是由文件系统来完成的.Linux 支持多种文件系统,本文我们就来讲解 Linux 下的文件系统.文件系统类型.文件系统结构和文件系统相关Shell ...
- fat16和fat32文件系统学习
根据自己电脑的fat,fat32分区来学习fat,fat32文件系统 fat16和fat32文件系统学习 - 下载频道 - CSDN.NET http://download.csdn.net/deta ...
- C语言实现简易EXT2文件系统,ext2文件系统体会-创建文件系统
§ 0x00 为什么学习ext2 这个文件系统是当初生产级别的: 实现最为简单. 与现代文件系统相比的缺点: 无事务: 不感知固态硬盘. 0x01 制作一个虚拟磁盘 通过dd命令实现. dd if=/ ...
- Linux 文件系统及 ext2 文件系统
linux 支持的文件系统类型 Ext2: 有点像 UNIX 文件系统.有 blocks,inodes,directories 的概念. Ext3: Ext2 的加强版,添加了日志的功 ...
- Linux EXT2文件系统结构分析(详情见附件)
Linux的第一个版本是基于Minix文件系统的.当 Linux成熟时,引入了扩展文件系统(Ext FS) ,它包含了几个重要的扩展,但提供的性能不令人满意.在 1994 年引入了第二扩展文件系统(s ...
- ext2文件系统 - mke2fs
上一遍博文的重点其实将ext2整体的组织框架,我们知道了ext2文件系统由块组组成,每个块组里面的组织形式.我们甚至直接把超级块和组描述符里面的内容,用十六进制形式展现了出来.这篇博文主要讲述如何 ...
最新文章
- 腾讯ARC、华中科大联合提出QueryInst,开启基于Query的实例分割新思路
- 特约专栏丨陈纯院士:大规模动态时序图实时处理技术、平台及应用
- Thread 同步线程(打印机同步)
- [知识图谱实战篇] 四.HTML+D3+CSS绘制关系图谱
- 简单说明c语言中常用的基本数据类型有哪些,C语言基本数据类型的.ppt
- 【机器学习】粗糙集属性约简算法与mRMR算法的本质区别
- Oracle EM 12c
- java忽略引号中的分隔符_java – 令牌化但忽略引号内的分隔符
- Apache RocketMQ 深圳沙龙报名开启!
- P1009 [NOIP1998 普及组] 阶乘之和-2022.02.01(python3实现)
- 前端开发 使用html写一个博客 基本标签的体验 0226
- 天线接口 IPEX接口 SMA接口 U.FL、IPX 天线的工作原理 天线的种类
- Python爬取招聘网站岗位信息
- 自学unity,该不该阻止?
- Intel和AMD的区别
- 2022年全球20大国际航运中心榜单公布,上海蝉联第三,与新加坡伦敦差距缩小 | 美通社头条...
- 数据结构与算法——时间与空间复杂度
- 《数据库系统原理》教学上机实验报告
- 2021-06-10 multisim仿真,高温报警电路555
- Python基础1_沙窝李的王
热门文章
- mac上如何安装oracle,在mac上安装oracle instant client 和 sqlplus
- 在Eclipse中打jar包
- latex转为html效果好吗,latex2html
- securerandom java_Java 随机数 Random VS SecureRandom
- thinkjdbc 关闭_ThinkJD: ThinkJD,又名ThinkJDBC,一个强大的开源JDBC/ORM操作库,让你尽可能简洁地用一行代码搞定数据库操作。...
- ggplot2作图详解:映射(mapping)
- php判断字符是否在某个数组_php:如何快速在数组array中找出以某字符串开头的值...
- window python环境搭建_Python入门-环境搭建详解(Window平台)
- 突破封锁的浏览器_零的突破!重庆第一台全国产电脑到底长什么样?
- 吉林大学计算机学院刘衍衍教授,周柚-吉林大学计算机科学与技术学院