操作流程
du -sh /* #查看目录的空间占用 cd /var/log #进入对应目录 du -sh * #查看进入的目录中的空间占用 echo > lordoc.com-access_log #找到了大的日志文件写入空字符
#全盘查找所有大于 1GB 的普通文件 find / -type f -size +1G 2>/dev/null #找出根目录下占用磁盘最大的前 10 个一级目录,从大到小排序 sudo du -sh /* 2>/dev/null | sort -rh | head -n 10
df命令(disk free的缩写)
文件系统层面统计
站在**文件系统分区**视角,看整块盘还有多少空间。
| 参数 | 说明 | 描述 |
|---|---|---|
-a, --all |
显示所有文件系统 | 包括容量为0的文件系统(如tmpfs) |
-h, --human-readable |
以人类可读格式显示 | 使用KB、MB、GB等单位自动转换 |
-H, --si |
以1000为单位显示 | 与-h类似,但使用1000进制(而非1024) |
-k, --block-size=1K |
以1KB为单位显示 | 强制以1024字节为单位 |
-m, --block-size=1M |
以1MB为单位显示 | 强制以1048576字节为单位 |
-P, --portability |
使用POSIX输出格式 | 保证输出在不同系统间兼容 |
-l, --local |
仅显示本地文件系统 | 排除网络文件系统(如NFS) |
-i, --inodes |
显示inode信息 | 显示inode使用情况而非磁盘空间 |
-T, --print-type |
显示文件系统类型 | 添加文件系统类型列 |
-t type, --type=type |
仅显示指定类型的文件系统 | 例如:-t ext4 仅显示ext4文件系统 |
-x type, --exclude-type=type |
排除指定类型的文件系统 | 例如:-x tmpfs 排除tmpfs文件系统 |
--total |
汇总所有文件系统 | 在末尾添加一行总计信息 |
-B size, --block-size=size |
指定块大小 | 例如:-B 1M 表示以1MB为单位 |
-v, --verbose |
显示详细信息 | 显示每个文件系统的详细挂载信息 |
--help |
显示帮助信息 | 显示命令的使用说明 |
--version |
显示版本信息 | 显示df命令的版本号 |
-j, --block-size=1G |
以1GB为单位显示 | 强制以1073741824字节为单位 |
--output[=field,...] |
自定义输出字段 | 可选字段:source, fstype, size, used, avail, pcent, target |
先看整体使用率:df -h,确认哪个挂载点满了;

再用 df -i 看 inode 是否耗尽(inode 满了会出现“空间没满但写不进文件”)。
du命令(disk usage的缩写)
实际占用磁盘
站在**文件 & 目录**视角,看哪些文件吃掉磁盘。
| 参数 | 全称 | 作用 |
|---|---|---|
-s
|
--summarize
|
只输出总计,不递归打印子文件,最常用。不加 – s 会把每一个子目录全部打印出来,刷屏。 |
-h
|
--human-readable
|
人性化单位 K/M/G,人可读,必用。 |
-a
|
--all
|
不仅统计目录,把所有普通文件也一并输出。 |
-c
|
--total
|
在最后增加一行全部总和。 |
-d N
|
--max-depth=N
|
限制递归深度,-d 1只看一级子目录,等价于du -sh ./*
|
-x
|
--one-file-system
|
只统计当前文件系统,跳过挂载点(非常关键!避免统计 docker overlay、tmpfs、snap loop 设备) |
--exclude=PATTERN
|
排除匹配的文件 / 目录,例如--exclude="*.log"
|
云盘满了不用慌,按“先诊断、再清理、最后扩容”的顺序处理就行。
🔍 第一步:定位占用源
先看整体使用率:df -h,确认哪个挂载点满了;再用 df -i 看 inode 是否耗尽(inode 满了会出现“空间没满但写不进文件”)。
找出最大的目录:sudo du -sh /* | sort -rh,逐级下钻定位大文件。
重点排查这几个“惯犯”:
日志文件(/var/log):最常见元凶,比如 Nginx access.log、MySQL slow log、systemd journal。
Docker 残留(/var/lib/docker):镜像、停止的容器、构建缓存会占大量空间,用 docker system df 查看。
已删除但未释放的文件:df 显示满但 du 查不出大目录,说明有进程占用已删除文件,用 lsof +L1 | grep deleted 找出,重启对应进程即可释放。
🧹 第二步:安全清理
日志:systemd journal 用 journalctl –vacuum-size=200M 限制大小;大日志文件用 > /var/log/messages 清空(比 rm 安全,因为进程可能还在写)。
软件包缓存:yum clean all(CentOS)或 apt-get clean(Ubuntu),往往能释放几百 MB 到几 GB。
Docker:先执行 docker system prune -a(清理无用镜像和容器);不要加 –volumes 参数,那会删掉数据卷里的业务数据。
临时文件:/tmp 下超过 7 天未访问的文件可以清掉,但注意别删正在使用的文件。
📈 第三步:扩容云盘(治本)
如果清理完还是不够,直接扩容,注意控制台操作完并不等于扩容结束:
先在控制台扩容:ECS 控制台 → 块存储 → 云盘 → 目标云盘 → 扩容,选择新容量并支付。强烈建议先创建快照,避免操作失误导致数据丢失。
再到系统里激活新空间(这步最容易漏):
查看分区:lsblk,确认磁盘容量已变大但分区没变。
扩展分区:growpart /dev/vda 1(注意是“磁盘名 分区号”,不是 /dev/vda1)。
扩展文件系统:ext4 用 resize2fs /dev/vda1;XFS 用 xfs_growfs /(XFS 后面跟挂载点,不是设备名)。
验证:df -h 看到容量变大了就完成了。
⚠️ 长期预防
配置 logrotate 自动轮转日志,保留最近 7 天并压缩。
在云监控里设置磁盘使用率报警,建议 75% 提醒、85% 紧急,别等到满了再处理。
静态资源和归档日志可以迁移到 OSS,不占系统盘空间。
扩容时如果遇到报错,比如 growpart: command not found,先装工具:CentOS 执行 yum install -y cloud-utils-growpart,Ubuntu 执行 apt-get install -y cloud-guest-utils。
