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:大文件删除后空间没释放?(坑)
原因:进程还在占用这个文件。
解决:
- 找到占用该文件的进程:bash运行
lsof | grep deleted - 重启该进程(最直接):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
三、预防措施(运维规范)
为了不让问题重演,建议做以下配置:
- 日志切割:使用
logrotate工具,定期切割日志,防止单个文件过大。 - 定时清理:写个 crontab 定时任务,每周清理一次旧日志。bash运行
# 每天凌晨 3 点清理 7 天前的日志 0 3 * * * find /var/log -name "*.log" -mtime +7 -delete > /dev/null 2>&1 - 监控告警:在 Zabbix/Prometheus 中配置磁盘使用率和 inode 使用率告警(建议 85% 告警)。
四、速查命令卡片(建议保存)
| 问题 | 检查命令 | 定位命令 | 清理命令 | ||
|---|---|---|---|---|---|
| 磁盘满 | df -h | du -sh /* | sort -rh | > 大文件.log | |
| Inode 满 | df -i | find / -type f | wc -l | find . -type f -delete | |
| 删了不释放 | lsof | grep deleted | ps aux | grep 进程名 | systemctl restart 服务名 |