ext4文件系统磁盘利用率低却出现“No space left on device”的原因及解决方案

更新时间:2025-03-18 02:22:34
重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文介绍了在ext4文件系统中磁盘利用率低却出现“No space left on device”的原因及对应的解决方案。

问题现象

ext4文件系统中创建文件时,出现了“No space left on device”的错误,尽管磁盘空间利用率低(或磁盘仍有剩余空间)。

  1. 在挂载点/mnt上挂载磁盘设备/dev/vdb,此时磁盘的利用率为1%为例。

    Filesystem     Type      Size  Used Avail Use% Mounted on
    ...
    /dev/vdb       ext4      100G  308K   95G   1% /mnt
  2. 进入到目录/mnt中,并通过下面的命令创建一个文件。

    sudo touch testfile.txt

    报错信息如下所示。

    touch: cannot touch 'testfile.txt': No space left on device

问题原因

在制作ext4文件系统时,系统内部会维护一个inode表。每当创建一个新的文件或目录时,都会消耗一个inode。因此,即便某个文件本身占用的存储空间不大,一旦inode表中的inode用尽,就无法再创建新的文件或目录。这就是为什么在磁盘空间利用率不高的情况下,仍可能出现“No space left on device”的错误。这种情况常见于文件系统中有大量小文件的场景。

解决方案

本问题存在多种解决方案,以下将逐一介绍各方案并分析其利弊。

清理不必要的数据

删除不再使用的小文件以释放其所占用的inode数据空间,从而能够进行新建文件或目录的操作。

  • 优点:操作简单。

  • 缺点:存在一定风险,是一种临时解决方案。

优化文件存储方式

对于某些应用程序,建议将多个小文件合并为一个大文件,以降低inode的使用率。或利用压缩技术,将多个小文件存储为压缩包,不仅能节省空间,还能减少对inode的需求。

  • 优点:显著降低inode的消耗,处理少量大文件通常比管理大量小文件更为简便。

  • 缺点:合并文件可能会导致对单个文件的访问变得复杂。

增加文件系统的inode数量

警告

该方案将重新在磁盘上制作文件系统,这将导致磁盘上的数据被抹除。在进行以下操作前,请务必做好数据备份,防止数据丢失!具体操作,请参见创建快照

通过控制inode密度从而增加inode数量。

  • 优点:具备较高的灵活性,可以控制inode密度。

  • 缺点:操作不当可能导致数据丢失,存在较大的操作风险。

如果经常出现inode耗尽的情况,可以考虑重新格式化文件系统,并在创建时调整文件系统中的 inode密度。本文以在挂载点/mnt上挂载磁盘设备/dev/vdb为例。

  1. 备份数据。具体操作,请参见创建快照

  2. 执行以下命令,卸载/mnt

    sudo umount /mnt
  3. 执行以下命令,重新在设备/dev/vdb上制作文件系统。

    <bytes-per-inode>用来控制inode密度,该值越小,inode密度越大。

    sudo mkfs.ext4 -i <bytes-per-inode> /dev/vdb

    默认情况下,每个<bytes-per-inode>16 KB,当文件系统中存在大量小文件时,可以适当降低<bytes-per-inode>的大小,以增加inode的密度,从而增加inode数量。例如,可以将<bytes-per-inode>调整为4 KB。

    sudo mkfs.ext4 -i 4k /dev/vdb
  • 本页导读
  • 问题现象
  • 问题原因
  • 解决方案
  • 清理不必要的数据
  • 优化文件存储方式
  • 增加文件系统的inode数量
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等