问题背景
在Linux服务器运维过程中,"磁盘空间已满"(No space left on device)是最常见的紧急故障之一。当网站无法上传文件、数据库无法写入数据或服务报错时,首要任务通常是释放磁盘空间。然而,许多初级运维人员面对庞大的文件系统往往无从下手,盲目删除文件可能导致系统崩溃或业务中断。
本文将详细介绍一套标准、安全的排查与清理流程,帮助您在最短的时间内定位“空间杀手”并安全释放资源。
第一步:确认磁盘使用情况
在进行任何操作之前,首先需要明确是哪个分区出现了问题。
1.1 检查各分区使用率
使用 df -h 命令查看磁盘挂载点的使用情况。重点关注 Use% 列,找到使用率达到 90% 或以上的分区。
示例输出:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 48G 0G 100% /
如果根分区(/)已满,需要立即行动;如果是特定数据盘(如 /data)已满,则优先处理该目录。
1.2 检查inode使用情况
有时磁盘剩余空间显示充足,但服务仍报错,可能是 inode耗尽。小文件过多会占用大量inode。
使用 df -i 命令检查inode使用率。如果某分区的Inode使用率为100%,即使有空闲空间也无法创建新文件。
第二步:定位占用空间最大的目录
确定问题分区后,需要层层深入,找到占用空间最多的顶级目录。
2.1 逐层深入法(传统方法)
使用 du 命令结合 sort 进行排序查看。例如,进入根目录:
cd /
du -sh /* | sort -hr
-s:汇总显示每个参数的总大小。-h:以人类可读格式(K, M, G)显示。sort -hr:按大小降序排列。
假设发现 /var 目录占用最大,则继续进入 /var 执行同样命令,直到定位到具体文件或目录。
2.2 使用 ncdu 工具(推荐)
对于经常处理磁盘问题的管理员,安装 ncdu(NCurses Disk Usage)是最佳选择。它提供交互式界面,可快速浏览目录结构。
- 安装:
yum install ncdu或apt-get install ncdu - 运行:
ncdu /(注意:扫描根目录耗时较长,建议先扫描疑似大目录如/var或/home) - 操作:使用方向键移动,Enter键进入子目录,Delete键标记删除(谨慎操作)。
第三步:查找并分析具体大文件
当定位到可疑目录后,需要找出具体是哪个文件占据了空间。
3.1 使用 find 命令查找
如果要查找 /var/log 下超过 100M 的文件:
find /var/log -type f -size +100M -exec ls -lh {} \;
-type f:仅查找普通文件,忽略目录。-size +100M:查找大于100MB的文件。-exec ls -lh:执行显示详细信息的命令。
3.2 常见的大文件来源
- 日志文件:Nginx/Apache访问日志、MySQL错误日志、系统内核日志(/var/log)。这些文件可能因未轮转而无限增长。
- 核心转储文件:core dump文件,通常在程序崩溃时生成,位于当前工作目录或 /tmp。
- 临时文件:/tmp 目录下遗留的大文件或未清理的压缩包。
- 备份文件:数据库备份、系统镜像备份未设置自动过期策略。
第四步:安全清理与释放空间
找到目标文件后,切勿直接 rm,特别是正在被进程占用的文件。
4.1 处理被进程锁定的文件
如果删除文件后 df -h 显示的空间没有释放,说明该文件仍被某个进程打开。此时需要使用 lsof 查找进程:
lsof | grep deleted
找到对应PID后,重启该服务或直接杀掉进程(kill -9 PID),空间即可释放。
4.2 正确清空大日志文件
对于正在写入的日志文件,直接删除会导致服务报错。应使用截断方式清空内容,保留文件句柄:
# 方法一:重定向空字符
echo "" > /var/log/nginx/access.log
# 方法二:使用 truncate 命令
truncate -s 0 /var/log/syslog
4.3 清理旧备份和日志
使用 find 结合 mtime(修改时间)自动清理过期文件。例如,删除30天前的备份:
find /backup -name "*.tar.gz" -mtime +30 -delete
第五步:预防机制与最佳实践
为了避免问题重复发生,建议采取以下措施:
5.1 配置日志轮转(Logrotate)
确保系统的 logrotate 配置正确,限制日志文件大小和保留份数。检查 /etc/logrotate.d/ 下的配置文件。
5.2 设置磁盘报警阈值
使用 Zabbix、Prometheus 或简单的 Cron 脚本监控磁盘使用率。当使用率超过 80% 时发送告警邮件或短信,以便在满载前介入处理。
5.3 实施数据保留策略
对于数据库备份、应用程序日志等,制定明确的保留周期(如只保留最近7天的日志,3个月的备份)。利用脚本或工具自动化执行清理任务。
总结
磁盘空间占用异常的排查核心在于“由粗到细,层层定位,安全释放”。掌握 df、du、find 和 ncdu 的组合使用,理解 inode 耗尽的概念,以及掌握处理被锁定文件的技巧,是每一位Linux系统管理员必备的基本技能。建立常态化的监控和清理机制,才能从根本上避免此类突发故障对业务的影响。