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

pio*_*qui 69 filesystems size partition inode files

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

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

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

小智 37

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

不知道有没有办法动态改变inode表大小。恐怕您需要备份您的数据,创建新的文件系统,并恢复您的数据。

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

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

  • 您可以使用 `mke2fs -i` 来指定 inode 的数量。它的文档表明“在创建文件系统后无法扩展文件系统上的 inode 数量”。 (11认同)
  • @Gilles `-i` 选项指定 inode 的大小,而不是有多少个。`-N` 选项设置索引节点数。 (8认同)
  • @StuWhitby 这不太对。单个 inode 有多个直接指针,以及一个单、双和三重间接指针。如果块列表不能放入直接指针,那么单个间接指针将指向包含更多指针的数据块(不是另一个 inode)。如果需要更多的指针,则双间接指针指向包含单个间接指针的块,而三重间接指针指向包含双间接指针的块。所以一个文件实际上只使用一个 inode,而不管大小。 (5认同)
  • @piovisqui:每个文件都消耗在 inode 上,inode 是文件系统中的一个指针。如果文件是到另一个文件的硬链接,则它具有相同的 inode。 (2认同)

tij*_*agi 17

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


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

  • 不错的建议。 (3认同)

小智 17

使用 320 万个 inode,您总共可以拥有 320 万个文件和目录(但指向一个文件的多个硬链接仅使用一个 inode)。

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

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

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


小智 7

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

$ 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
Run Code Online (Sandbox Code Playgroud)

用于永久安装

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab
Run Code Online (Sandbox Code Playgroud)

  • 细节是错误的,您需要使用循环设备,甚至可能需要使用 unionfs,具体取决于应用程序,但这是避免格式化和从备份恢复的唯一解决方案,这在急于处理数百万个文件时并不有趣。在某些情况下,这可以挽救一天! (3认同)
  • 欢迎来到 U&L。我冒昧地将您的答案重新格式化为此处更常见的代码表示形式,插入一个提示 (`$`) 以清楚地区分命令和输出(如果它们只是命令,则通常会忽略提示)。我还在粗体阶段强调了 SHOUTING,这就是我认为你想要的。如果我歪曲事实,您可以回滚更改 (2认同)

小智 5

最近在使用 apt 或 aptitude upgrade 时遇到了这个问题。

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% /
Run Code Online (Sandbox Code Playgroud)

发出命令:

du /|sort -k1 -n
Run Code Online (Sandbox Code Playgroud)

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

/usr/src/linux-headers
Run Code Online (Sandbox Code Playgroud)

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

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /
Run Code Online (Sandbox Code Playgroud)

  • du 仅显示字节 - 而不是文件。并且您仅将 du 命令的输出通过管道进行排序。那么 sort -k1 -n 如何按照您建议的方式对输出进行排序?我唯一能看到的是“du /|sort -k1 -n”仅根据字节大小对每一行进行排序。没有其他的 (3认同)

小智 5

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

完全披露:并非所有操作系统都支持--inodesdu 命令(我的 Mac 操作系统没有),但许多 Linux 操作系统都支持。