全部文档
当前文档

共搜索到 0 条结果

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

Linux服务器磁盘已满问题处理方法

最近更新时间:2026-06-16 17:51:58

问题描述

在 Linux 实例中创建文件或运行应用时,出现错误提示 No space left on device,表明存储资源已耗尽。

在操作前请手动创建单个快照备份数据,防止误操作导致数据丢失,影响业务运行。

可能原因

存储资源耗尽可能由以下原因导致:

  1. 磁盘存储空间耗尽。

  2. 文件已删除但未被进程释放。

  3. Linux 索引(Inode)资源耗尽。

  4. Docker 相关文件占用空间较大。

  5. 非空目录被其他设备挂载覆盖。

排查步骤

场景一:存储空间耗尽

  1. 登录云服务器实例后台,查看磁盘使用率。在系统下执行以下命令,查看各挂载点的磁盘使用情况:

    sudo df -h

    Use%100%,则说明对应空间已满。

  2. 清理无用的文件或目录。使用以下命令查看指定目录下的文件及子目录的大小:

    sudo du -sh <目录名称>/*

    若有需要,可进入目录,逐级查看占用情况。例如使用以下命令查看 /mnt 目录下文件及子目录占用空间的大小:

    sudo du -sh /mnt/*
  3. 若清理后仍空间不足,扩容云硬盘。

场景二:已删除未释放空间的文件

即使一个文件被删除,只要仍有进程正在使用(即持有其文件句柄),系统就不会释放其占用的磁盘空间,直至进程终止或主动关闭文件后才会被真正回收。

  1. 安装 lsof 工具。

    已删除但未释放空间的文件无法通过 dfdu 指令查看,需要利用 lsof 工具将其列出。

    • Linux、CentOS 系统:

      sudo yum install -y lsof
    • Debian、Ubuntu 系统:

      sudo apt install -y lsof
  2. 查看已删除文件未被释放的存储空间。

    sudo lsof | grep delete | sort -k7 -rn | more

    输出第 7 列为文件大小(单位:Byte),累加可计算未释放空间总量。

    lsof 输出示例
  3. 记录占用进程的名称和 PID。

    执行以下指令,通过 COMMANDPID 字段获取进程名称和进程 PID:

    sudo lsof | grep delete
  4. 重启或停止相关服务。

    执行以下命令,进一步确认进程用途:

    sudo ps -ef | grep <PID>

    评估影响后重启或停止相关服务。

    重启或停止服务可能会影响业务,请谨慎评估,选择合适时间进行操作。

场景三:Linux 索引(Inode)资源耗尽

每个文件都会占用一个 Inode。如果磁盘上存在大量小文件,即使磁盘空间有剩余,Inode 也可能被耗尽,导致无法新建文件。

  1. 查看 Inode 使用率。

    sudo df -i

    IUse% 达到 100%,则表示 Inode 资源已耗尽。

  2. 清理无用的文件或目录。

    可使用以下命令查看指定目录下的文件及子目录占用的 Inode 数量:

    sudo du -sh --inodes <目录名称>/*

    若有需要,可进入目录,利用此命令逐级查看占用情况。例如使用以下命令查看 /mnt 目录下文件及子目录占用的 Inode 数量:

    sudo du -sh --inodes /mnt/*
  3. 若清理后 Inode 数仍不足,扩容云硬盘。

场景四:容器场景相关文件占用空间较大

Docker 运行过程中会产生大量中间镜像、已停止容器和构建缓存,这些对象长期积累会占用磁盘空间。

  1. 查看 Docker 文件磁盘空间占用率。

    sudo df -h

    FilesystemoverlayUse% 达到 100%,说明 Docker 相关文件正在占用空间。

  2. 确定 Docker 内部资源占用情况。

    sudo docker system df

    查看 SizeRECLAIMABLE 字段,确定文件占用情况。以下为示例输出:

    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 可回收,建议优先清理无用镜像。

  3. 清理无用文件。

    若 Docker 文件无法清理,可尝试依照场景一:存储空间耗尽的方法处理。

    • 清除所有已停止的容器:

      sudo docker container prune
    • 清除所有 dangling 镜像(即无 tag 的镜像):

      sudo docker image prune
    • 清除不再使用的构建缓存:

      sudo docker builder prune

场景五:挂载点被覆盖

非空目录被其他设备挂载后,其下数据虽会被隐藏,但已打开此目录的进程仍可写入覆盖空间。此类"隐藏"空间消耗无法通过 df 命令观测,容易造成空间意外耗尽。

  1. 查看重复的目录信息。

    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

    示例中分区 vdb1vdc1 的挂载目录均为 /mnt,存在挂载点被覆盖风险。

  2. 卸载文件系统。

    sudo umount <重复挂载目录>

    示例中 /mnt 为重复挂载目录,执行以下命令可卸载最后挂载的设备 vdc1

    sudo umount /mnt

    卸载文件系统可能导致依赖该路径的服务中断,请评估风险,选择合适的时间操作。

  3. 获取被覆盖挂载点的设备名称。

    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

  4. 清理被覆盖空间中无用的文件或目录。

    示例中,需要清理 vdb1 挂载的 /mnt 目录。

  5. 若清理后空间仍不足,扩容云硬盘后,挂载至其他空目录下使用。

    示例中,需要扩容的目标设备名称为 vdb1

    请勿将多个设备挂载至同一目录。多个设备挂载至相同目录,先挂载的设备空间会被隐藏,可能导致数据写入错误设备。请在后续使用中确保不同设备挂载至不同的空目录。

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈