浅谈EXT2文件系统----inode table

Inode table概述

在 EXT2 文件系统中,inode 表(Inode Table)是一个非常重要的结构,用于存储文件和目录的元数据。每个文件和目录都由一个 inode(索引节点)来表示,inode 中包含了关于该文件或目录的关键信息,如文件的大小、权限、所属用户、时间戳以及指向数据块的指针等。EXT2 文件系统将所有 inode 结构集中存储在 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 */
};

源码解读

这段代码是一个 struct ext2_inode 结构体的定义,它描述了 ext2 文件系统中的 inode 结构。inode 是文件系统中非常重要的数据结构,它存储文件的元数据,包括权限、时间戳、数据块指针等。

以下是对这个 ext2_inode 结构体的逐项解读:

基础字段

  1. __le16 i_mode: 文件模式,用来存储文件类型和访问权限信息。例如,文件是普通文件、目录或符号链接、读写执行等。
  2. __le16 i_uid: 文件所有者的用户 ID,存储低 16 位。
  3. __le32 i_size: 文件大小,单位是字节,表示文件的实际大小。
  4. __le32 i_atime: 文件的访问时间(Access Time),表示最近一次访问文件的时间。
  5. __le32 i_ctime: 文件的创建时间(Creation Time),表示文件创建或 inode 状态变更的时间。
  6. __le32 i_mtime: 文件的修改时间(Modification Time),表示文件内容最后一次被修改的时间。
  7. __le32 i_dtime: 文件删除时间(Deletion Time),记录文件被删除的时间。
  8. __le16 i_gid: 文件所有者的组 ID,存储低 16 位。
  9. __le16 i_links_count: 链接计数,表示指向该 inode 的硬链接数量。
  10. __le32 i_blocks: 文件所占的块数量(单位是 512 字节块),表示文件数据占用的磁盘块数量。
  11. __le32 i_flags: 文件标志,用来标识文件的一些特定属性,例如文件是否为只读,是否为目录等。

操作系统依赖字段

union {struct {__le32  l_i_reserved1;} linux1;struct {__le32  h_i_translator;} hurd1;struct {__le32  m_i_reserved1;} masix1;
} osd1;
  • 这个 union 是操作系统依赖的字段,针对不同的操作系统有不同的用途。
    • linux1.l_i_reserved1: 针对 Linux 的保留字段。
    • hurd1.h_i_translator: 针对 Hurd 系统,保存一些特定信息。
    • masix1.m_i_reserved1: 针对 Masix 系统的保留字段。

数据块指针

  1. __le32 i_block[EXT2_N_BLOCKS]: 文件数据块的指针数组,EXT2_N_BLOCKS 通常定义为 15。前 12 个是直接指向数据块的指针,后面 3 个分别是单重、双重、三重间接指针,用于存储文件内容的物理地址。

其他元数据

  1. __le32 i_generation: 文件版本号,主要用于 NFS 文件系统的缓存一致性管理。
  2. __le32 i_file_acl: 文件的访问控制列表 (ACL),扩展了标准的文件权限。
  3. __le32 i_dir_acl: 目录的访问控制列表 (ACL)。
  4. __le32 i_faddr: 文件的片段地址(在早期文件系统中使用的碎片处理)。

进一步的 OS 依赖字段

union {struct {__u8	l_i_frag;__u8	l_i_fsize;__u16	i_pad1;__le16	l_i_uid_high;__le16	l_i_gid_high;__u32	l_i_reserved2;} linux2;struct {__u8	h_i_frag;__u8	h_i_fsize;__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;__u8	m_i_fsize;__u16	m_pad1;__u32	m_i_reserved2[2];} masix2;
} osd2;

  • 这个 union 同样是操作系统依赖的字段,包含额外的碎片信息和高位 UID、GID。
    • linux2.l_i_frag: 碎片号(Fragment Number)用于文件系统碎片化时跟踪文件片段。
    • linux2.l_i_fsize: 碎片大小(Fragment Size)。
    • linux2.l_i_uid_highlinux2.l_i_gid_high: 用户和组 ID 的高 16 位,支持 32 位 UID 和 GID。
    • hurd2.h_i_author: Hurd 系统特有的字段,表示文件的作者。

示例

以下内容为一个普通文件test的inode table

[root@zyq-linux disk]# ll test
-rw-r--r-- 1 root root 7 Sep 23 15:54 test[root@zyq-linux disk]# cat test
123456[root@zyq-linux disk]# lsattr test
---------------- test[root@zyq-linux disk]# getfacl test
# file: test
# owner: root
# group: root
user::rw-
group::r--
other::r--[root@zyq-linux disk]# hexdump -s 124k -n 4K /root/disk.img -dv
...
001f680   33188   00000   00007   00000   05790   26353   05795   26353
001f690   05795   26353   00000   00000   00000   00001   00002   00000
001f6a0   00000   00000   00001   00000   01025   00000   00000   00000
001f6b0   00000   00000   00000   00000   00000   00000   00000   00000
001f6c0   00000   00000   00000   00000   00000   00000   00000   00000
001f6d0   00000   00000   00000   00000   00000   00000   00000   00000
001f6e0   00000   00000   46698   46172   00000   00000   00000   00000
001f6f0   00000   00000   00000   00000   00000   00000   00000   00000
...
[root@zyq-linux disk]# 
逐行解释
  • 第一行

001f680   33188   00000   00007   00000   05790   26353   05795   26353

33188         /* File mode */

00000          /* Low 16 bits of Owner Uid */

00000  00007          /* Size in bytes */ 文件大小为六个字符+1个换行符

26353  05790          /* Access time */

26353  05795          /* Creation time */

  • 第二行

001f690   05795   26353   00000   00000   00000   00001   00002   0000

26353  05790          /* Modification time */

00000   00000        /* Deletion Time */,文件删除后这里会显示删除的时间,inode map标记删除

00000                  /* Low 16 bits of Group Id */

00001                  /* Links count */

0000  00002        /* Blocks count */

  • 第三行

001f6a0   00000   00000   00001   00000   01025   00000   00000   00000

00000   00000        /* File flags */

00000   00001        /* OS dependent 1 */ (osd1 )

00000  01025         /* Pointers to blocks */

00000   00000        /* File version (for NFS) */

  • 第四行

001f6b0   00000   00000   00000   00000   00000   00000   00000   00000
00000   00000        /* File ACL */
00000   00000        /* Directory ACL */
00000   00000        /* Fragment address */

  • 剩余部分

包含第四行中的最后32bit

001f6c0   00000   00000   00000   00000   00000   00000   00000   00000
001f6d0   00000   00000   00000   00000   00000   00000   00000   00000
001f6e0   00000   00000   46698   46172   00000   00000   00000   00000
001f6f0   00000   00000   00000   00000   00000   00000   00000   00000

osd2;                /* OS dependent 2 */

总结

ext2_inode 结构体详细描述了在 ext2 文件系统中如何存储文件的元数据信息,包括文件的权限、大小、时间戳、数据块指针以及针对不同操作系统的定制字段。这种结构对于文件系统的实现和管理至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147891.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

中兴交换机三层配置

中兴交换机三层配置 目的:将1-10端口划分到3001vlan,11-20端口划分到3002vlan中去 客户端客户端IPvlan网关主机A88.88.1.1203001192.168.1.254主机B192.168.100.1303002192.168.100.254 1、通过Console线登录设备 **********************************…

CCPQT:2024年10月珠海学术会议

第三届计算、通信、感知与量子技术国际会议(CCPQT 2024) The 3rd International Conference on Computing, Communication, Perception and Quantum Technology 会议地点:中国珠海 会议时间:2024年10月25日-27日 主办单位&…

D盘格式化了,数据怎么恢复?

在日常使用电脑的过程中,我们有时可能会遇到一些意外情况,比如不小心格式化了D盘,导致重要数据丢失。面对这种情况,很多人可能会感到手足无措,不知道该如何恢复丢失的数据。其实,只要掌握正确的方法&#x…

精益生产管理咨询公司哪家好?这份攻略请拿好

面对市场上琳琅满目的精益生产管理咨询公司,企业往往难以抉择:精益生产管理咨询公司哪家好?本文,天行健咨询将从专业性、实战经验、定制化服务、持续支持等多个维度,深入探讨如何评估并选择一家优秀的精益生产管理咨询…

24 C 语言常用的字符串处理函数详解:strlen、strcat、strcpy、strcmp、strchr、strrchr、strstr、strtok

目录 1 strlen 1.1 函数原型 1.2 功能说明 1.3 案例演示 1.4 注意事项 2 strcat 2.1 函数原型 2.2 功能说明 2.3 案例演示 2.4 注意事项 3 strcpy 3.1 函数原型 3.2 功能说明 3.3 案例演示 3.4 注意事项 4 strcmp 4.1 函数原型 4.2 功能说明 4.3 案例演示 …

2021 电子设计大赛-周期信号波形识别及参数测量装置( j 题)-SZPT领跑团队-凌云

目录 一、团队介绍 二、队伍介绍 三、题目要求 四、设计摘要 五、题目分析 1.基本要求 2.发挥部分 六、总体设计框图 七、硬件电路组成 (1)挡位检测 (2)挡位选择 (3)电压抬升电路 (…

商标管理软件如何实现高效商标申请与管理?

在数字化时代,商标管理正逐步向智能化、自动化转型。企业对于商标管理软件的需求不再仅仅局限于内部流程的优化,更希望这些软件能够与外部系统无缝对接,实现一键递交官方的高效体验。启服云商标管理软件凭借其强大的技术实力和丰富的行业经验…

Python之一些列表的练习题

1.比较和对比字符串、列表和元组。例如,它们可以容纳哪类内容以及在数据结构上可以做哪些操作。 1. 内容类型:- 字符串: 只能包含字符(文本)。- 列表: 可以包含任意类型的数据,如数字、字符串、其他列表等。- 元组: 可以包含任意类型的数据,与列表类似。3. 操作:(1…

RK3568教学实验箱_操作教程:5-15 直流电机控制实验

一、产品简介 TL3568-PlusTEB人工智能实验箱 国产高性能处理器 64 位 4 核低功耗 2.0 GHz超高主频 1T 超高算力 NPU 兼容鸿蒙等国产操作系统 二、实验目的 1、熟悉Qt程序的开发流程; 2、掌握Qt Creator的基础开发使用; 3、通过编写Qt程序实现直流…

操作无法完成,因为文件已在 SWVisualize2022.BoostService 中打开

在使用 Windows 卸载文件的时候,会出现下面的情况 类似于Linux的强制删除,我们需要首先停止服务,解决方案如下, 进入 cmd 命令行窗口,首先停止服务 net stop "SWVisualize2022.BoostService" 如果需要&am…

ANSYS Workbench三维随机多面体骨料混凝土细观

在三维混凝土细观的有限元模拟中,混凝土细观几何模型的建立是仿真前提,也是其难点。在ANSYS内高效的建立三维几何模型以匹配混凝土中多面体骨料的外形、分布、级配等参数,是三维混凝土细观有限元仿真模拟的关键。 随机多面体骨料3D模型的建…

香港科技大学广州|金融科技学域博士招生宣讲会——武汉大学、华中科技大学

🔔🔔🔔明日宣讲🔔🔔🔔 💐香港科技大学广州|金融科技学域博士招生宣讲会 📍武汉大学专场 🕙时间:2024年9月24日(星期二)1…

fmql之字符驱动设备(1)

上一篇文章,记录了模块入口和出口函数的编写。 这一篇要继续编写字符驱动程序了。 仍然参考正点原子: 第3.3讲 我的第一个Linux驱动-字符设备驱动框架搭建实验_哔哩哔哩_bilibili 驱动注册和卸载 字符驱动设备的注册函数位register_chrdev 卸载函数…

让PlatformIO支持ESP32C3 SuperMini

先介绍一下这块小尺寸板子: ESP32C3SuperMini是一款基于 Espressif ESP32-C3 WiFi/蓝牙双模芯片的 IoT 迷你开发板。ESP32-C3 是一款32 位 RISC-V CPU,包含FPU(浮点单元),可进行32 位单精度运算,具有强大的…

如何写出高收录词的listing文案,先做好这一点

在亚马逊上,关键词是连接买家搜索与产品之间的桥梁,超过80%的购买行为都是通过搜索关键词开始的。因此,文案中包含的精准关键词越多,Listing越能匹配买家的需求,从而提高自然排名并优化广告效果。 亚马逊的收录分为静…

vue.js 展示一个树形结构的数据视图,并禁用其中默认选中的节点

功能描述 展示树形结构&#xff1a; 使用 Element UI 的 <el-tree> 组件展示树形结构数据。数据由 content 数组提供&#xff0c;树形结构包含了嵌套的节点及其子节点。 默认选中节点&#xff1a; 使用 defaultCheckedKeys 属性指定默认选中的节点。这些节点在树形结构渲…

基于51单片机控制恒压供水系统设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图文档目录设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…

手把手教您轻松实现微信/QQ/TIM多开,消息防撤回!

文章目录 📖 介绍 📖🏡 环境 🏡📒 防回撤 📒🚀 自动补丁工具(支持多开,支持微信、QQ、TIM)🚀 最新版手动补丁📝 步骤一📝 步骤二⚓️ 相关链接 ⚓️📖 介绍 📖 在日常聊天中,微信消息被撤回的情况屡见不鲜,总让人心中充满好奇——那些被删去的内容…

【c数据结构】OJ练习篇 帮你更深层次理解链表!(相交链表、相交链表、环形链表、环形链表之寻找环形入口点、判断链表是否是回文结构、 随机链表的复制)

目录 一. 相交链表 二. 环形链表 三. 环形链表之寻找环形入口点 四. 判断链表是否是回文结构 五. 随机链表的复制 一. 相交链表 最简单粗暴的思路&#xff0c;遍历两个链表&#xff0c;分别寻找是否有相同的对应的结点。 我们对两个链表的每个对应的节点进行判断比较&…

量化交易----数据透视表----融资融券优惠代码

我们在制定和执行量化策略的过程中&#xff0c;常常需要快速检查目标因子组合的分组下portfolio的超额收益&#xff0c;我们来提供一个快速的方法&#xff0c;可以实现单因子分组&#xff0c;双因子分组和三因子分组 比如拿到一个分析师预测的数据库&#xff0c;和A股市场政策…