一、先搞清楚磁盘被谁吃掉了
咱们平时用Linux系统,最烦的就是突然弹出来个"磁盘空间不足"的警告。这时候别急着删文件,先得像个侦探一样找出到底是谁在偷偷占用空间。我给大家介绍几个超级好用的侦查工具:
首先祭出df -h这个老伙计,它能一目了然地告诉你各个分区还剩多少空间:
df -h
# 输出示例:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 50G 47G 1.2G 98% /
# /dev/sdb1 100G 20G 80G 20% /home
看到没?根目录已经用了98%!这时候再用du -sh *深入调查具体目录:
cd /
du -sh * | sort -rh | head -n 10
# 输出示例:
# 15G var
# 12G usr
# 8.4G home
# 1.2G opt
这样就能快速定位到/var目录是罪魁祸首。如果想看更详细的子目录情况:
du -ah /var | sort -rh | head -n 20
二、清理日志文件的正确姿势
日志文件绝对是磁盘空间的隐形杀手。咱们分几种情况来处理:
- 常规日志清理
# 清理超过7天的旧日志
find /var/log -type f -name "*.log" -mtime +7 -delete
# 清空当前日志(注意服务可能需重启)
echo "" > /var/log/syslog
- 针对journal日志(systemd系统专用)
# 查看journal日志占用空间
journalctl --disk-usage
# 只保留最近500MB日志
journalctl --vacuum-size=500M
# 或者只保留最近2周的日志
journalctl --vacuum-time=2weeks
- 处理那些疯狂增长的应用程序日志
# 比如nginx日志轮转配置示例
cat /etc/logrotate.d/nginx
# 内容应该包含:
# /var/log/nginx/*.log {
# daily
# rotate 14
# missingok
# notifempty
# compress
# delaycompress
# sharedscripts
# postrotate
# /usr/bin/systemctl reload nginx
# endscript
# }
三、处理那些顽固的缓存文件
缓存文件有时候能占好几个G,但清理它们需要特别注意:
- 包管理器缓存
# 对于apt系统
apt-get clean
# 清理旧的安装包
apt-get autoremove --purge
# 对于yum系统
yum clean all
# 清理旧的kernel包
package-cleanup --oldkernels --count=2
- 应用程序缓存
# 清理Docker的垃圾
docker system prune -f
# 清理npm缓存
npm cache clean --force
# 清理pip缓存
rm -rf ~/.cache/pip
- 系统级缓存
# 清理内存缓存(不会影响运行中的程序)
sync; echo 3 > /proc/sys/vm/drop_caches
四、查找并处理大文件的技巧
有时候几个大文件就能把磁盘塞满,这里有几个找大文件的绝招:
- 快速查找大于100M的文件
find / -type f -size +100M -exec ls -lh {} \;
- 更智能的查找方式
# 查找前10大文件(排除特殊目录)
find / -path /proc -prune -o -path /sys -prune -o -type f -printf '%s %p\n' | sort -nr | head -10 | awk '{print $1/1024/1024 "MB " $2}'
- 处理常见的"大文件嫌疑人"
# 检查core dump文件
find / -name "core.*" -size +100M
# 检查旧的备份文件
find / -name "*.tar.gz" -mtime +30
# 检查邮件队列
ls -lh /var/spool/mail/
五、预防胜于治疗的维护建议
与其等磁盘满了再手忙脚乱,不如平时做好预防:
- 设置磁盘监控
# 简单的磁盘监控脚本
#!/bin/bash
THRESHOLD=90
CURRENT=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
if [ "$CURRENT" -gt "$THRESHOLD" ]; then
echo "Warning: 根分区使用率已达 ${CURRENT}%" | mail -s "磁盘警报" admin@example.com
fi
- 自动化清理任务
# 在crontab中添加定期清理任务
0 3 * * * /usr/bin/find /tmp -type f -mtime +7 -delete
0 4 * * 1 /usr/bin/apt-get autoremove -y
- 合理的分区方案
# 建议的分区方案示例:
# / 50G
# /home 100G
# /var 50G
# /tmp 10G
六、特殊场景的应对策略
有些特殊情况需要特殊处理:
- 处理已删除但未释放空间的文件
# 当df显示空间不足但du统计不出来时:
lsof | grep deleted
# 然后重启占用这些文件的进程
- 处理磁盘inode耗尽的情况
# 检查inode使用情况
df -i
# 查找小文件最多的目录
find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
- 处理Docker占用的磁盘空间
# 查看Docker磁盘使用详情
docker system df
# 彻底清理
docker system prune -a --volumes
七、终极武器:当所有方法都无效时
如果试了所有方法还是不够用,那就得考虑这些终极大招:
- 扩展磁盘空间(LVM环境下)
# 查看当前VG空间
vgs
# 扩展逻辑卷
lvextend -L +20G /dev/mapper/vg-root
# 调整文件系统大小
resize2fs /dev/mapper/vg-root
- 迁移数据到其他分区
# 比如把/var/log迁移到/home空间
mkdir /home/var_log
rsync -avz /var/log/ /home/var_log/
mount --bind /home/var_log /var/log
# 记得在/etc/fstab添加:
# /home/var_log /var/log none bind 0 0
- 最后的绝招 - 重装系统
# 备份重要数据
rsync -avz /home /backup/
rsync -avz /etc /backup/
# 然后...你知道该怎么做
应用场景与技术分析
这些清理方法适用于各种Linux环境,从个人电脑到生产服务器都适用。特别是:
- Web服务器(Nginx/Apache日志清理)
- 数据库服务器(日志和临时文件)
- 开发环境(各种缓存和依赖包)
- CI/CD服务器(构建缓存和制品)
技术优缺点: 优点:
- 大部分操作无需停机
- 使用系统自带工具,无需额外安装
- 即时见效,快速释放空间
缺点:
- 有些操作需要root权限
- 不当操作可能误删重要文件
- 临时解决方案,不能替代合理的容量规划
注意事项:
- 删除前务必确认文件重要性
- 生产环境建议先在测试环境验证
- 关键操作前做好备份
- 注意某些服务可能需要重启才能释放空间
总结
磁盘空间管理是Linux系统维护的基本功。通过本文介绍的各种方法,从快速定位问题到彻底解决方案,你应该能够应对绝大多数磁盘空间不足的情况。记住,定期维护比紧急抢救更重要,合理的分区方案和监控机制能让你事半功倍。最后提醒一句:rm -rf 很危险,操作需谨慎!
评论