Contents

释放Inode用法

1. 简介

在类 Unix 系统中,inode 是描述文件和目录的数据结构。可能的 inode 数量是有限的,并在分区创建期间设置。这意味着我们可以用完它们并且无法创建任何新文件,即使我们在设备上有空间。在本教程中,我们将学习如何防止这种情况以及如果发生这种情况如何处理。

2. 为什么inode是有限的

每个 inode 都包含有关其文件的关键信息,例如其属性和磁盘块位置。该数据是系统使用该文件所必需的。在扩展文件系统 家族的文件系统中,基于 Linux 的系统的默认设置,inode 存储在一个固定大小的表中。该表的大小由分区的创建决定,以后不能更改。

其他文件系统(例如,macOS 上使用的 APFS)不使用固定大小的表,而是使用其他数据结构,例如 B 树。因此,可能的 inode 数量更加灵活。它仍然受到索引可以存储在 64 位整数(或旧文件系统上的 32 位)中的大小的限制,但这是一个很难达到的限制。

3. 设置inode Limit

**inode 限制是在分区创建期间设置的。**有一些合理的默认设置,所以我们通常不需要担心它。但是,如果我们知道我们将存储大量小文件,我们可以覆盖这些默认值。例如,我们可以预计系统中的平均文件大小仅为 1 kB。让我们创建一个 ext4 分区,每千字节有一个 inode:

$ sudo mkfs.ext4 -i 1000 /dev/sdev

或者,我们可以选择另一个文件系统,例如Btrfs ,它不会出现与有限 inode 相同的问题。

4. 检查和释放inode

我们可以使用df命令检查可用的 inode :

$ df -i
Filesystem     512-blocks      Used  Available Capacity iused      ifree %iused  Mounted on
/dev/disk1s5s1  489620264  46865488   34089872    58%  568975 2447532345    0%   /
/dev/disk2s1   1953456384 727555584 1225900800    38% 2842014    4788675   37%   /Volumes/T7

“iused”列告诉我们已用 inode 的数量,“ifree”给我们空闲 inode 的数量,“%iused”列告诉我们已用 inode 的百分比。

不幸的是,除了删除我们不需要的文件之外,没有其他方法可以释放 inode。问题是我们有时不知道在哪里寻找耗尽 inode 限制的文件。解决此问题的一种方法是按目录中的文件数对目录进行排序。通过这样做,我们可以快速定位有问题的目录。

我们可以通过列出所有文件,只选择路径中的第一个目录,然后计算每个目录出现的次数来实现这一点:

$ sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
...
1585 Documents
6979 Downloads
7168 Pictures
113659 .nvm
669666 Library
980996 Projects

正如我们所见,我们在“Projects”目录中存储了最多的文件。此时,我们可以决定进一步调查或采取一些措施,如删除文件或将该目录移动到其他驱动器。