你需要知道的关于 Linux inode 的一切

我有一个奇怪的问题要问你。

您的系统是否曾经抱怨您没有剩余空间而您显然仍然拥有足够的空间?

它发生在我身上,我有很多 GB 剩余空间,但我的 Linux 系统抱怨没有剩余空间。 这是我了解到的 节点.

inode 简介

Inodes 将系统上每个文件的元数据存储在一个类似表的结构中,通常位于分区的开头附近。 它们存储除文件名和数据之外的所有信息。

给定目录中的每个文件都是一个带有文件名和 inode 编号的条目。 通过引用 inode 编号从 inode 表中检索有关该文件的所有其他信息。

inode 编号在分区级别是唯一的。 每个分区都作为它自己的 inode 表。

如果 inode 用完,即使给定分区上有剩余空间,也无法创建新文件。

Linux中的inode是什么?

inode 代表索引节点。 虽然历史对此并不太确定,但这是他们提出的最合乎逻辑和最好的猜测。 它曾经被写成 I-node,但随着时间的推移,连字符丢失了。

如上所述 信息网

inode 是一种数据结构…… ……它存储有关文件的所有信息,除了其名称和实际数据。

Inodes 存储有关它所引用文件的元数据。 此元数据包含有关所述文件的所有信息。

  • 尺寸。
  • 允许。
  • 所有者/组。
  • 硬盘驱动器的位置。
  • 约会时间。
  • 需要的任何其他信息。

每个使用的 inode 引用 1 个文件。 每个文件都有 1 个 inode。 目录、字符文件、块设备,都是文件。 它们每个都有 1 个 inode。

对于目录中的每个文件,都有一个包含文件名和与之关联的 inode 编号的条目。

inode 在分区级别是唯一的。 您可以拥有两个具有相同 inode 编号的文件,因为它们位于不同的分区上。 索引节点信息存储在每个分区的战略部分中的类似表的结构中。 经常在开头附近找到。

怎样在 Linux 中检查 inode?

您可以使用以下命令轻松列出 inode 编号:

ls -i

下图显示了我的根目录以及相应的 inode 编号。

每个文件系统的 inode 数量是在创建文件系统时决定的。 对于大多数用户来说,默认的 inode 数量就足够了。

创建文件系统时的大多数默认设置将为每 2K 字节空间创建 1 个 inode。 这为大多数系统提供了大量的 inode。 在用完 inode 之前,您很可能会用完空间。 如果需要,您可以在创建文件系统时指定要创建的 inode 数量。

如果 inode 用完,您将无法创建任何新文件。 您的系统也将无法这样做。 这不是大多数用户会遇到的情况,但有可能。

为了 example,邮件服务器将存储大量非常小的文件。 许多这些文件将低于 2K 字节。 它也有望不断增长。 因此,邮件服务器在空间用完之前有用完 inode 方式的风险。

一些文件系统如 Btrfs, JFS, XFS 已经实现了动态 inode。 如果需要,他们可以增加可用的 inode 数量。

inode 是怎样工作的?

创建新文件时,会为其分配一个 inode 编号和文件名。 inode 编号是该文件系统中的唯一编号。 名称和 inode 编号都作为条目存储在目录中。

当我运行 ls 命令“ls -li /”时,文件名和 inode 编号是存储在目录 / 中的内容。 使用 inode 编号从 inode 表中检索用户、组、文件权限、大小等的其余信息。

您可以在 Linux 中使用 df 命令列出每个文件系统的 inode 信息:

df -hi

软链接或符号链接是 Linux 的一个众所周知的特性。 但是当你在 Linux 中创建一个符号链接时,inode 会发生什么? 在下一张图片中,我有一个名为“dir1”的目录,一个名为“file1”的文件,在“dir1”中我有一个名为“slink1”的软链接指向“../file1”

你需要知道的关于 Linux inode 的一切 1

现在我可以递归列出并显示 inode 信息。

你需要知道的关于 Linux inode 的一切 2

正如预期的那样,dir1 和 file1 具有不同的 inode 编号。 但软链接也是如此。 创建软链接时,您创建了一个新文件。 在其元数据中,它指向目标。 对于您创建的每个软链接,您使用一个 inode。

使用 ln 命令在 dir1 中创建硬链接后:

ln ../file1 hlink1

inode 编号列表为我提供了以下信息:

你需要知道的关于 Linux inode 的一切 3

您可以看到“file1”和“hlink1”具有相同的 inode 编号。 老实说,由于 inode,硬链接是可能的。 硬链接不会创建新文件。 它只为相同的数据提供一个新名称。

在旧版本的 Linux 中,可以硬链接目录。 甚至可以将给定目录作为其自己的父目录。 由于 inode 实现,这成为可能。 这现在受到限制,以防止用户创建非常混乱的目录结构。

inode 的其他含义

inode 的工作方式也是无法跨不同文件系统创建硬链接的原因。 允许这样的任务可能会导致 inode 编号发生冲突。 另一方面,软链接可以跨不同的文件系统创建。

因为硬链接与原文件的inode编号相同,所以可以删除原文件,通过硬链接仍然可以使用数据。 在这种情况下,您所做的只是删除指向此 inode 编号的名称之一。 链接到此 inode 编号的数据将保持可用,直到与其关联的所有名称都被删除。

inode 也是 Linux 系统无需重启即可更新的一个重要原因。 这是因为一个进程可以使用库文件,而另一个进程用新版本替换该文件。 因此,为新文件创建一个新的 inode。 已经运行的进程将继续使用旧文件,而对它的每次新调用都将导致使用新版本。

inode 附带的另一个有趣功能是能够将数据存储在 inode 本身中。 这就是所谓的 内联. 这种存储方法的优点是节省空间,因为不需要数据块。 它还通过避免更多磁盘访问来获取数据来增加查找时间。

一些文件系统如 ext4 有一个名为 inline_data 的选项。 启用后,它允许操作系统以这种方式存储数据。 由于大小限制,内联仅适用于非常小的文件。 Ext2 及更高版本通常会以这种方式存储软链接信息。 也就是说,如果大小不再是 60 字节。

结论

索引节点不是您直接与之交互的东西,但它们起着重要的作用。 如果一个分区要包含许多非常小的文件,例如邮件服务器,了解它们是什么以及它们怎样工作可以为您节省很多问题。

我希望你喜欢这篇文章,并学到了一些关于 Linux 中 inode 的新的和重要的东西。 订阅我们的网站以了解更多 Linux 相关信息。

相关阅读:

Posted in: Linux