浅谈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 文件系统中如何存储文件的元数据信息,包括文件的权限、大小、时间戳、数据块指针以及针对不同操作系统的定制字段。这种结构对于文件系统的实现和管理至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值