最近更新时间:2026-06-16 17:51:58
在 Linux 实例中创建文件或运行应用时,出现错误提示 No space left on device,表明存储资源已耗尽。
在操作前请手动创建单个快照备份数据,防止误操作导致数据丢失,影响业务运行。
存储资源耗尽可能由以下原因导致:
磁盘存储空间耗尽。
文件已删除但未被进程释放。
Linux 索引(Inode)资源耗尽。
Docker 相关文件占用空间较大。
非空目录被其他设备挂载覆盖。
登录云服务器实例后台,查看磁盘使用率。在系统下执行以下命令,查看各挂载点的磁盘使用情况:
sudo df -h若 Use% 为 100%,则说明对应空间已满。
清理无用的文件或目录。使用以下命令查看指定目录下的文件及子目录的大小:
sudo du -sh <目录名称>/*若有需要,可进入目录,逐级查看占用情况。例如使用以下命令查看 /mnt 目录下文件及子目录占用空间的大小:
sudo du -sh /mnt/*若清理后仍空间不足,扩容云硬盘。
即使一个文件被删除,只要仍有进程正在使用(即持有其文件句柄),系统就不会释放其占用的磁盘空间,直至进程终止或主动关闭文件后才会被真正回收。
安装 lsof 工具。
已删除但未释放空间的文件无法通过 df 或 du 指令查看,需要利用 lsof 工具将其列出。
Linux、CentOS 系统:
sudo yum install -y lsofDebian、Ubuntu 系统:
sudo apt install -y lsof查看已删除文件未被释放的存储空间。
sudo lsof | grep delete | sort -k7 -rn | more输出第 7 列为文件大小(单位:Byte),累加可计算未释放空间总量。
记录占用进程的名称和 PID。
执行以下指令,通过 COMMAND 和 PID 字段获取进程名称和进程 PID:
sudo lsof | grep delete重启或停止相关服务。
执行以下命令,进一步确认进程用途:
sudo ps -ef | grep <PID>评估影响后重启或停止相关服务。
重启或停止服务可能会影响业务,请谨慎评估,选择合适时间进行操作。
每个文件都会占用一个 Inode。如果磁盘上存在大量小文件,即使磁盘空间有剩余,Inode 也可能被耗尽,导致无法新建文件。
查看 Inode 使用率。
sudo df -i若 IUse% 达到 100%,则表示 Inode 资源已耗尽。
清理无用的文件或目录。
可使用以下命令查看指定目录下的文件及子目录占用的 Inode 数量:
sudo du -sh --inodes <目录名称>/*若有需要,可进入目录,利用此命令逐级查看占用情况。例如使用以下命令查看 /mnt 目录下文件及子目录占用的 Inode 数量:
sudo du -sh --inodes /mnt/*若清理后 Inode 数仍不足,扩容云硬盘。
Docker 运行过程中会产生大量中间镜像、已停止容器和构建缓存,这些对象长期积累会占用磁盘空间。
查看 Docker 文件磁盘空间占用率。
sudo df -hFilesystem 为 overlay 的 Use% 达到 100%,说明 Docker 相关文件正在占用空间。
确定 Docker 内部资源占用情况。
sudo docker system df查看 Size 和 RECLAIMABLE 字段,确定文件占用情况。以下为示例输出:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 21 9 13.94GB 10.66GB (76%)
Containers 9 5 30.09MB 0B (0%)
Local Volumes 6 6 259.9MB 0B (0%)
Build Cache 0 0 0B 0B示例中,Docker 镜像占用 13.94GB,其中 10.66GB 可回收,建议优先清理无用镜像。
清理无用文件。
若 Docker 文件无法清理,可尝试依照场景一:存储空间耗尽的方法处理。
清除所有已停止的容器:
sudo docker container prune清除所有 dangling 镜像(即无 tag 的镜像):
sudo docker image prune清除不再使用的构建缓存:
sudo docker builder prune非空目录被其他设备挂载后,其下数据虽会被隐藏,但已打开此目录的进程仍可写入覆盖空间。此类"隐藏"空间消耗无法通过 df 命令观测,容易造成空间意外耗尽。
查看重复的目录信息。
sudo lsblk查看 MOUNTPOINT,记录重复挂载目录名称。以下为示例输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 40G 0 disk
├─vda1 253:1 0 2M 0 part
├─vda2 253:2 0 200M 0 part /boot/efi
└─vda3 253:3 0 39.8G 0 part /
vdb 253:16 0 40G 0 disk
└─vdb1 253:17 0 40G 0 part /mnt
vdc 253:32 0 40G 0 disk
└─vdc1 253:33 0 40G 0 part /mnt示例中分区 vdb1 和 vdc1 的挂载目录均为 /mnt,存在挂载点被覆盖风险。
卸载文件系统。
sudo umount <重复挂载目录>示例中 /mnt 为重复挂载目录,执行以下命令可卸载最后挂载的设备 vdc1:
sudo umount /mnt卸载文件系统可能导致依赖该路径的服务中断,请评估风险,选择合适的时间操作。
获取被覆盖挂载点的设备名称。
sudo df -h定位被覆盖挂载点的设备名称。以下为示例输出:
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.7G 0 3.7G 0% /dev
tmpfs 3.7G 0 3.7G 0% /dev/shm
tmpfs 3.7G 524K 3.7G 1% /run
tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup
/dev/vda3 40G 4.5G 33G 12% /
/dev/vda2 200M 5.8M 194M 3% /boot/efi
/dev/vdb1 40G 40G 0 100% /mnt
tmpfs 747M 0 747M 0% /run/user/0示例中当前挂载至 /mnt 的分区名称为 vdb1,因此被覆盖挂载点的设备名称为 vdb1。
清理被覆盖空间中无用的文件或目录。
示例中,需要清理 vdb1 挂载的 /mnt 目录。
若清理后空间仍不足,扩容云硬盘后,挂载至其他空目录下使用。
示例中,需要扩容的目标设备名称为 vdb1。
请勿将多个设备挂载至同一目录。多个设备挂载至相同目录,先挂载的设备空间会被隐藏,可能导致数据写入错误设备。请在后续使用中确保不同设备挂载至不同的空目录。
纯净模式
