如何增加ext4文件系统中inode的数量?


61

上周我遇到了一个问题(对我来说是新问题)。我有一个ext4(Fedora 15)文件系统。在服务器上运行的应用程序突然停止。乍一看,我找不到问题。

df显示50%的可用空间。搜索了大约一个小时后,我看到了一个家伙在其中使用过的论坛帖子df -i。该选项查找inode的使用情况。系统没有inode,这是我没有意识到的简单问题。该分区只有3.2M个inode。

现在,我的问题是:我可以使系统具有更多的inode吗?格式化磁盘时是否应该/可以设置?使用3.2M的inode,我可以拥有多少个文件?


1
每个文件或目录都使用一个索引节点。硬链接到一个文件中并没有创建一个索引节点。 en.wikipedia.org/wiki/Inode
Paul Tomblin

Answers:


33

似乎您的文件比正常预期的要多得多。

我不知道是否有解决方案来动态更改inode表大小。恐怕您需要备份数据,创建新的文件系统并还原数据。

要使用如此庞大的inode表创建新的文件系统,您需要使用mke2fs(8)的'-N'选项。

我建议先使用'-n'选项(它不会创建fs,但会显示有用的信息),以便您可以获得估计的inode数。然后,如果需要,使用“ -N”创建具有特定inode编号的文件系统。


11
您可以mke2fs -i用来指定inode的数量。其文档表明“创建文件系统后,无法扩展其索引节点的数量”。
Gilles

2
@piovisqui:每个文件都在索引节点上使用,索引节点是文件系统中的一个指针。如果文件是到另一个文件的硬链接,则它具有相同的inode。
Hanan N.

6
@Gilles -i选项指定索引节点的大小,而不是索引的大小。该-N选项设置数字索引节点。
theillien 2014年

1
索引节点和文件号之间的关系不一定是1:1。第一个索引节点包含指向文件存储块的指针的列表。如果块列表不能放在一个inode中,则该inode包含一列指向i节点的指针,这些指针列出了存储文件的块。如果它不适合有那么它去3套inode的深为块等等的那个列表
StuWhitby

2
@StuWhitby不太正确。单个索引节点具有多个直接指针,以及单个,双重和三重间接指针。如果块列表不能容纳在直接指针中,则单个间接指针将指向包含更多指针的数据块(而不是另一个inode)。如果需要的指针多于该指针,则双间接指针指向包含单个间接指针的块,而三间接指针指向具有双间接指针的块。因此,实际上一个文件确实只使用一个索引节点,而不管大小如何。
user125355 '17

11

作为另一个解决方法,我建议您考虑将大量文件打包到一个未压缩的(!)tar归档文件中,然后archivemount将其用作文件系统挂载。tar存档比文件系统映像更适合共享,并且在备份到云或其他存储时提供类似的性能。


如果该集合被认为是只读的,则squashfs可能是一个选项,但是它需要在内核中启用某些选项,并且xz压缩也可用于tar,并且具有相同的性能。


2
很好的建议。
piovisqui

11

使用320万个索引节点,您总共可以拥有320万个文件和目录(但是到一个文件的多个硬链接仅使用一个索引节点)。

是的,可以在分区上创建文件系统时进行设置。选项-T usage-type,,-N number-of-inodes-i bytes-per-inode都可以设置索引节点的数量。我一般使用-i,输出比较后du -sfind | wc -l一个类似文件的收集,并允许一些松弛。

不,它不能在现有文件系统上就地更改。然而:

  • 如果您正在运行LVM或文件系统位于SAN的LUN上(直接在LUN上,或者作为LUN上的最后一个分区),或者该分区之后的磁盘上有可用空间,则可以扩展该分区,然后用于resize2fs扩展文件系统。大约与增加的空间成比例地增加了更多的inode。如果要避免在空间占用之前用尽inode,并假设将来的文件平均大小大致相同,请使用设置足够高的保留块百分比tune2fs -m
  • 如果您有足够的空间并且可以使文件系统脱机,则可以使它脱机,创建具有更多inode的新文件系统,然后将所有文件复制过来。
  • 如果仅一部分文件正在使用大量的索引节点,并且您有足够的可用空间,则在由该文件系统上的文件支持的循环设备上创建一个文件系统,并创建具有更多索引节点的文件系统(可能还有较小的块)在其上,并将有问题的目录移入其中。这可能是性能下降和维护麻烦,但这是另一种选择。
  • 当然,如果您可以删除很多不需要的文件,那也应该有所帮助。

6

对于这种情况,我有另一种解决方案。假设您在10G 分区中有1000个inode 。但是由于inode的限制,您不应该使用分区的所有空间。但是在这种解决方案中,您将能够使用分区的剩余空间而无需对其进行格式化

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

永久安装

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab

2
欢迎来到U&L。我可以自由地重新格式化您对此处更常见的代码表示形式的回答,并插入提示($)以便清楚地区分命令和输出(如果它们只是命令,则通常省略该提示)。我还改变了“大喊大叫”阶段的重点,这正是我认为您想要的。如果我对内容的陈述不实
撤消

我认为此解决方案具有逻辑性,但运行dd时需要管理大小。
piovisqui 2015年

3
详细信息是错误的,您需要使用循环设备,甚至可能取决于应用程序使用unionfs,但这是避免格式化和从备份还原的唯一解决方案,这在急于处理数百万个文件时并不有趣。在某些情况下,这可以节省一天的时间!
medoc

6

最近在使用apt或aptitude升级时遇到了此问题。

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

发出的命令:

du /|sort -k1 -n

显示的大多数文件位于以下几个内核版本的子文件夹中:

/usr/src/linux-headers

删除了那些子文件夹,并修复了inode问题。

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /

“ du / | sort -k1 -n”显示inode吗?
孤儿们,

否。那是对目录进行排序,以显示其中文件最多的目录,消耗大量索引节点但实际空间使用较少的文件夹:上面显示的30%可用磁盘空间和100%索引节点使用的情况。
kph0x1

老实说,我没有得到“ du”如何显示带有任何标志的文件数量?您能详细解释一下吗?
孤儿们

du命令没有标志。用法是上面示例中文件系统的根目录,仅查看空间。输出通过管道进行排序,以显示哪些目录包含最多的文件。在上面的示例中,文件没有计数,即问题的“多少文件”部分。内核源代码是du输出中显示的罪魁祸首;例如,许多小文件,过去编译的子文件夹,非常适合除去以释放索引节点的东西。那时仍然很明显du,需要人工进行人工审查/usr/src/linux-headers
kph0x1

1
du仅显示字节-不显示文件。并且您仅将du命令中的输出分配到排序中。那么sort -k1- n如何按照您建议的方式对输出进行排序?我唯一看到的是“ du / | sort -k1 -n”仅根据字节大小对每一行进行排序。没别的
孤儿院

2

尝试du -s --inodes * 2>/dev/null |sort -g将cd放入输出的最后一个目录,然后重复。

全面披露:不是所有--inodes命令都支持du命令(我的Mac OS不支持),但许多Linux OS都支持。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.