本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
本文介绍了在ext4文件系统中磁盘利用率低却出现“No space left on device”的原因及对应的解决方案。
问题现象
在ext4文件系统中创建文件时,出现了“No space left on device”
的错误,尽管磁盘空间利用率低(或磁盘仍有剩余空间)。
在挂载点
/mnt
上挂载磁盘设备/dev/vdb
,此时磁盘的利用率为1%为例。Filesystem Type Size Used Avail Use% Mounted on ... /dev/vdb ext4 100G 308K 95G 1% /mnt
进入到目录
/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
为例。
备份数据。具体操作,请参见创建快照。
执行以下命令,卸载
/mnt
。sudo umount /mnt
执行以下命令,重新在设备
/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数量