源码分析网上太多了,不写了,记录简单的实践步骤:

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

六:参考

  1. 《深入理解Linux内核》
  2. http://bbs.chinaunix.net/thread-2329690-1-1.html
  3. http://elixir.free-electrons.com/linux/v3.6/source

转载于:https://www.cnblogs.com/sduzh/p/7056933.html

ext2文件系统学习(一)相关推荐

  1. ext显示服务器文件,使用linux的fsck.ext2命令检查及修复ext2文件系统

    使用linux的fsck.ext2命令检查及修复ext2文件系统 发布时间:2020-07-18 13:40:16 来源:亿速云 阅读:138 作者:清晨 栏目:服务器 不懂使用linux的fsck. ...

  2. 模拟实现EXT2文件系统

    设计EXT2文件系统 实验目的 (1)掌握文件系统的工作原理 (2)理解文件系统的主要数据结构 (3)学习较为复杂的 Linux 下的编程 (4)了解 EXT2 文件系统的结构 实验内容 设计并实现一 ...

  3. linux 如何格式化ext2,Linux的Ext2文件系统(InodeBlock)详解

    前述:Linux系统管理员很重要的任务之一就是管理好自己的磁盘文件系统,每个分区不可太大也不可以太小,太大会导致磁盘容量的浪费,太小会导致产生的文件无法存储的问题.在Linux里面文件是由两部分数据组 ...

  4. 嵌入式linux培训教程,嵌入式Linux开发学习之Linux文件系统学习

    导读 操作系统的基本功能之一就是文件管理,而文件的管理是由文件系统来完成的.Linux 支持多种文件系统,本文我们就来讲解 Linux 下的文件系统.文件系统类型.文件系统结构和文件系统相关Shell ...

  5. fat16和fat32文件系统学习

    根据自己电脑的fat,fat32分区来学习fat,fat32文件系统 fat16和fat32文件系统学习 - 下载频道 - CSDN.NET http://download.csdn.net/deta ...

  6. C语言实现简易EXT2文件系统,ext2文件系统体会-创建文件系统

    § 0x00 为什么学习ext2 这个文件系统是当初生产级别的: 实现最为简单. 与现代文件系统相比的缺点: 无事务: 不感知固态硬盘. 0x01 制作一个虚拟磁盘 通过dd命令实现. dd if=/ ...

  7. Linux 文件系统及 ext2 文件系统

    linux 支持的文件系统类型 Ext2:     有点像 UNIX 文件系统.有 blocks,inodes,directories 的概念. Ext3:     Ext2 的加强版,添加了日志的功 ...

  8. Linux EXT2文件系统结构分析(详情见附件)

    Linux的第一个版本是基于Minix文件系统的.当 Linux成熟时,引入了扩展文件系统(Ext FS) ,它包含了几个重要的扩展,但提供的性能不令人满意.在 1994 年引入了第二扩展文件系统(s ...

  9. ext2文件系统 - mke2fs

      上一遍博文的重点其实将ext2整体的组织框架,我们知道了ext2文件系统由块组组成,每个块组里面的组织形式.我们甚至直接把超级块和组描述符里面的内容,用十六进制形式展现了出来.这篇博文主要讲述如何 ...

最新文章

  1. 腾讯ARC、华中科大联合提出QueryInst,开启基于Query的实例分割新思路
  2. 特约专栏丨陈纯院士:大规模动态时序图实时处理技术、平台及应用
  3. Thread 同步线程(打印机同步)
  4. [知识图谱实战篇] 四.HTML+D3+CSS绘制关系图谱
  5. 简单说明c语言中常用的基本数据类型有哪些,C语言基本数据类型的.ppt
  6. 【机器学习】粗糙集属性约简算法与mRMR算法的本质区别
  7. Oracle EM 12c
  8. java忽略引号中的分隔符_java – 令牌化但忽略引号内的分隔符
  9. Apache RocketMQ 深圳沙龙报名开启!
  10. P1009 [NOIP1998 普及组] 阶乘之和-2022.02.01(python3实现)
  11. 前端开发 使用html写一个博客 基本标签的体验 0226
  12. 天线接口 IPEX接口 SMA接口 U.FL、IPX 天线的工作原理 天线的种类
  13. Python爬取招聘网站岗位信息
  14. 自学unity,该不该阻止?
  15. Intel和AMD的区别
  16. 2022年全球20大国际航运中心榜单公布,上海蝉联第三,与新加坡伦敦差距缩小 | 美通社头条...
  17. 数据结构与算法——时间与空间复杂度
  18. 《数据库系统原理》教学上机实验报告
  19. 2021-06-10 multisim仿真,高温报警电路555
  20. Python基础1_沙窝李的王

热门文章

  1. mac上如何安装oracle,在mac上安装oracle instant client 和 sqlplus
  2. 在Eclipse中打jar包
  3. latex转为html效果好吗,latex2html
  4. securerandom java_Java 随机数 Random VS SecureRandom
  5. thinkjdbc 关闭_ThinkJD: ThinkJD,又名ThinkJDBC,一个强大的开源JDBC/ORM操作库,让你尽可能简洁地用一行代码搞定数据库操作。...
  6. ggplot2作图详解:映射(mapping)
  7. php判断字符是否在某个数组_php:如何快速在数组array中找出以某字符串开头的值...
  8. window python环境搭建_Python入门-环境搭建详解(Window平台)
  9. 突破封锁的浏览器_零的突破!重庆第一台全国产电脑到底长什么样?
  10. 吉林大学计算机学院刘衍衍教授,周柚-吉林大学计算机科学与技术学院