深入解析Linux inode

Linux-FileSystem-inode

一、inode是什么?

inode(index node)是Linux/Unix文件系统中用于存储文件元数据(metadata)的数据结构,每个文件或目录都有一个唯一的inode。你可以把它想象成文件的”身份证”。

二、inode包含哪些信息?

每个inode存储以下关键信息(但不包含文件名):

  • 文件类型(普通文件、目录、符号链接等)

  • 文件权限(rwx权限)

  • 文件所有者(UID/GID)

  • 文件大小

  • 时间戳(创建、修改、访问时间)

  • 指向文件数据块的指针(文件内容实际存储位置)

  • 链接计数(有多少文件名指向此inode)

三、inode与文件名的关系

  • 文件名只是inode的一个”别名”或”标签”

  • 多个文件名可以指向同一个inode(这就是硬链接的原理)

  • 系统通过目录项(directory entry)将文件名映射到inode

四、如何查看inode?

使用ls -i命令:

1
ls -i 文件名

示例输出:

1
2
ls -i secure-ip.txt
33582157 secure-ip.txt

这里的33582157就是file.txt的inode号。

五、硬链接与inode的关系

当创建硬链接时:

  1. 系统不会创建新的inode
  2. 只是在目录中新增一个条目,指向相同的inode
  3. inode的”链接计数”值会增加1

例如:

1
2
3
4
5
6
7
8
# 创建源文件
echo "test" > original.txt
# 创建硬链接
ln original.txt hardlink.txt
# 查看inode
ls -i original.txt hardlink.txt
33610686 hardlink.txt
33610686 original.txt

输出会显示两个文件名有相同的inode号。

六、为什么硬链接不能跨分区?

因为:

  • 不同文件系统(分区)有各自独立的inode编号体系

  • 一个分区的inode号在另一个分区可能指向完全不同的文件

  • 硬链接依赖于相同的inode号,所以不能跨分区

七、inode的其他重要特性

  • 唯一性:在同一文件系统内,每个inode号是唯一的

  • 持久性:即使移动文件(在同分区内),inode号保持不变

  • 有限资源:文件系统创建时会分配固定数量的inode,用尽后即使有磁盘空间也无法创建新文件

八、实际应用场景

1. 查找大文件:通过inode查找被删除但仍被进程占用的文件

1
2
3
4
lsof | grep deleted
tail 1992 root 3r REG 253,0 20 33625066 /root/testfile.txt (deleted)
# 清理保持文件打开的进程
kill 1992

其中:

  • 1992 是保持文件打开的进程ID
  • 3r 表示文件描述符
  • 253,0 是设备号(标识文件所在的磁盘分区)。
  • 33625066 是该文件的 inode 编号
  • (deleted) 表示文件已被删除,但 inode 仍被进程占用。

2. 解决”磁盘未满但无法创建文件”问题:

1
2
3
4
5
6
7
8
9
df -i  # 查看inode使用情况
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 229871 388 229483 1% /dev
tmpfs 232851 1 232850 1% /dev/shm
tmpfs 232851 724 232127 1% /run
tmpfs 232851 16 232835 1% /sys/fs/cgroup
/dev/mapper/centos-root 14151680 40014 14111666 1% /
/dev/sda1 524288 336 523952 1% /boot
tmpfs 232851 1 232850 1% /run/user/0