Skip to content

Linux Inode 概念、查看、引发的问题及常见解决方案

约 1459 字大约 5 分钟

服务器LinuxInode

2024-09-09

什么是 Linux Inode

在 Linux 操作系统中,索引节点(inode)是一个核心概念。它是文件系统中的一个关键数据结构,主要负责存储文件的元数据而非文件名本身。所述元数据涵盖了诸如文件类型(例如普通文件、目录、字符设备、块设备等)、文件大小、创建和修改时间、权限设置、链接数(即有多少文件名指向该节点)以及数据块的分布等信息。

当文件系统中的 inode 数量用尽时,即使磁盘空间还有剩余,也无法再创建新文件或目录,因为每个新文件或目录都需要一个唯一的 inode。

查看 Inode 使用情况

df -i 命令在 Linux 系统中用于显示文件系统的 inode 使用情况。df 命令通常用于显示磁盘空间的使用情况,但当与 -i 选项一起使用时,它会报告每个挂载点或文件系统的 inode 总数、已用 inode 数、剩余 inode 数以及 inode 的使用百分比。

输出示例(可能会根据系统和文件系统而有所不同):


Filesystem      Inodes IUsed  IFree IUse% Mounted on
/dev/sda1      1228800 24568 1204232    2% /
udev            483220    573 482647    1% /dev
tmpfs           491744    654 491090    1% /run
none            491744      2 491742    1% /sys/fs/cgroup
/dev/sda5       488320  488320 0      100% /home
/dev/sdb1      1280000   124 1279876    1% /data

通过以上演示代码可以看到**/home 分区的 inode 已经耗尽**。

为什么会硬盘空间充足但 Inode 不足

硬盘空间充足但 inode 不足的情况,主要是由于 inode 和磁盘空间(数据块)在文件系统中的不同角色和分配方式所导致的。

inode 是文件系统中的一种数据结构,用于存储文件的元数据(如权限、所有者、大小和创建/修改时间等),而不是文件名或文件内容本身。每个文件或目录在 Linux 中都至少有一个对应的 inode,而文件占用的大小只对应于硬盘空间容量。

举例说明:

情况 1:硬盘大小为 50GB,只有 1 个文件为 50GB,那么此时为已用容量为 50GB,可用容量为 0GB,Inode 使用量为 1,此时硬盘空间不足,但 Inode 充足

情况 2:硬盘大小为 50GB,有 1000 万个文件,每个文件仅有约 1KB,总共占用容量约为 10GB,那么此时已用容量为 10GB,可用容量为 40GB,Inode 使用量为有 1000 万,此时硬盘空间充足,但 Inode 数量可能已经耗尽

Inode 可以扩容吗

**Inode 的数量在大多数文件系统中,尤其是在创建文件系统时就确定了,通常无法直接扩容。**这是因为 inode 的数量和大小在文件系统格式化时就已经被固定,它们与文件系统的块大小和总容量有直接关系。

最简单的扩容 inode 的方法是扩容硬盘容量后对硬盘进行格式化,但这样会造成文件及数据的丢失,需要备份数据

虽然某些文件系统可以采用一些策略来动态扩展 inode,但通常也会造成文件丢失及备份问题

Inode 不足可能产生的问题

1、系统无法创建新的文件。

2、网站无法上传文件,网站访问报错,缓存文件无法生成。

3、网站 SESSION 莫名其妙失效。

4、操作数据库查看表结构出现类似的报错

can not create to file /tmp/xxx Errcode:28

以上情况均有可能是 Inode 不足引发的。可以通过 df -TH 以及 df -i 来检查硬盘容量使用及 Inode 使用情况。

Inode 占用排查及文件删除演示

以下操作为示例,用于了解 Inode 占用情况及删除方法,具体使用需根据实际情况进行调整。

1、查看根路径下各个文件夹的文件数

for i in /*; do echo $i; find $i |wc -l|sort -nr; done

以上代码中,/*表示在根目录查找,结果会列出每个文件夹占在用的节点数量,可以情况逐步分析。

如发现 var 文件夹内容过多,可以 cd 进入 var 目录再执行,只需将对应路径进行修改即可。

cd var

for i in /var/*; do echo $i; find $i |wc -l|sort -nr; done

2、假如通过反复排查,发现/var/spool/postfix/maildrop/下有 180W+文件,占用了过多的 inode ,解决方法就是在确认文件无用并可以删除的情况下,进入到对应目录中,删除对应文件夹下的文件。如进入到目标文件夹/var/spool/postfix/maildrop/下进行删除操作,但执行传统的删除命令rm通常会报错,提示参数列表过长。原因是文件太多了。

3、换种方式进行删除,如下所示,但一定要注意,先 cd 到需要删除的目录下,然后再执行删除操作

# 一定要先进入要删除的目录下
cd /var/spool/postfix/maildrop/

# pwd命令可以显示当前路径
pwd

# 一定要先确认当前路径再执行删除操作
find . -name "*" | xargs rm -rf

再次强调,一定要注意,先 cd 到需要删除的目录下,然后再执行删除操作

小结

索引节点(inode)是文件系统中的核心概念之一。它是文件系统中的关键数据结构,因此,理解和掌握与 inode 相关的知识是非常重要的。特别是需要明确区分存储空间不足和系统 inode 不足两种不同的情况。