Linux 磁盘问题:磁盘空间不足与清理
当你在 Linux 服务器上部署应用、运行容器或存储数据时,磁盘空间不足是最常见的运维问题之一。磁盘满载会导致新文件无法写入、数据库服务崩溃、甚至系统完全无法启动。这篇指南将带你快速定位问题并恢复磁盘可用空间。
第一步:诊断磁盘使用现状
在清理之前,首先要弄清楚磁盘的整体使用情况和哪些目录占用了空间。
查看整体磁盘使用量
运行以下命令查看所有挂载点:
df -h
输出会以易读格式(如 G、M)显示每个磁盘分区的总容量、已用空间、可用空间和使用率。重点关注 Use% 列——当某分区使用率超过 80% 时,你就需要警惕了。
如果 / 根分区使用率接近 100%,系统很快会陷入无法工作的状态。
定位占用空间最大的目录
使用 du 命令找出具体是哪些目录在消耗空间。执行:
du -sh /* 2>/dev/null | sort -hr
这个命令会显示根目录下每个一级子目录的占用总量,并按从大到小排序。2>/dev/null 用于忽略那些因权限问题无法访问的目录(输出可能为空或报错,但不影响整体结果)。
如果 /var 或 /home 占用最大,继续深入:
du -sh /var/* 2>/dev/null | sort -hr
重复这个过程,直到锁定占用空间最大的具体文件夹或文件。
第二步:识别并清理常见占用源
Linux 系统中有几类文件特别容易持续消耗磁盘空间,找到它们并清理是最有效的解决方式。
日志文件
日志是磁盘空间的第一大杀手,尤其是应用日志和系统日志。
查找大型日志文件(大小超过 100MB):
find /var -type f -size +100M 2>/dev/null
对于常见的日志目录,你可以执行以下清理操作:
| 目录 | 用途 | 清理命令 |
|---|---|---|
/var/log |
系统和应用日志 | sudo truncate -s 0 /var/log/*.log 或 sudo find /var/log -type f -name "*.log" -delete |
/var/log/journal |
systemd 日志 | sudo journalctl --vacuum-time=7d(保留最近7天) |
/var/log/nginx 或 /var/log/apache2 |
Web 服务器日志 | sudo truncate -s 0 /var/log/nginx/*.log |
注意:在清理前,确保日志已轮转或服务已重启,否则日志可能继续被写入。如果你使用 logrotate 工具,运行 sudo logrotate -f /etc/logrotate.conf 强制执行一次日志轮转。
临时文件
系统运行时会产生大量临时文件,虽然它们通常在重启后自动清理,但长期运行的系统会积累很多。
查看临时目录大小:
du -sh /tmp /var/tmp 2>/dev/null
清理 /tmp 中修改时间超过 7 天的文件(这是相对安全的做法,不会影响当前运行的进程):
sudo find /tmp -type f -mtime +7 -delete
sudo find /var/tmp -type f -mtime +7 -delete
软件包缓存
使用包管理器(apt、yum/dnf)安装软件时,下载的 .deb 或 .rpm 安装包会缓存在本地。
对于 Debian/Ubuntu 系统:
sudo apt clean
sudo apt autoremove
apt clean 删除所有缓存的包文件;apt autoremove 删除不再需要的依赖包。
对于 RHEL/CentOS/Fedora 系统:
sudo dnf clean all
# 或者
sudo yum clean all
容器镜像与 Docker 数据
如果你使用 Docker,镜像、容器层和未使用的网络/卷会占用大量空间。
查看 Docker 整体占用:
docker system df
这会显示镜像、容器、数据卷和构建缓存各自的占用量。
执行全面清理:
docker system prune -a
-a 参数会删除所有未被使用的镜像(不仅仅是 dangling 镜像)。如果需要强制删除所有未运行容器和未使用网络:
docker system prune -a -f
第三步:处理大文件和用户数据
除了系统文件,用户数据和应用程序生成的文件也常常是磁盘空间耗尽的原因。
查找最大的文件
运行以下命令找出系统中最大的前 20 个文件:
find / -type f -exec du -h {} + 2>/dev/null | sort -hr | head -n 20
这会从根目录开始扫描,列出占用空间最多的文件路径和大小。常见的大型文件包括:数据库文件(.sql、.db)、视频/音频文件、备份文件(.tar.gz、.bak)等。
确认文件是否仍然需要,如果不需要,使用 rm 命令删除:
sudo rm /path/to/large/file
如果文件被某个进程锁定(通过 lsof | grep deleted 可以看到),你需要重启该服务或杀死对应进程后才能释放空间。
清理旧的备份文件
很多系统会定期自动备份,积少成多后会占用大量空间。
假设你的备份存放在 /backup 目录,执行以下命令删除 30 天前的备份:
sudo find /backup -type f -mtime +30 -delete
清理邮件队列(如果适用)
邮件服务器(如 Postfix、Exim)的队列如果积压,也会占用磁盘空间。
查看队列大小(以 Postfix 为例):
sudo postqueue -p | tail -n 1
清空所有待发送的邮件(这是破坏性操作,仅在紧急情况下使用):
sudo postsuper -d ALL
第四步:扩展磁盘容量(如果清理不够)
如果经过清理后空间仍然紧张,或者你需要长期解决方案,可以考虑扩展磁盘容量。
云服务器扩展
如果你使用云服务(AWS EC2、阿里云、腾讯云等),可以在不重启的情况下在线扩展磁盘。
- 在云控制台扩展云盘容量(通常是扩容操作)。
- 在 Linux 系统内执行:
# 查看磁盘设备名
lsblk
# 如果是 GPT 分区,使用 growpart 扩展分区
sudo growpart /dev/sda 1
# 扩展文件系统
sudo resize2fs /dev/sda1 # 对于 ext4 文件系统
# 或者
sudo xfs_growfs / # 对于 XFS 文件系统
添加新磁盘
如果无法扩展现有磁盘,可以添加一块新磁盘并挂载到特定目录。
# 分区
sudo fdisk /dev/sdb
# 输入 n 创建新分区,一路回车使用默认设置,最后输入 w 写入
# 格式化
sudo mkfs.ext4 /dev/sdb1
# 挂载(例如挂载到 /data)
sudo mount /dev/sdb1 /data
最后,编辑 /etc/fstab 确保重启后自动挂载:
echo "/dev/sdb1 /data ext4 defaults 0 0" | sudo tee -a /etc/fstab
第五步:建立监控与预防机制
磁盘问题总是突然出现,建立监控可以在问题恶化前及时发现。
设置磁盘使用率告警
创建一个简单的 cron 任务,在磁盘使用率超过 90% 时发送告警邮件。首先安装 mail 工具:
sudo apt install mailutils # Debian/Ubuntu
编辑 crontab:
sudo crontab -e
添加以下行(每天早上 8 点检查):
0 8 * * * df -h | awk '{if (NR>1 && $5 ~ /%/) {gsub("%","",$5); if ($5 > 90) print "Disk usage: "$5"%" | "mail -s 'Disk Alert' admin@example.com"}}'
配置 logrotate 自动管理日志
大多数发行版已默认启用 logrotate,但你可以检查并优化其配置:
sudo cat /etc/logrotate.conf
sudo ls /etc/logrotate.d/
确保关键日志(如 Nginx、MySQL、应用程序日志)都有合理的轮转策略,例如按大小触发或按时间保留。
总结
处理 Linux 磁盘空间不足的问题,核心思路是「先定位、再清理、后预防」。通过 df -h 和 du 命令快速找到空间占用大户,针对日志、缓存、临时文件和大文件进行清理。对于长期运行的系统,设置监控告警和日志轮转策略,才能避免问题反复发生。

暂无评论,快来抢沙发吧!