磁盘满、inode满处理方法

Linux 磁盘满 & inode 满 终极处理手册

在运维工作中,这两个问题是导致服务挂掉的高频杀手。尤其是 inode 满,新手最容易踩坑(磁盘明明还有空间,却提示 “No space left on device”)。

我把它整理成两步定位 + 实战清理的流程

一、磁盘满(Disk Full)处理

第一步:定位谁占了空间

1. 确认挂载点使用率

bash

df -h

找到 Use% 为 100% 的挂载点(比如 //data)。

2. 逐级查找大目录(万能命令)

假设根目录 / 满了,从根开始找:

bash

# 查看根目录下各文件夹大小
du -sh /* | sort -rh | head -10

发现 /var 很大,进入 /var 继续找:

bash

du -sh /var/* | sort -rh | head -10

通常最后会定位到 /var/log(日志)或 /var/lib/mysql(数据库)。

3. 直接找大文件(最快)

如果你不想逐级找,直接用这个命令列出所有大于 100M 的文件:

bash

find / -type f -size +100M -exec ls -lh {} \; | sort -k5 -rh

第二步:安全清理

场景 1:日志文件过大(最常见)

错误做法:直接 rm -rf xxx.log(可能导致程序句柄不释放,空间不释放)。

正确做法

bash

# 清空文件内容(最安全)
> xxx.log
# 或者
echo "" > xxx.log
场景 2:历史日志 / 备份文件

bash

# 删除 7 天前的日志
find /var/log -name "*.log" -mtime +7 -delete
# 删除旧的压缩包
rm -rf *.tar.gz.old
场景 3:大文件删除后空间没释放?(坑)

原因:进程还在占用这个文件。

解决:

  1. 找到占用该文件的进程:bash运行lsof | grep deleted
  2. 重启该进程(最直接):bash运行systemctl restart xxx

二、inode 满(Inode Full)处理

什么是 inode?

简单说,inode 是文件的 “身份证”

  • 磁盘满 = 仓库体积满了。
  • inode 满 = 仓库格子(文件数量)满了。
  • 典型症状:df -h 显示有空间,但 touch 新建文件失败。

第一步:确认 inode 满了

bash

df -i

IUse% 列,如果是 100%,就是 inode 满了。

第二步:定位大量小文件

inode 满几乎 100% 是因为某个目录下有几百万个小文件(如日志碎片、邮件队列、临时文件)。

1. 查找哪个目录的文件数最多

bash

# 从根目录开始,统计每个目录的文件数量
find / -type d -exec sh -c 'echo -n "{}: "; ls -1 "{}" | wc -l' \; 2>/dev/null | sort -k2 -nr | head -10
2. 常见罪魁祸首
  • /tmp:临时文件没清理
  • /var/spool/postfix/maildrop:邮件队列积压
  • /var/log/nginx:大量小日志文件
  • 项目的临时缓存目录

第三步:清理大量小文件

警告:如果文件数量极大(几十万以上),直接用 rm -rf * 会卡死终端。

方法 1:分批删除(推荐)

bash

# 每次删 1000 个,直到删完
while true; do
    ls -f | head -1000 | xargs rm -f
    if [ $? -ne 0 ]; then
        break
    fi
done

方法 2:使用 find 直接删(高效)

bash

运行

# 删除当前目录下所有文件,不递归(最快)
find . -maxdepth 1 -type f -delete

三、预防措施(运维规范)

为了不让问题重演,建议做以下配置:

  1. 日志切割:使用 logrotate 工具,定期切割日志,防止单个文件过大。
  2. 定时清理:写个 crontab 定时任务,每周清理一次旧日志。bash运行# 每天凌晨 3 点清理 7 天前的日志 0 3 * * * find /var/log -name "*.log" -mtime +7 -delete > /dev/null 2>&1
  3. 监控告警:在 Zabbix/Prometheus 中配置磁盘使用率和 inode 使用率告警(建议 85% 告警)。

四、速查命令卡片(建议保存)

问题检查命令定位命令清理命令
磁盘满df -hdu -sh /*sort -rh> 大文件.log
Inode 满df -ifind / -type fwc -lfind . -type f -delete
删了不释放lsofgrep deletedps auxgrep 进程名 systemctl restart 服务名

滚动至顶部