服务器磁盘空间不足怎么办?Linux清理与扩容完整指南 | 后浪云

服务器磁盘空间不足怎么办?Linux 磁盘清理与扩容完整操作指南

磁盘空间耗尽是服务器运维中最常见的紧急故障之一。一旦根分区使用率达到 100%,网站日志无法写入、数据库事务失败、程序报错甚至直接崩溃,影响面极广。本文从快速排查到彻底解决,提供一套完整的 Linux 磁盘空间管理方案。


一、第一步:快速确认磁盘现状

# 查看所有分区磁盘使用情况
df -h

# 典型输出示例:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   47G  1.5G  97% /          ← 根分区 97%,需立即处理
# tmpfs           2.0G     0  2.0G   0% /dev/shm

当根分区(/)使用率超过 85% 时需要开始关注;超过 95% 时属于紧急情况,需要立即处理。

同时检查 inode 使用情况(inode 耗尽同样会导致无法创建新文件):

df -i
# IUse% 列如果接近 100%,即使磁盘空间还有剩余也无法创建文件

二、第二步:定位占用空间最多的目录

从根目录开始,逐层排查

# 查看一级目录的磁盘占用(排序显示)
sudo du -sh /* 2>/dev/null | sort -rh | head -20

通常嫌疑最大的目录是 /var(日志)、/home(用户文件)、/tmp(临时文件)。

# 深入排查 /var 目录
sudo du -sh /var/* 2>/dev/null | sort -rh | head -10

# 继续深入排查 /var/log
sudo du -sh /var/log/* 2>/dev/null | sort -rh | head -10

直接找出全盘最大的文件

# 找出超过 100MB 的文件
sudo find / -type f -size +100M 2>/dev/null | xargs ls -lh | sort -k5 -rh | head -20

# 找出超过 1GB 的文件
sudo find / -type f -size +1G 2>/dev/null -exec ls -lh {} \;

三、第三步:清理常见的磁盘空间杀手

1. 清理系统日志(最常见的罪魁祸首)

# 查看 journald 系统日志占用
journalctl --disk-usage

# 清理7天以前的日志
sudo journalctl --vacuum-time=7d

# 或者按大小限制,只保留最近 500MB
sudo journalctl --vacuum-size=500M
# 清理 /var/log 下的压缩旧日志
sudo find /var/log -name "*.gz" -delete
sudo find /var/log -name "*.1" -delete

# 清空(不删除)当前活跃日志文件(直接 rm 会导致进程继续写入旧 fd)
sudo truncate -s 0 /var/log/nginx/access.log
sudo truncate -s 0 /var/log/nginx/error.log

2. 清理 APT 包缓存

# 查看 apt 缓存大小
du -sh /var/cache/apt/

# 清理已下载的安装包缓存
sudo apt clean

# 清理孤立的依赖包
sudo apt autoremove -y

3. 清理 Docker 占用(如果有使用 Docker)

# 查看 Docker 磁盘占用明细
docker system df

# 清理所有未使用的镜像、容器、网络、构建缓存
docker system prune -a

# 只清理悬空镜像(更保守)
docker image prune

Docker 是磁盘空间消耗的大户,每次构建镜像都会留下中间层缓存,长期不清理可能累积数十 GB。

4. 清理 /tmp 临时文件

# 查看 /tmp 大小
du -sh /tmp

# 清理超过7天未访问的临时文件
sudo find /tmp -atime +7 -delete 2>/dev/null
sudo find /var/tmp -atime +30 -delete 2>/dev/null

5. 清理 PHP Session 文件(WordPress / PHP 应用)

# PHP session 文件默认存放位置
ls -la /var/lib/php/sessions/ | wc -l   # 查看 session 文件数量

# 清理超过24小时的 session 文件
sudo find /var/lib/php/sessions -type f -mtime +1 -delete

6. 清理 MySQL 二进制日志

# 在 MySQL 中查看二进制日志文件
SHOW BINARY LOGS;

# 删除7天前的二进制日志(谨慎:影响主从复制)
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

四、第四步:配置日志轮转,从根源防止磁盘爆满

清理是治标,配置日志自动轮转才是治本。

配置 logrotate(Linux 内置日志轮转工具)

sudo nano /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily           # 每天轮转
    missingok       # 日志文件不存在时不报错
    rotate 14       # 保留最近14天的日志
    compress        # 压缩旧日志(gzip)
    delaycompress   # 最近一次的旧日志不压缩(便于排查)
    notifempty      # 日志为空时不轮转
    sharedscripts
    postrotate
        nginx -s reopen   # 轮转后让 Nginx 重新打开日志文件
    endscript
}
# 测试配置是否正确
sudo logrotate -d /etc/logrotate.d/nginx

# 手动执行一次轮转(测试效果)
sudo logrotate -f /etc/logrotate.d/nginx

限制 journald 系统日志大小

sudo nano /etc/systemd/journald.conf

# 找到并修改以下参数
SystemMaxUse=1G          # 系统日志最大占用 1GB
SystemKeepFree=2G        # 保持磁盘至少剩余 2GB
MaxRetentionSec=30day    # 最多保留30天日志
sudo systemctl restart systemd-journald

五、第五步:磁盘扩容方案

如果清理后空间仍然不够,或者业务增长导致长期空间不足,就需要扩容。

方案一:在控制面板扩大磁盘(云服务器)

大多数云服务器(包括后浪云)支持在线扩大磁盘容量:

  1. 登录后浪云控制台,找到对应的云服务器实例
  2. 选择"扩容磁盘",选择新的磁盘大小并确认付款
  3. 登录服务器执行以下命令,将扩容后的空间分配给文件系统
# 查看磁盘和分区情况
lsblk

# 扩展分区(以 /dev/sda1 为例)
sudo growpart /dev/sda 1

# 扩展文件系统(ext4)
sudo resize2fs /dev/sda1

# 扩展文件系统(xfs)
sudo xfs_growfs /
# 验证扩容结果
df -h /

整个操作过程无需重启服务器,通常 1~2 分钟即可完成。

方案二:挂载额外数据盘

如果只是特定目录(如 /var/www/var/lib/mysql)需要更多空间,可以购买额外数据盘并挂载到对应目录:

# 查看新数据盘设备名(通常是 /dev/sdb)
lsblk

# 格式化新磁盘
sudo mkfs.ext4 /dev/sdb

# 创建挂载点并挂载
sudo mkdir -p /data
sudo mount /dev/sdb /data

# 设置开机自动挂载(写入 fstab)
echo "/dev/sdb /data ext4 defaults 0 2" | sudo tee -a /etc/fstab

六、磁盘空间监控告警

与其等磁盘满了才处理,不如提前设置告警:

# 创建磁盘监控脚本
sudo nano /usr/local/bin/disk_alert.sh
#!/bin/bash
THRESHOLD=85    # 告警阈值(85%)
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')

if [ "$DISK_USAGE" -gt "$THRESHOLD" ]; then
    echo "⚠️ 磁盘告警:$(hostname) 根分区使用率已达 ${DISK_USAGE}%,请尽快处理!" \
    | mail -s "磁盘空间告警" your@email.com
fi
sudo chmod +x /usr/local/bin/disk_alert.sh

# 添加到 crontab,每小时检查一次
(crontab -l; echo "0 * * * * /usr/local/bin/disk_alert.sh") | crontab -

总结:磁盘空间管理三原则

  1. 🔍 定位优先:用 du -sh 逐层排查,找到真正的占用大户再清理
  2. 🔄 预防为主:配置好 logrotate 和 journald 大小限制,避免日志无限增长
  3. 📊 监控告警:设置磁盘使用率告警,在达到临界点之前就收到通知

如果你的业务持续增长导致磁盘长期紧张,后浪云香港云服务器支持在线升级磁盘容量,操作简便,无需停机迁移,欢迎登录控制台直接扩容。

THE END