| 项目 | 值 |
|---|---|
| 核心概念 | inode 是 Unix/Linux 文件系统中存储文件元数据的数据结构,每个文件对应一个 inode |
| 关键公式 / 性质 | 存储类型、大小、权限、所有者、时间戳、数据块指针;不存储文件名 |
| 考试频率 | ⭐⭐⭐⭐ |
inode(索引节点)是 Unix/Linux 文件系统中存储文件元数据的数据结构。每个文件对应一个 inode,但一个 inode 可被多个文件名引用(硬链接)。
| 信息 | 说明 |
|---|---|
| 文件类型 | 普通文件、目录、符号链接等 |
| 文件大小 | 字节数 |
| 权限 | rwxrwxrwx |
| 所有者 | UID, GID |
| 时间戳 | 访问时间 atime、修改时间 mtime、变化时间 ctime |
| 链接数 | 硬链接计数 |
| 数据块指针 | 指向文件数据的磁盘块 |
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[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] ──→ 间接块 ──→ 间接块 ──→ 间接块 ──→ 数据块 (三级间接)
| 类型 | 指针数 | 数据块数 | 数据量 |
|---|---|---|---|
| 直接 | 12 | 12 | 48KB |
| 一级间接 | 1024 | 1024 | 4MB |
| 二级间接 | $1024\times1024$ | 1M | 4GB |
| 三级间接 | 1024³ | 1G | 4TB |
| 总计 | 约 4TB |
目录文件内容:
┌──────────┬──────────┬──────────┐
│ inode号 │ 文件名 │ 记录长度 │
├──────────┼──────────┼──────────┤
│ 12345 │ file.txt │ 12字节 │
│ 67890 │ doc.pdf │ 11字节 │
└──────────┴──────────┴──────────┘
查找过程:
"file.txt" → 查目录 → inode=12345 → 查 inode → 获取数据块
ln file.txt hardlink.txt # 创建硬链接
ls -i file.txt # 查看 inode 号
# 12345 file.txt
ls -i hardlink.txt
# 12345 hardlink.txt (相同 inode 号)
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)
└→ 获取数据块指针 → 读取文件内容
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表 │ 数据块 │ ... │
└─────┴───────┴──────────┴──────────┴──────────┴─────┘
df -i # 检查 inode 使用情况
# 即使磁盘空间剩余,inode 用完也无法创建新文件
# 常见于大量小文件的场景(如邮件服务器)
mkfs.ext4 -I 512↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。