Linux 云服务器运行一段时间后,可能出现文件上传失败、网站报错、数据库无法写入,或者提示 No space left on device 的情况。
磁盘空间不足不一定是网站文件太多,也可能与日志持续增长、备份堆积、Docker 数据占用或 inode 耗尽有关。
建议先确认哪个文件系统空间不足,再定位具体目录和文件,最后根据数据用途进行清理或扩容。
本文以常见 Linux 服务器为例。命令建议使用 root 用户执行;普通用户可根据需要添加 sudo。示例路径、容器名称和数据库信息均需按实际环境修改。
一、查看哪个文件系统空间不足

首先执行:
df -hT
该命令可以查看已挂载文件系统的类型、总容量、已用空间和可用空间。
重点关注以下字段:
| 字段 | 含义 |
|---|---|
| Filesystem | 文件系统对应的设备或来源 |
| Type | 文件系统类型,如 ext4、xfs |
| Size | 总容量 |
| Used | 已使用空间 |
| Avail | 可用空间 |
| Use% | 空间使用率 |
| Mounted on | 挂载位置 |
如果 / 对应的文件系统接近或达到 100%,说明根文件系统空间紧张;如果 /data 对应的文件系统已满,则需要优先检查 /data 中的数据。
也可以查看某个目录所在文件系统的容量:
df -hT /var
不同挂载点的空间通常不能直接互相使用。 例如,/data 还有大量剩余空间,并不代表存放在根文件系统中的 /var 能继续写入。df 查看的是文件系统整体使用情况。
二、还有剩余容量,为什么仍提示空间不足?
除了容量,还需要检查 inode:
df -i
inode 用于保存文件的元数据信息。对于常见的 ext4 文件系统,大量小文件可能在容量尚未用完时先耗尽可用 inode。
重点查看:
-
IFree:剩余 inode 数量。 -
IUse%:inode 使用率。
如果 IUse% 达到 100%,应重点排查缓存、会话、邮件队列和临时文件目录。
支持 inode 统计的 GNU du 可以帮助定位:
du --inodes -x --max-depth=1 / | sort -n
发现某个目录占用明显较高后,继续进入下一层:
du --inodes -x --max-depth=1 /var | sort -n
如果相关数据位于独立挂载的 /data,需要单独扫描 /data。
inode 不足时,清理一个大文件通常帮助有限,重点是处理大量已经失效的小文件,并修复其持续生成的原因。
三、找出占用最大的目录

如果确认是容量不足,可以从发生问题的挂载点开始逐层排查。
例如,检查根文件系统:
du -xhd1 / | sort -h
参数含义:
-
-x:不跨越到其他文件系统。 -
-h:使用便于阅读的容量单位。 -
-d1:显示当前目录及其下一层目录的汇总。 -
sort -h:按容量从小到大排序。
假设 /var 占用较大,继续执行:
du -xhd1 /var | sort -h
如果发现 /var/lib 较大,再执行:
du -xhd1 /var/lib | sort -h
每次沿着占用较大的目录往下查,直到找到具体应用或数据目录。
du 扫描大量文件时可能耗时较长,并产生磁盘读取负载,建议避免同时运行多个全盘扫描。
四、查找体积较大的文件
目录范围确定后,可以查找其中超过 1 GiB 的普通文件。例如检查 /var:
find /var -xdev -type f -size +1G -exec ls -lh -- {} +
如果需要检查根文件系统:
find / -xdev -type f -size +1G -exec ls -lh -- {} +
-xdev 表示不跨越到其他文件系统。独立数据盘需要从对应挂载点单独检查。
常见的大文件包括:
| 文件类型 | 建议处理方式 |
|---|---|
| 历史备份、旧安装包 | 确认用途和备份有效性后删除或迁移 |
| 网站访问日志、错误日志 | 排查增长原因,配置日志轮转 |
| 数据库文件 | 通过数据库工具处理 |
| 虚拟机镜像、业务上传文件 | 核实是否仍被使用,必要时迁移或扩容 |
| Docker 相关文件 | 使用 Docker 命令和日志配置处理 |
文件体积大并不代表可以删除。特别是数据库、容器存储和正在使用的镜像文件,应先确认归属。
五、检查系统日志和网站日志
查看日志目录的占用:
du -xhd1 /var/log | sort -h
查找超过 100 MiB 的日志文件:
find /var/log -xdev -type f -size +100M -exec ls -lh -- {} +
如果服务器使用 systemd,可以查看 journal 日志的占用:
journalctl --disk-usage
确认旧日志无需继续保留后,可执行:
journalctl --rotate --vacuum-size=500M
该命令先轮转日志,再删除较旧的归档日志,将归档部分控制在指定容量以内。由于活动日志仍会占用空间,执行后的总占用不一定低于 500 MiB。此操作会删除部分历史日志。
网站日志还可能存放在面板或应用自定义目录中,需要结合前面的 du 结果检查。
对于持续增长的错误日志,应先查看近期内容,定位重复报错、异常请求或程序问题,再配置 logrotate 等轮转机制。
清理日志只能暂时释放空间,修复异常增长原因才能避免磁盘再次被占满。
六、清理软件包下载缓存
在 Debian、Ubuntu 系统中,可以先查看缓存大小:
du -sh /var/cache/apt/archives
然后清理已下载的软件包缓存:
apt-get clean
该命令清理本地软件包下载缓存,不会卸载已经安装的软件。后续需要相关安装包时,通常需要重新下载。
对于使用 DNF 的系统,可以执行:
dnf clean packages
这类操作适合处理软件包缓存,但如果缓存本身很小,就应继续排查其他目录。
七、检查网站备份和业务数据
网站、面板和定时任务可能每天生成备份。如果只新增、不清理,备份目录会持续增长。
根据实际路径检查,例如:
du -xhd1 /www | sort -h
du -xhd1 /home | sort -h
重点关注旧网站压缩包、数据库导出文件、重复下载的镜像和已经完成迁移的历史文件。
删除旧备份前,应确认至少保留了一份可用备份,并检查远端备份是否上传完整、能否正常恢复。
把文件从同一文件系统的一个目录移动到另一个目录,不会释放该文件系统的空间。 如果需要迁移,应将数据转移到其他磁盘或远端存储,并在验证后再删除原文件。
磁盘已经接近满载时,也不要直接在原磁盘创建完整压缩备份,以免产生更多临时占用。
八、数据库目录占用过大怎么办?
如果发现 MySQL 数据目录占用较大,应区分数据表文件、二进制日志、慢查询日志和备份文件。
登录数据库后,可以查看实际数据目录:
SHOW VARIABLES LIKE 'datadir';
查看是否开启二进制日志:
SHOW VARIABLES LIKE 'log_bin';
在启用二进制日志的情况下,查看日志文件列表:
SHOW BINARY LOGS;
如果主要占用来自 binlog,需要先确认备份恢复要求,以及所有复制节点是否仍需要这些日志,再通过 MySQL 的 PURGE BINARY LOGS 语句按明确边界清理。
不要直接在系统目录中删除 binlog 文件。 直接删除可能导致日志索引不一致,也可能影响复制或数据恢复。
同样,不要直接删除 .ibd、ibdata1、redo 或 undo 等数据库文件。业务数据持续增长时,应从数据归档、保留策略、存储迁移或扩容入手。
九、文件已经删除,空间为什么没有释放?
有时删除了一个大日志,df 显示的可用空间却没有明显增加。
常见原因是:文件虽然已从目录中删除,但仍被某个进程打开。
可以检查:
lsof +L1
重点关注进程名称、PID、文件类型、大小和路径,确认是否存在体积较大的已删除普通文件。
这类文件通常需要等所有相关进程关闭文件描述符后,才能释放占用。可以按应用支持的方式重新打开日志;必要时,在确认业务影响后重启对应服务。普通配置重载不一定会关闭该文件。
不建议为了释放一个日志文件直接重启整台服务器,也不要在未确认进程用途时强制结束进程。
十、Docker 占用大量磁盘空间怎么办?

Docker 的镜像、容器可写层、数据卷、构建缓存和日志都可能占用空间。
先查看资源使用情况:
docker system df
需要更详细的信息时执行:
docker system df -v
这些命令用于查看 Docker 管理的资源占用;容器日志和绑定挂载的业务目录还应单独检查。
查看所有容器:
docker ps -a
确认无需保留无标签且未被容器引用的镜像后,可以执行:
docker image prune
执行时会出现确认提示。
不要把 docker system prune -a --volumes 当作通用清理命令直接使用。清理停止的容器会删除其可写层,清理未使用的数据卷也可能删除仍需保留的业务数据。
如果怀疑容器日志过大,可以查看指定容器的日志驱动和日志路径:
docker inspect --format '{{.HostConfig.LogConfig.Type}}' 容器名
docker inspect --format '{{.LogPath}}' 容器名
使用 Docker Compose 时,可以在现有服务配置下合并以下日志设置:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
该示例为 JSON 日志配置大小和轮转数量限制。修改后需要重新创建相应容器才会生效,单纯重启现有容器不会更新创建时的日志配置。
重新创建前,应确认业务数据已经持久化,并安排好可能的服务中断。不要直接删除或修改 Docker 管理的日志文件,也不要手动清空 Docker 数据目录。
十一、清理后仍不够用,是否需要扩容?
如果主要空间被正常业务数据占用,且持续增长,应考虑增加存储容量。
可以先查看磁盘、分区和文件系统:
lsblk -f
df -hT
需要区分以下几个层次:
| 层次 | 需要确认的内容 |
|---|---|
| 云磁盘 | 平台是否已经增加容量,系统是否识别 |
| 分区 | 现有分区是否覆盖新增空间 |
| LVM | 如使用 LVM,是否需要扩展物理卷和逻辑卷 |
| 文件系统 | 是否已经扩展到新的可用容量 |
控制台扩容完成,并不代表 Linux 中的文件系统容量一定同步增加。
具体操作取决于分区方式、是否使用 LVM,以及文件系统是 ext4 还是 XFS,不能直接套用同一组命令。
如果新增的是一块独立数据盘,也不会自动增加根文件系统的空间,需要规划挂载位置和业务数据迁移。
对于莱卡云服务器,提交扩容相关工单时,可附上 lsblk -f 和 df -hT 的输出,便于核对当前磁盘结构。
十二、清理完成后检查什么?
处理完成后,重新检查容量和 inode:
df -hT
df -i
同时验证之前受影响的功能,例如网站访问、文件上传、数据库写入和备份任务,确认业务已经恢复。
日常维护建议关注以下事项:
-
为磁盘容量和 inode 设置告警,并结合增长速度提前处理。
-
为系统、网站和容器日志配置轮转。
-
为备份设置保留周期,避免无限累积。
-
为缓存、会话和临时文件设置有效期。
-
定期检查数据库日志和 Docker 资源占用。
-
将长期增长的业务数据规划到容量充足的数据盘。
排查过程中,如果某个目录的用途不明确,可先记录路径、占用大小和相关服务信息,再进行核实,避免误删影响业务。