磁盘空间用完会导致各种问题:数据库崩溃、网站500错误、无法SSH登录、日志无法写入等。搬瓦工入门方案通常只有20GB SSD,需要注意空间管理。本文介绍如何排查磁盘占用并释放空间。
# 查看各分区使用率
df -h
# 输出示例:
# Filesystem Size Used Avail Use% Mounted on
# /dev/vda1 20G 18G 1.1G 95% /
如果Use%超过90%,就需要立即清理。超过95%可能已经影响到正常服务运行。
# 查看根目录下各文件夹大小
du -sh /* 2>/dev/null | sort -rh | head -20
# 逐层深入,找到占用最大的目录
du -sh /var/* | sort -rh | head -10
du -sh /var/log/* | sort -rh | head -10
# 查找超过100MB的文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
# 查找超过50MB的文件并按大小排序
find / -type f -size +50M -printf '%s %p\n' 2>/dev/null | sort -rn | head -20
日志是磁盘满的最常见原因。
# 查看日志目录大小
du -sh /var/log/
# 清理systemd日志(保留最近7天)
journalctl --vacuum-time=7d
journalctl --vacuum-size=100M
# 清空大日志文件(不要删除,用truncate清空)
truncate -s 0 /var/log/syslog
truncate -s 0 /var/log/nginx/access.log
truncate -s 0 /var/log/nginx/error.log
# 删除旧的gz压缩日志
rm -f /var/log/*.gz
rm -f /var/log/nginx/*.gz
防止日志无限增长,配置logrotate:
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
# Debian/Ubuntu
apt clean # 清理apt缓存
apt autoremove -y # 删除不再需要的依赖包
dpkg -l | grep '^rc' | awk '{print $2}' | xargs dpkg --purge # 清理残留配置
# CentOS/AlmaLinux
yum clean all
dnf autoremove -y
Docker是磁盘杀手,镜像、容器和卷都会占用大量空间。
# 查看Docker占用的磁盘空间
docker system df
# 一键清理所有未使用的资源
docker system prune -a --volumes
# 分别清理
docker container prune # 删除已停止的容器
docker image prune -a # 删除未使用的镜像
docker volume prune # 删除未使用的卷
docker builder prune # 清理构建缓存
# 清理tmp目录
rm -rf /tmp/*
# 清理旧内核(Ubuntu)
dpkg -l 'linux-image-*' | grep '^ii'
apt autoremove --purge -y
# 清理用户目录下的缓存
rm -rf /root/.cache/*
rm -rf /root/.npm/_cacache/*
# 查找并删除core dump文件
find / -name "core.*" -type f -delete 2>/dev/null
有时文件已删除但进程仍在使用,空间不会释放:
# 查找被进程占用的已删除文件
lsof +L1
# 重启占用进程释放空间
systemctl restart nginx
systemctl restart mysql
systemctl restart php8.2-fpm
mysqlcheck --optimize --all-databasesTip: 如果磁盘确实不够用,可以考虑升级到更大存储的方案。更多教程请查看新手教程。