linux centos 磁盘异常占用满了排查和解决

4. 使用交互式工具ncdu(推荐)

安装后扫描更直观(支持排除/home):

bash

sudo apt install ncdu  # Debian/Ubuntusudo yum install ncdu  # CentOS/RHEL

扫描命令:

bash

sudo ncdu --exclude /home /
  • 操作方式

    • 方向键导航,Enter进入子目录。
    • d​删除文件(谨慎使用),g显示大小百分比。

系统层

  1. 首先查看磁盘使用情况:
# 查看磁盘分区使用情况
df -h

# 查看具体目录大小
du -sh /*
  1. 查找大文件:
# 查找大于100M的文件
find / -type f -size +100M -exec ls -lh {} \;

# 按大小排序显示前10个最大的文件
find / -type f -exec du -Sh {} + | sort -rh | head -n 10
  1. 检查日志文件:
# 查看/var/log目录大小
du -sh /var/log/*

# 清理旧日志
sudo find /var/log -type f -name "*.log.*" -delete
sudo find /var/log -type f -name "*.gz" -delete

# 清空大日志文件(不删除文件本身)
sudo truncate -s 0 /var/log/large_log_file.log
  1. 清理软件包缓存:
# 清理yum缓存
sudo yum clean all

# 删除旧的软件包
sudo package-cleanup --oldkernels --count=2
  1. 检查并清理临时文件:
# 查看/tmp目录大小
du -sh /tmp

# 清理临时文件
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*
  1. 检查Docker(如果安装了):
# 查看Docker使用空间
docker system df

# 清理未使用的Docker资源
docker system prune -a

# 清理Docker日志
sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'
  1. 检查用户目录:
# 查看home目录下各用户空间占用
du -sh /home/*

# 查找用户目录下的大文件
find /home -type f -size +100M -exec ls -lh {} \;
  1. 清理系统旧文件:
# 清理旧的core文件
find / -name core -type f -delete

# 清理0字节文件
find / -size 0 -type f -delete
  1. 检查并清理邮件队列(如果有邮件服务):
# 查看邮件队列目录大小
du -sh /var/spool/mail/
du -sh /var/spool/postfix/
  1. 检查数据库文件(如果有):
# MySQL数据目录
du -sh /var/lib/mysql/*

# PostgreSQL数据目录
du -sh /var/lib/pgsql/*

清理后:

# 再次检查磁盘使用情况
df -h

# 如果还需要进一步分析
ncdu -x /

docker层

  1. 首先查看 Docker 系统占用情况:
# 查看 Docker 磁盘使用详情
docker system df -v

# 查看具体目录占用
du -sh /var/lib/docker/*
  1. 清理未使用的 Docker 资源:
# 清理所有未使用的容器、网络、镜像(包括未被任何容器使用的镜像)和构建缓存
docker system prune -a --volumes

# 仅清理悬空镜像(dangling images)
docker image prune

# 清理未使用的数据卷
docker volume prune

# 清理未使用的网络
docker network prune
  1. 清理 Docker 日志文件:
# 查找大的日志文件
find /var/lib/docker/containers/ -type f -name "*.log" -exec ls -lh {} \;

# 清空所有容器的日志文件
sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'

# 或者使用循环清理
for i in $(docker ps -q); do echo "Cleaning logs for $i..."; truncate -s 0 $(docker inspect --format='{{.LogPath}}' $i); done
  1. 限制容器日志大小:
# 修改 Docker 守护进程配置
sudo vim /etc/docker/daemon.json

# 添加以下内容
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

# 重启 Docker 服务
sudo systemctl restart docker
  1. 删除指定时间之前的资源:
# 删除24小时前已停止的容器
docker container prune --filter "until=24h"

# 删除24小时前的镜像
docker image prune -a --filter "until=24h"
  1. 手动删除特定资源:
# 停止所有运行的容器
docker stop $(docker ps -aq)

# 删除所有已停止的容器
docker rm $(docker ps -aq -f status=exited)

# 删除所有未使用的镜像
docker rmi $(docker images -q -f dangling=true)
  1. 清理构建缓存:
# 清理构建缓存
docker builder prune -a

# 或者指定时间
docker builder prune --filter until=24h
  1. 查看并删除大文件:
# 查找 Docker 目录下的大文件
find /var/lib/docker -type f -size +100M -exec ls -lh {} \;

# 检查overlay2目录(通常占用最大)
du -sh /var/lib/docker/overlay2/*
  1. 迁移 Docker 根目录(如果根分区空间不足):
# 停止 Docker 服务
sudo systemctl stop docker

# 创建新目录
sudo mkdir /data/docker

# 编辑 Docker 配置
sudo vim /etc/docker/daemon.json
{
  "data-root": "/data/docker"
}

# 复制现有 Docker 目录
sudo rsync -avz /var/lib/docker/ /data/docker

# 重启 Docker 服务
sudo systemctl restart docker
  1. 设置自动清理:
# 创建定时清理脚本
cat > /etc/cron.daily/docker-cleanup << 'EOF'
#!/bin/bash
docker system prune -af --volumes
find /var/lib/docker/containers/ -type f -name "*.log" -exec truncate -s 0 {} \;
EOF

# 添加执行权限
chmod +x /etc/cron.daily/docker-cleanup