Loading

AIGC标识 Linux 服务器磁盘空间不足排查与清理命令

Linux 服务器磁盘空间不足排查与清理命令

一、检查磁盘整体情况

1. 查看磁盘分区使用率

df -h

重点关注 Use% 接近或达到 100% 的分区。

指定查看根分区:

df -h /

2. 检查 inode 是否耗尽

df -i

如果磁盘容量还有剩余,但 IUse% 达到 100%,通常是存在大量小文件。


二、定位磁盘占用位置

1. 查看一级目录大小

例如根分区 / 满了:

sudo du -x -h --max-depth=1 / | sort -h

发现 /var 较大后继续:

sudo du -x -h --max-depth=1 /var | sort -h

逐级向下排查:

sudo du -x -h --max-depth=1 /var/lib | sort -h

常见重点目录:

/var/log
/var/lib/docker
/var/cache
/tmp
/var/tmp
/home

2. 查找超大文件

查找当前分区中大于 1GB 的文件:

sudo find / -xdev -type f -size +1G -print

查看当前目录各文件/目录大小:

du -sh * | sort -h

查看最大的内容:

du -sh * | sort -hr | head -20

3. 查找“已删除但仍占用磁盘”的文件

sudo lsof +L1

典型情况:

  • 日志文件已经删除
  • 但 Java、MySQL、Nginx、Docker 等进程仍持有文件句柄
  • df -h 显示空间没有释放
  • du 又找不到对应文件

优先重启对应服务:

sudo systemctl restart 服务名

如果明确知道对应文件描述符,也可以针对性处理,但生产环境建议优先重启对应进程释放文件句柄。


三、常见目录清理

1. 系统日志

查看日志目录:

sudo du -sh /var/log/*

重点关注:

/var/log/messages
/var/log/secure
/var/log/syslog
/var/log/journal

如果某个日志异常增长,应先定位产生日志的服务,并降低或关闭不必要的 Debug 日志。


四、清理 systemd journal 日志

1. 查看 journal 当前占用

sudo journalctl --disk-usage

2. 将 journal 日志压缩到 300MB

sudo journalctl --vacuum-size=300M

也可以按时间清理,例如只保留最近 7 天:

sudo journalctl --vacuum-time=7d

3. 永久限制 journal 大小

编辑:

sudo vim /etc/systemd/journald.conf

配置:

SystemMaxUse=300M
SystemMaxFileSize=100M
MaxRetentionSec=7day

配置说明:

SystemMaxUse       journal 日志总大小上限
SystemMaxFileSize  单个 journal 文件最大大小
MaxRetentionSec    最大日志保留时间

修改后重启:

sudo systemctl restart systemd-journald

确认:

sudo journalctl --disk-usage

五、Docker 磁盘清理

1. 查看 Docker 磁盘占用

docker system df

详细查看:

docker system df -v

2. 查看 Docker 目录大小

sudo du -h --max-depth=1 /var/lib/docker | sort -h

3. 清理无用 Docker 数据

清理停止的容器

docker container prune

清理无用镜像

docker image prune -a

清理无用网络

docker network prune

清理未使用 Volume

docker volume prune

Volume 可能包含数据库、上传文件等重要数据,生产服务器执行前必须确认。


4. 一次性清理无用 Docker 数据

docker system prune -af

该命令会删除:

  • 已停止容器
  • 未使用网络
  • 未使用镜像
  • Build Cache

默认不会删除未使用 Volume。

如果确认 Volume 也可以删除:

docker system prune -af --volumes

生产环境谨慎使用 --volumes。


六、限制 Docker 容器日志大小

Docker 默认的 json-file 日志如果没有限制,可能持续增长。

查看容器日志大小:

sudo du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null | sort -h

配置 Docker 日志轮转

创建或修改:

sudo tee /etc/docker/daemon.json <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}
EOF

含义:

max-size = 100m    单个日志最大 100MB
max-file = 3       最多保留 3 个日志文件

然后重启 Docker:

sudo systemctl restart docker

注意:修改 daemon.json 后,通常主要影响之后新建的容器。已有容器建议重新创建后确认日志配置生效。

查看容器日志配置:

docker inspect 容器名 --format='{{json .HostConfig.LogConfig}}'

七、系统日志 logrotate 配置

1. 检查现有日志轮转配置

grep -r "messages" /etc/logrotate.conf /etc/logrotate.d/

也可以查看:

ls -lh /etc/logrotate.d/

2. 创建 syslog 日志轮转规则

创建:

sudo tee /etc/logrotate.d/syslog <<'EOF'
/var/log/messages
/var/log/secure
/var/log/maillog
/var/log/spooler
/var/log/boot.log
/var/log/cron
{
    rotate 5
    size 500M
    compress
    missingok
    notifempty
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
EOF

配置含义:

rotate 5     保留 5 个历史日志
size 500M    日志达到 500MB 时进行轮转
compress     历史日志进行 gzip 压缩
missingok    日志不存在时不报错
notifempty   空日志不轮转

不同 Linux 发行版可能使用 rsyslog、syslog-ng 等服务,postrotate 的处理方式可能不同。修改前建议先检查系统已有的 /etc/logrotate.d/rsyslog 或 /etc/logrotate.d/syslog 配置,避免重复配置。


3. 测试 logrotate

只测试,不实际轮转:

sudo logrotate -d /etc/logrotate.d/syslog

确认没有问题后强制执行:

sudo logrotate -vf /etc/logrotate.d/syslog

八、清理系统缓存

Ubuntu / Debian

查看:

sudo du -sh /var/cache/*

清理 apt 缓存:

sudo apt clean

自动清理无用依赖:

sudo apt autoremove

CentOS / RHEL

sudo yum clean all

新版本:

sudo dnf clean all

九、临时文件

检查:

sudo du -sh /tmp
sudo du -sh /var/tmp

查看具体内容:

sudo du -sh /tmp/* 2>/dev/null | sort -h
sudo du -sh /var/tmp/* 2>/dev/null | sort -h

生产环境不要直接:

rm -rf /tmp/*

应先确认文件没有被正在运行的程序使用。


十、inode 爆满排查

如果:

df -h

空间正常,但:

df -i

显示:

IUse% 100%

说明存在大量小文件。

可以统计一级目录文件数量:

for i in /*; do
    echo "$(sudo find "$i" -xdev 2>/dev/null | wc -l) $i"
done | sort -n

常见原因:

大量 session 文件
大量缓存文件
大量临时文件
大量构建输出
大量小日志
程序异常产生百万级文件

找到来源后再针对性清理。


十一、推荐排查顺序

服务器磁盘告警时,建议按下面顺序执行:

# 1. 看磁盘
df -h

# 2. 看 inode
df -i

# 3. 找最大的一级目录
sudo du -x -h --max-depth=1 / | sort -h

# 4. 继续逐级排查,例如
sudo du -x -h --max-depth=1 /var | sort -h

# 5. 找大文件
sudo find / -xdev -type f -size +1G -print

# 6. 检查已删除但仍占空间的文件
sudo lsof +L1

# 7. 检查日志
sudo du -sh /var/log/*
sudo journalctl --disk-usage

# 8. 检查 Docker
docker system df
sudo du -h --max-depth=1 /var/lib/docker | sort -h

# 9. 清理后重新确认
df -h
df -i

十二、常用快速清理命令汇总

Journal 日志

sudo journalctl --vacuum-size=300M

Docker

docker system df
docker system prune -af

Ubuntu apt 缓存

sudo apt clean
sudo apt autoremove

CentOS yum 缓存

sudo yum clean all

查找大文件

sudo find / -xdev -type f -size +1G -print

查找已删除但仍占空间的文件

sudo lsof +L1

查看根目录占用

sudo du -x -h --max-depth=1 / | sort -h

最终确认

df -h
df -i

十三、生产服务器注意事项

  1. 先定位,再删除,不建议看到大文件就直接 rm。
  2. Docker Volume、数据库文件、上传目录等必须确认用途后再清理。
  3. 日志异常增长时,清理日志只是治标,应继续查对应服务为什么大量输出。
  4. 避免直接删除正在写入的日志文件,否则可能出现“文件已删除但空间仍未释放”。
  5. 大量删除小文件时注意 inode 和磁盘 IO,避免高峰期操作。
  6. 清理完成后配置:
    • journald 大小限制
    • Docker 日志轮转
    • logrotate
    • 磁盘使用率监控告警
  7. 建议设置磁盘告警阈值,例如:
    • 70%:提醒
    • 80%:警告
    • 90%:严重告警
posted @ 2026-08-31 10:18  多久会在  阅读(37)  评论(0)    收藏  举报