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
十三、生产服务器注意事项
- 先定位,再删除,不建议看到大文件就直接
rm。 - Docker Volume、数据库文件、上传目录等必须确认用途后再清理。
- 日志异常增长时,清理日志只是治标,应继续查对应服务为什么大量输出。
- 避免直接删除正在写入的日志文件,否则可能出现“文件已删除但空间仍未释放”。
- 大量删除小文件时注意 inode 和磁盘 IO,避免高峰期操作。
- 清理完成后配置:
journald大小限制- Docker 日志轮转
logrotate- 磁盘使用率监控告警
- 建议设置磁盘告警阈值,例如:
- 70%:提醒
- 80%:警告
- 90%:严重告警

浙公网安备 33010602011771号