磁盘空间与 inode 管理:从 df 到 lsof 的生产排障全攻略

概述 凌晨三点,你被告警吵醒——线上数据库写入失败,Nginx 起不来,SSH 登录卡顿。登上服务器一查,df -h 显示根分区 100%。这种事每个运维都遇到过,磁盘满大概是生产环境最高频的故障类型之一,根据实际运维统计,磁盘相关告警占比约 15%-20%。 但磁盘满不是一个简单问题。df -h 看到的 100% 可能并不是全部真相: inode 耗尽:磁盘空间还有剩余,但文件系统inode用完了,照样报 No space left on device。这种问题更隐蔽,排查难度也更大。 已删除文件未释放:rm 删了大文件,df 显示空间没变。因为还有进程持有文件描述符,数据块并没有真正释放。 预留空间:ext4 默认预留 5% 空间给 root,400GB 的数据盘就有 20GB 被"藏"起来了。 这篇文章把磁盘空间和 inode 管理的排查思路、清理策略、预防机制一次说透。所有命令都在 Ubuntu 22.04 和 CentOS 7.9 上实测过,能直接拿去用。 磁盘空间的两个维度:blocks 与 inode 很多人对磁盘空间的理解只停留在"还剩多少 GB"这个层面。但 Linux 文件系统管理的是两个独立资源:数据块(blocks) 和 索引节点(inode)。 打个比方:文件系统像一个停车场。blocks 是停车位,inode 是停车记录。停车场可能还有空车位(blocks 没满),但记录本写满了(inode 耗尽),新来的车也停不进去。 inode 是什么 inode(Index Node,索引节点)是文件系统里描述文件元数据的数据结构。每个文件或目录对应一个 inode,存储了以下信息: 元数据字段 说明 文件类型 普通文件、目录、符号链接等 权限信息 rwx 权限位 所有者 uid 和 gid 文件大小 字节数 时间戳 atime / mtime / ctime 数据块指针 指向实际数据存储位置的索引 硬链接数 指向该 inode 的目录项数量 注意一个关键点:inode 不存储文件名。文件名存在目录项(dentry)中,目录项将文件名映射到 inode 编号。这也是为什么硬链接能存在——多个文件名可以指向同一个 inode。...

July 23, 2026 · 9 分钟 · 1726 字 · 徐保金