Linux服务器磁盘空间爆满排查与清理指南

本文解决的是磁盘存储空间(硬盘容量)满的问题,而非内存(RAM)问题。当服务器出现"No space left on device"错误时,请立即按此指南操作。

一、快速诊断:确认磁盘使用情况

bash
 
# 查看各分区使用情况
df -h

# 输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 50G 0K 100% /
/dev/sdb1 100G 80G 20G 80% /data

关键点:

  • 关注Use%列达到100%或接近100%的分区

  • 记下满的分区挂载点(如//data

二、定位大文件/目录(4种方法)

方法1:快速查找大目录

bash
 
# 查看根目录下各子目录大小
sudo du -h -x --max-depth=1 / | sort -h

# 针对特定目录(如/var)
sudo du -h -x --max-depth=1 /var | sort -h | tail -n 20

方法2:交互式神器ncdu(推荐)

bash
 
# 安装ncdu
sudo apt install ncdu    # Debian/Ubuntu
sudo yum install ncdu    # CentOS/RHEL

# 扫描目录
sudo ncdu /

操作提示:

  • ↑/↓:导航目录

  • Enter:进入子目录

  • d:删除选中项

  • s:按大小排序

  • q:退出

方法3:查找特定大文件

bash
 
# 查找大于500MB的文件
sudo find / -xdev -type f -size +500M -exec ls -lh {} \;

# 查找7天前的日志文件
sudo find /var/log -name "*.log" -mtime +7

方法4:按文件类型排序

bash
 
# 显示当前目录文件大小排序
ls -lhS

# 显示隐藏文件
ls -lahS

三、安全清理指南(按场景)

场景1:日志文件清理(/var/log)

bash
 
# 清空单个大日志文件(安全方式)
sudo truncate -s 0 /var/log/huge.log

# 删除7天前的压缩日志
sudo find /var/log -name "*.gz" -mtime +7 -delete

# 管理系统日志(journald)
sudo journalctl --disk-usage
sudo journalctl --vacuum-time=7d # 清理7天前日志

场景2:包管理器缓存

bash
 
# Debian/Ubuntu
sudo apt clean          # 清除所有下载包
sudo apt autoclean      # 清除旧版本包

# CentOS/RHEL
sudo yum clean all
sudo dnf clean all

# 清除snap缓存
sudo rm -rf /var/cache/snapd/

场景3:Docker磁盘清理

bash
 
# 查看Docker磁盘使用
docker system df

# 安全清理
docker system prune # 清理停止的容器/网络/镜像

# 彻底清理(谨慎!)
docker system prune -a # 清理所有未使用资源

场景4:临时文件清理

bash
 
# 系统临时目录
sudo rm -rf /tmp/*

# 用户缓存
sudo rm -rf ~/.cache/*

场景5:旧内核清理

bash
 
# Ubuntu/Debian
sudo apt purge linux-image-$(uname -r|cut -d'-' -f3)-*

# CentOS/RHEL
sudo package-cleanup --oldkernels --count=2

四、批量删除操作指南

安全删除模式(先预览)

bash
 
# 显示所有将被删除的文件
find /path/to/dir -name "*.tmp" -print

# 确认后再执行删除
find /path/to/dir -name "*.tmp" -delete

批量删除命令示例

bash
 
# 删除当前目录所有文件(非递归)
rm -f ./*

# 删除30天前的日志
find /logs -name "*.log" -mtime +30 -delete

# 删除超过100MB的文件
find /data -type f -size +100M -delete

# 使用trash-cli安全删除
sudo apt install trash-cli
trash-put large_file.zip

处理海量文件(避免参数过长)

bash
 
# 方法1:使用find的-exec
find /dir -name "*.cache" -exec rm -f {} +

# 方法2:rsync清空目录
mkdir empty_dir
rsync -a --delete empty_dir/ target_dir/
rmdir empty_dir

五、预防措施

1. 磁盘监控设置

bash
 
# 添加cron任务(每天检查)
echo "df -h | mail -s 'Disk Report' admin@example.com" | sudo tee /etc/cron.daily/disk-check
sudo chmod +x /etc/cron.daily/disk-check

2. 日志轮转配置

编辑/etc/logrotate.conf

text
 
/var/log/app.log {
    daily
    rotate 7
    compress
    size 100M
    missingok
    notifempty
}

3. Docker日志限制

创建/etc/docker/daemon.json

json
 
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}

4. 关键分区独立

  • /var/log:日志分区

  • /home:用户数据分区

  • /opt:应用安装分区

六、总结流程图

图表
 
代码
 
 
 

重要原则:

  1. 删除前备份关键数据

  2. 使用truncate替代rm处理正在写入的日志

  3. 生产环境操作前在测试环境验证

  4. 不确定的文件先移动(mv)再删除

当磁盘使用超过80%时就应开始清理,避免服务不可用。定期执行df -h检查是运维好习惯!

 
posted @ 2025-08-19 10:19  keyboard达人  阅读(240)  评论(0)    收藏  举报