Linux系统磁盘空间告急:磁盘空间100% 查找并删除大文件

Linux系统磁盘空间告急:磁盘空间100% 查找并删除大文件

引言

在Linux服务器运维过程中,磁盘空间不足是最常见的问题之一。当磁盘使用率达到100%时,会导致数据库连接失败、应用程序异常、服务状态异常等一系列连锁反应。本文将详细介绍如何快速诊断磁盘空间问题,并通过实用的命令行技巧高效定位和清理大文件。

问题识别与验证

常见症状表现

当磁盘空间不足时,系统会出现以下典型症状:

• 数据库应用:客户端操作时出现 No space left on device 错误
• Java应用:日志中频繁报错,影响服务正常运行
• Spring Cloud微服务:Eureka注册中心状态显示为 DOWN
• 其他应用:连接超时、响应缓慢或服务不可用

快速验证磁盘状态

使用 df 命令快速查看磁盘使用情况:

df -h

输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_192-lv_root 50G 44G 3.4G 100% /

当看到使用率达到100%时,需要立即采取行动。

磁盘空间问题解决方案

面对磁盘空间不足,通常有两种解决思路:

1. 扩容方案:增加磁盘容量(适合长期规划)
2. 清理方案:查找并删除大文件(适合紧急处理)

本文重点介绍第二种方案的具体实施步骤。

大文件定位策略

分层递进式查找

采用分层递进的方式,从根目录开始逐层定位占用空间最大的目录:

第一步:查看根目录下各目录占用情况

查看根目录下第一层目录的磁盘占用:

du -h / –max-depth=1 | sort -hr | head -n 10

输出示例:
50G /
28G /var
6.0G /dfs
4.0G /opt
3.0G /root
2.3G /usr
148M /lib
39M /log
30M /etc
29M /boot

从结果可以看出 /var 目录占用了28G空间,是主要问题所在。

第二步:深入问题目录

继续查看 /var 目录下的子目录:

du -h /var –max-depth=1 | sort -hr | head -n 10

输出示例:
28G /var
24G /var/lib
3.8G /var/log
371M /var/cache

第三步:精确定位问题源头

查看 /var/lib 目录详情:

du -h /var/lib –max-depth=1 | sort -hr | head -n 10

输出示例:
24G /var/lib
10G /var/lib/mongo
8.4G /var/lib/cloudera-service-monitor
4.5G /var/lib/cloudera-host-monitor
319M /var/lib/mysql

通过这种分层查找方式,最终定位到:
• MongoDB数据文件占用10G
• CDH集群监控数据占用约13G

命令参数详解

• du -h:以人类可读的格式显示磁盘使用情况
• –max-depth=1:只显示第一层目录,避免输出过多信息
• sort -hr:按大小倒序排列(-h表示按人类可读格式排序,-r表示倒序)
• head -n 10:只显示前10行结果

大文件清理策略

按文件大小删除

对于需要保留目录结构但删除特定大小文件的情况:

查找大于500M的文件:
find /path/to/directory -type f -size +500M

查找大于1G的文件:
find /path/to/directory -type f -size +1G

删除大于500M的文件(谨慎操作):
find /path/to/directory -type f -size +500M -delete

按时间删除日志文件

对于日志文件,通常需要保留最近的日志,删除较旧的日志:

删除7天前的日志文件:
find /var/log -name “*.log” -mtime +7 -delete

删除30天前的备份文件:
find /backup -name “*.bak” -mtime +30 -delete

安全删除操作

在执行删除操作前,建议先进行测试:

先查看要删除的文件(不实际删除):
find /path/to/directory -type f -size +500M -ls

确认无误后再执行删除:
find /path/to/directory -type f -size +500M -delete

批量清理特定类型文件

清理临时文件:
find /tmp -type f -mtime +3 -delete

清理core dump文件:
find / -name “core.*” -type f -delete

清理编译产生的.o文件:
find /path/to/source -name “*.o” -type f -delete

预防措施与最佳实践

1. 定期监控

建立磁盘空间监控机制:

创建磁盘监控脚本 disk_monitor.sh:

#!/bin/bash
THRESHOLD=80
CURRENT=$(df / | grep / | awk ‘{print $5}’ | sed ‘s/%//g’)

if [ “$CURRENT” -gt “$THRESHOLD” ]; then
echo “警告:磁盘使用率已达到 ${CURRENT}%”
echo “时间:$(date)”
echo “详细信息:”
df -h
fi

将脚本添加到crontab中实现定期监控:

每5分钟检查一次磁盘使用率:
*/5 * * * * /path/to/disk_monitor.sh

2. 日志轮转配置

配置应用程序的日志轮转策略:

配置logrotate /etc/logrotate.d/application:
/var/log/application/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
/bin/kill -HUP `cat /var/run/application.pid 2> /dev/null` 2> /dev/null || true
endscript
}

3. 数据库优化

对于MongoDB等数据库:

配置MongoDB使用小文件journal:
在mongod.conf中添加:
storage:
journal:
enabled: true
commitIntervalMs: 100

4. 应用配置优化

Kafka日志清理策略:

server.properties:
log.retention.hours=168
log.retention.bytes=1073741824
log.segment.bytes=1073741824
log.cleanup.policy=delete

CDH集群日志配置:

修改Cloudera Manager配置:
在Cloudera Manager界面中设置:
1. 日志保留时间:7天
2. 日志文件大小限制:100MB
3. 启用日志压缩

高级技巧

1. 使用ncdu进行交互式磁盘分析

安装ncdu:
yum install ncdu # CentOS/RHEL
apt-get install ncdu # Ubuntu/Debian

使用ncdu分析磁盘使用情况:
ncdu /

2. 查找重复文件

使用fdupes查找重复文件:
yum install fdupes
fdupes -r /path/to/directory

删除重复文件(保留一个):
fdupes -d /path/to/directory

3. 清理包管理器缓存

CentOS/RHEL:
yum clean all
yum autoremove

Ubuntu/Debian:
apt-get clean
apt-get autoremove

Arch Linux:
pacman -Sc

4. 清理系统日志

清理journal日志:
journalctl –vacuum-time=7d
journalctl –vacuum-size=100M

清理系统日志:
find /var/log -name “*.log” -mtime +30 -delete

故障排查案例

案例1:MongoDB数据文件过大

问题描述:MongoDB数据目录占用大量空间

解决方案:

1. 检查MongoDB数据目录大小:
du -sh /var/lib/mongo

2. 清理MongoDB日志:
mongo –eval “db.runCommand({logRotate: 1})”

3. 压缩数据库:
mongo –eval “db.runCommand({compact: ‘collection_name’})”

案例2:Docker容器占用空间

问题描述:Docker容器和镜像占用大量磁盘空间

解决方案:

1. 清理停止的容器:
docker container prune

2. 清理未使用的镜像:
docker image prune -a

3. 清理未使用的卷:
docker volume prune

4. 清理网络:
docker network prune

5. 一键清理所有未使用资源:
docker system prune -a

案例3:日志文件过大

问题描述:应用程序日志文件过大导致磁盘空间不足

解决方案:

1. 查找大日志文件:
find /var/log -name “*.log” -size +100M

2. 压缩大日志文件:
gzip /var/log/large.log

3. 配置日志轮转:
logrotate -f /etc/logrotate.conf

总结

磁盘空间管理是Linux系统运维的重要技能。通过本文介绍的分层查找方法和清理策略,可以快速定位并解决磁盘空间不足的问题。同时,建立完善的监控和预防机制,能够有效避免此类问题的重复发生。

关键要点:

• 使用 df 命令快速验证磁盘状态
• 采用 du 命令分层递进式查找大文件
• 谨慎使用 find 命令进行文件删除操作
• 建立定期监控和日志轮转机制
• 根据应用特点制定相应的清理策略
• 掌握高级工具如ncdu、fdupes等提高效率

最佳实践建议:

1. 预防为主:建立监控机制,在问题发生前预警
2. 分层管理:采用分层递进的方式定位问题
3. 安全操作:删除前先测试,避免误删重要文件
4. 定期维护:制定定期清理计划,保持系统健康
5. 文档记录:记录清理过程和配置变更,便于后续维护

通过掌握这些技能和最佳实践,您将能够高效地处理Linux系统中的磁盘空间问题,确保系统稳定运行。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容