注册

Linux报 “out of inodes” 异常的原因以及解决办法

当 Linux 文件系统的 inode 节点数量达到上限时,会报“out of inodes”错误,此时用户无法创建新的文件或目录。这种错误通常发生于使用大量小文件的情况下,比如一些日志文件或者某些程序的缓存文件。

解决该问题的方法主要有两种:增加 inode 节点数目或者减少文件数目。

增加 inode 节点数目

增加 inode 节点数目的方法是通过调整文件系统的 inode 表大小来实现的。对于 ext2、ext3、ext4 等文件系统,可以通过 mkfs.ext4 命令创建文件系统时指定 inode 数量,通过 tune2fs 命令动态调整 inode 数量。

使用 mkfs.ext4 指定 inode 数量:

mkfs.ext4 -N [num] /dev/sda1

其中 [num] 为需要指定的 inode 数量,/dev/sda1 为需要创建文件系统的设备。

使用 tune2fs 动态调整 inode 数量:

tune2fs -l /dev/sda1 | grep 'Inode count'
tune2fs -L [label] -i [interval] -c [count] /dev/sda1

其中 /dev/sda1 为需要调整 inode 数量的设备,-l 参数可以查看当前的 inode 数量,即第一条命令。-L [label] 用于设置文件系统的卷标,-i [interval] 用于设置自动检测文件系统错误的时间间隔,-c [count] 用于设置在文件系统挂载 [count] 次之后自动检测文件系统错误。这三个参数都是可选的。

减少文件数目

减少文件数目的方法是通过删除一些不必要的文件来释放 inode 资源。在删除文件时,应该尽可能删除较小的文件、占用 inode 数量较多的文件或者不再需要的临时文件等。

可以使用 find 命令查找一些不必要的文件:

find / -xdev -type f -size +500k -exec ls -lh {} \; | awk '{ print $NF ": " $5 }'

find / -xdev -type f -name "*.log" -mtime -1 -exec ls -lh {} \; | awk '{ print $NF ": " $5 }'

第一条命令用于查找大小大于 500KB 的文件,第二条命令用于查找最近一天内被修改过的名字匹配 .log 的文件。

查找到一些不必要的文件后,使用 rm 命令删除即可。需要注意的是,删除文件后,inode 数量不会立即释放,而是需要在磁盘空闲时才会被系统回收。若需要立即释放 inode 资源,则可以使用 debugfs 命令:

debugfs -w /dev/sda1
debugfs: clri [inode_number]
debugfs: quit

其中 /dev/sda1 为需要释放 inode 资源的设备,[inode_number] 为需要释放的 inode 节点号。执行成功后,该 inode 节点对应的磁盘空间将被标记为空闲并被系统回收。

总之,出现“out of inodes”错误时,既可以增加 inode 节点数目,也可以减少文件数目。通常情况下,应该尝试先减少文件数目,然后再考虑增加 inode 节点数目。