首页/操作系统/04-file/inode 详解 🔗 在 Obsidian 中打开
操作系统 · 04-file

inode 详解

重要度 ⭐⭐⭐⭐⭐ 难度 ⭐⭐⭐考查频率 低 操作系统/文件管理索引节点ext4多级索引i_block
速查
inode(索引节点)是 Unix/Linux 文件系统中存储文件元数据的数据结构,每个文件对应一个 inode。它存储类型、大小、权限、所有者、时间戳、数据块指针,但不存储文件名(文件名在目录数据块中)。ext4 用 i_block[15] 组织数据块指针:直接 0–11、一级 12、二级 13、三级 14。

速查

项目
核心概念inode 是 Unix/Linux 文件系统中存储文件元数据的数据结构,每个文件对应一个 inode
关键公式 / 性质存储类型、大小、权限、所有者、时间戳、数据块指针;不存储文件名
考试频率⭐⭐⭐⭐

基本概念

inode(索引节点)是 Unix/Linux 文件系统中存储文件元数据的数据结构。每个文件对应一个 inode,但一个 inode 可被多个文件名引用(硬链接)。

inode 存储的信息

信息说明
文件类型普通文件、目录、符号链接等
文件大小字节数
权限rwxrwxrwx
所有者UID, GID
时间戳访问时间 atime、修改时间 mtime、变化时间 ctime
链接数硬链接计数
数据块指针指向文件数据的磁盘块
关键提醒inode 不存储文件名!文件名存储在目录的数据块中(目录项 = 文件名 + inode 号)。

inode 结构

Linux ext4 inode 结构

struct ext4_inode {
    __le16 i_mode;        // 文件类型和权限
    __le16 i_uid;         // 所有者 UID
    __le32 i_size_lo;     // 文件大小(低32位)
    __le32 i_atime;       // 访问时间
    __le32 i_ctime;       // inode 变化时间
    __le32 i_mtime;       // 数据修改时间
    __le32 i_dtime;       // 删除时间
    __le16 i_gid;         // 组 GID
    __le16 i_links_count; // 硬链接数
    __le32 i_blocks_lo;   // 占用块数
    __le32 i_flags;       // 文件标志
    __le32 i_block[15];   // 数据块指针(关键!)
    // ... 其他字段
};

数据块指针(i_block[15])

i_block[0~11]:  直接指针(12 个)
i_block[12]:    一级间接指针
i_block[13]:    二级间接指针
i_block[14]:    三级间接指针

多级索引结构

i_block[0]  ──→ 数据块0 (直接)
i_block[1]  ──→ 数据块1 (直接)
...
i_block[11] ──→ 数据块11 (直接)

i_block[12] ──→ 间接块 ──→ 数据块12, 13, 14, ... (一级间接)

i_block[13] ──→ 间接块1 ──→ 间接块2 ──→ 数据块 (二级间接)

i_block[14] ──→ 间接块 ──→ 间接块 ──→ 间接块 ──→ 数据块 (三级间接)

可寻址空间计算(4KB 块,4 字节指针)

类型指针数数据块数数据量
直接121248KB
一级间接102410244MB
二级间接$1024\times1024$1M4GB
三级间接1024³1G4TB
总计约 4TB

inode 与文件名的关系

目录文件内容:
┌──────────┬──────────┬──────────┐
│ inode号  │ 文件名   │ 记录长度  │
├──────────┼──────────┼──────────┤
│ 12345    │ file.txt │ 12字节   │
│ 67890    │ doc.pdf  │ 11字节   │
└──────────┴──────────┴──────────┘

查找过程:
"file.txt" → 查目录 → inode=12345 → 查 inode → 获取数据块

硬链接

  • 多个目录项指向同一个 inode
  • inode 的链接数 > 1
  • 删除一个硬链接只是减少链接数
  • 链接数 = 0 时,文件才真正删除
ln file.txt hardlink.txt  # 创建硬链接
ls -i file.txt            # 查看 inode 号
# 12345 file.txt
ls -i hardlink.txt
# 12345 hardlink.txt  (相同 inode 号)

软链接(符号链接)

  • 有自己的 inode
  • 数据块存储目标文件的路径
  • 类似 Windows 快捷方式
ln -s file.txt symlink.txt  # 创建软链接

文件查找过程

用户输入: /home/user/file.txt

1. 读取根目录 inode (inode=2)
   └→ 查找 "home" → inode=100

2. 读取 /home 目录 inode (inode=100)
   └→ 查找 "user" → inode=200

3. 读取 /home/user 目录 inode (inode=200)
   └→ 查找 "file.txt" → inode=500

4. 读取 file.txt 的 inode (inode=500)
   └→ 获取数据块指针 → 读取文件内容
目录缓存(dentry cache)缓存最近使用的目录项,加速路径查找,减少磁盘 I/O。

inode 相关的系统调用

stat 系统调用

struct stat {
    dev_t     st_dev;     // 设备 ID
    ino_t     st_ino;     // inode 号
    mode_t    st_mode;    // 文件类型和权限
    nlink_t   st_nlink;   // 硬链接数
    uid_t     st_uid;     // 用户 ID
    gid_t     st_gid;     // 组 ID
    off_t     st_size;    // 文件大小(字节)
    // ... 时间字段
};

相关命令

stat file.txt           # 查看文件 inode 信息
ls -i                   # 列出文件 inode 号
df -i                   # 查看 inode 使用情况
find -inum 12345        # 按 inode 号查找文件

inode 表与位图

┌─────┬───────┬──────────┬──────────┬──────────┬─────┐
│超级块│块位图  │ inode位图 │ inode表   │ 数据块   │ ... │
└─────┴───────┴──────────┴──────────┴──────────┴─────┘
  • inode 位图:每个位标记对应 inode 是否使用($1=$使用,$0=$空闲)
  • inode 表:存储所有 inode 的连续区域
  • inode 号 = inode 表中的偏移

inode 相关问题

inode 耗尽

df -i   # 检查 inode 使用情况
# 即使磁盘空间剩余,inode 用完也无法创建新文件
# 常见于大量小文件的场景(如邮件服务器)

inode 大小

  • ext4 默认 inode 大小:256 字节
  • 创建文件系统时可指定:mkfs.ext4 -I 512
  • 较大的 inode 可存储扩展属性

记忆卡片

inode 存储哪些信息?不存储什么?
存:类型、大小、权限、所有者、时间戳、数据块指针。不存文件名(在目录数据块)
ext4 的 i_block[15] 如何组织?
[0–11] 直接(48KB),[12] 一级(4MB),[13] 二级(4GB),[14] 三级(4TB)
硬链接与软链接本质区别?
硬链接:多目录项指向同一 inode;软链接:独立 inode,数据块存目标路径
什么是 inode 耗尽?何时易发生?
inode 位图全 1,无法创建新文件(即使有磁盘空间)。大量小文件场景(邮件服务器、缓存目录)

交互动画

inode 12 直接指针 12 个数据块(每块 4KB) inode i_block[12] 一级间接块 1024 个指针 数据块 × 1024 inode i_block[13] 间接块1 1024 指针 间接块2 1024 指针 数据 inode i_block[14] 间接1 1024 间接2 1024 间接3 1024
直接指针:12 × 4KB = 48KB
单文件最大寻址能力约 4TB(4KB 块、4 字节指针)

相关知识点

filesystem-implementation filesystem-impl-and-disk-org

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。