1. 当磁盘空间“假象”出现:inode耗尽比磁盘满更棘手
那天下午,我正在悠闲地喝着咖啡,突然接到业务部门的紧急电话,说他们的应用系统突然无法上传新文件,报错信息五花八门。我第一反应是磁盘满了,毕竟这是服务器运维的“家常便饭”。于是熟练地敲下 df -h,准备开始一场清理大作战。结果屏幕上的数字让我愣了一下:根目录 / 的磁盘使用率明明只有 75%,空间绰绰有余。这就奇怪了,空间没满,系统为什么不让创建新文件了呢?
多年的经验告诉我,这很可能不是磁盘空间的问题,而是另一个同样致命但更容易被忽视的“隐形杀手”——inode 节点耗尽。我立刻执行了另一个命令 df -i,果然,根目录的 inode 使用率赫然显示着 100%。问题找到了!对于很多刚接触服务器运维的朋友来说,inode 可能是个陌生的概念。你可以把它想象成图书馆的“图书索引卡”。一个图书馆(磁盘)有巨大的空间存放书籍(文件数据),但管理这些书籍的索引卡(inode)数量是有限的。每本书都需要一张独立的索引卡来记录它的书名、作者、位置、借阅状态等信息。现在的情况是,图书馆的书架还没摆满,但索引卡柜已经塞不下了,即使有空书架,管理员也无法为新书制作新的索引卡,新书自然也就无法入库。
在银河麒麟服务器 ZYJ 操作系统这类企业级环境中,inode 总数在创建文件系统时就固定了。如果服务器上存在大量微小文件(比如日志文件、缓存文件、会话文件、邮件等),即使每个文件只占几KB甚至几字节,它们也会消耗一个完整的 inode。当 inode 被耗尽时,就会出现“磁盘有空间,但无法创建任何新文件或目录”的诡异现象,直接影响所有依赖文件操作的业务系统。接下来,我就带你一步步拆解这个问题,从诊断、定位到安全清理,分享一套我实战中总结出来的“组合拳”。
2. 分步诊断:精准定位“元凶”目录
当怀疑是 inode 耗尽时,我们不能盲目地到处删除文件,必须先找到那个“罪魁祸首”的目录。通常,是某个目录下堆积了海量的小文件。我们的目标就是像侦探一样,层层深入,找到它。
2.1 第一层排查:看清全局视图
首先,我们需要确认问题的范围和严重程度。使用 df -i 命令是第一步,它能查看所有挂载点的 inode 使用情况。
df -i
输出结果会显示 IUsed(已用 inode)和 IFree(空闲 inode)。如果 IUse% 达到或接近 100%,那么问题就确诊了。接下来,我们要找出根文件系统下,哪个一级目录占用了最多的 inode。这里有两个我常用的命令,效果类似,你可以选择顺手的一个。
方法一:使用 for 循环结合 find 和 wc 这个命令会遍历根目录 / 下的所有直接子目录(如 /home, /var, /usr 等),并统计每个目录下的文件总数(即消耗的 inode 数)。
for i in /*; do echo $i; find $i 2>/dev/null | wc -l; done | sort -nr -k2
我来解释一下这个命令:
for i in /*; do ... done:循环处理根目录下的每一个项目。echo $i:先打印出当前正在统计的目录名。find $i 2>/dev/null:查找该目录下的所有文件和目录。2>/dev/null是为了将权限错误等无关信息丢弃,让输出更干净。wc -l:计算find命令输出的行数,也就是文件+目录的总数。sort -nr -k2:将结果按第二列(即文件数量)进行数字逆序排序,这样占用最多的目录就排在最前面。
方法二:使用 du 命令的 --inodes 参数 这个方法更简洁,银河麒麟的 du 命令通常支持这个参数。
du --inodes --max-depth=1 / 2>/dev/null | sort -nr
--inodes:告诉


340

被折叠的 条评论
为什么被折叠?



