文章目录

Linux 磁盘问题:磁盘空间不足与清理

发布于 2026-04-05 11:45:32 · 浏览 31 次 · 评论 0 条

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/*.logsudo 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、阿里云、腾讯云等),可以在不重启的情况下在线扩展磁盘。

  1. 在云控制台扩展云盘容量(通常是扩容操作)。
  2. 在 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 -hdu 命令快速找到空间占用大户,针对日志、缓存、临时文件和大文件进行清理。对于长期运行的系统,设置监控告警和日志轮转策略,才能避免问题反复发生。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文