您需要了解的有关 Linux 中的 inode 的一切
我要问你一个奇怪的问题。
您的 Linux 系统是否曾抱怨过没有剩余空间,而实际上您却还有足够的空间?
我遇到过这种情况,我剩余很多 GB,但我的 Linux 系统却抱怨没有剩余空间。这时我了解了inode。
inode 简介
Inode 以表格形式存储系统中每个文件的元数据,通常位于分区开头附近。它们存储除文件名和数据之外的所有信息。
给定目录中的每个文件都是一个包含文件名和 inode 号的条目。有关该文件的所有其他信息都是通过引用 inode 号从 inode 表中检索的。
Inode 编号在分区级别是唯一的。每个分区都有自己的 Inode 表。
如果 inode 用完了,即使在给定分区上还有剩余空间,您也无法创建新文件。
Linux 中的 inode 是什么?
Inode 代表索引节点。尽管历史对此并不十分确定,但这是他们提出的最合乎逻辑和最好的猜测。它曾经被写成I-node,但连字符随着时间的推移而消失了。
正如linfo.org上描述的:
inode是一种数据结构……它存储了文件除名称和实际数据之外的所有信息。
Inode 存储了它所引用文件的元数据。这些元数据包含有关该文件的所有信息。
- 尺寸
- 允许
- 所有者/群组
- 硬盘的位置
- 日期/时间
- 其他信息
每个使用的 inode 对应 1 个文件。每个文件都有 1 个 inode。目录、字符文件和块设备都是文件。它们各自都有 1 个 inode。
对于目录中的每个文件,都有一个条目,包含文件名和与之关联的 inode 编号。
Inode 在分区级别是唯一的。如果两个文件位于不同的分区,则它们的 Inode 编号可以相同。Inode 信息以表格形式存储在每个分区的战略部分中,通常位于开头附近。
如何在 Linux 中检查 inode?
您可以使用以下命令轻松列出 inode 编号:
ls -i
下面的图片显示了我的根目录及其相应的 inode 编号。
每个文件系统的 inode 数量是在创建文件系统时决定的。对于大多数用户来说,默认的 inode 数量已经足够了。
创建文件系统时的默认设置是每 2K 字节空间创建 1 个 inode。这为大多数系统提供了足够的 inode。在用完 inode 之前,您很可能已经用完了空间。如果需要,您可以指定在创建文件系统时要创建多少个 inode。
如果 inode 用完了,您将无法创建新文件。您的系统也将无法执行此操作。大多数用户不会遇到这种情况,但这种情况是可能发生的。
例如,邮件服务器将存储大量非常小的文件。其中许多文件大小低于 2K 字节。预计文件大小还会不断增长。因此,邮件服务器在空间耗尽之前就面临耗尽 inode 的风险。
一些文件系统(例如Btrfs、JFS、 XFS )已实现动态 inode。它们可以根据需要增加可用的 inode 数量。
inode 如何工作?
创建新文件时,会为其分配一个 inode 编号和文件名。inode 编号是文件系统中的唯一编号。名称和 inode 编号都作为条目存储在目录中。
当我运行ls 命令“ ls -li / ”时,文件名和 inode 编号就是存储在目录/中的内容。其余信息(用户、组、文件权限、大小等)是使用 inode 编号从 inode 表中检索的。
您可以使用Linux 中的 df 命令列出每个文件系统的 inode 信息:
df -hi
Inode 和软/硬链接
软链接或符号链接是 Linux 的一个众所周知的功能。但是,当您在 Linux 中创建符号链接时,Inode 会发生什么情况?在下图中,我有一个名为“ dir1 ”的目录,一个名为“ file1 ”的文件,在“ dir1 ”中,我有一个名为“ slink1 ”的软链接,它指向“ ../file1 ”
现在我可以递归列出并显示 inode 信息。
正如预期的那样,dir1 和 file1 具有不同的 inode 编号。但软链接也是如此。创建软链接时,会创建一个新文件。在其元数据中,它指向目标。对于您创建的每个软链接,您都使用一个 inode。
ln ../file1 hlink1
列出 inode 编号可获得以下信息:
您可以看到“ file1”和“ hlink1 ”具有相同的 inode 编号。事实上,硬链接之所以可能,是因为 inode。硬链接不会创建新文件。它只是为相同的数据提供了一个新名称。
在旧版本的 Linux 中,可以硬链接目录。甚至可以将给定目录作为其自己的父目录。这得益于 inode 实现。现在对此进行了限制,以防止用户创建非常混乱的目录结构。
inode 的其他含义
索引节点的工作方式也是无法跨不同文件系统创建硬链接的原因。允许这样的任务可能会导致索引节点号冲突。另一方面,软链接可以跨不同文件系统创建。
由于硬链接具有与原始文件相同的 inode 编号,因此您可以删除原始文件,并且数据仍可通过硬链接获得。在这种情况下,您所做的就是删除指向此 inode 编号的一个名称。链接到此 inode 编号的数据将保持可用,直到与其关联的所有名称都被删除。
Inode 也是 Linux 系统无需重启即可更新的一个重要原因。这是因为一个进程可以使用库文件,而另一个进程则用新版本替换该文件。因此,为新文件创建一个新的 inode。已经运行的进程将继续使用旧文件,而每次对它的新调用都将导致使用新版本。
inode 的另一个有趣功能是能够将数据存储在 inode 本身中。这称为内联。这种存储方法的优点是节省空间,因为不需要数据块。它还通过避免更多磁盘访问来获取数据,从而增加了查找时间。
某些文件系统(例如 ext4)有一个名为 inline_data 的选项。启用后,它允许操作系统以这种方式存储数据。由于大小限制,内联仅适用于非常小的文件。Ext2 及更高版本通常会以这种方式存储软链接信息。前提是大小不超过 60 字节。
结论
Inode 不是直接与你交互的东西,但它们起着重要作用。如果一个分区包含许多非常小的文件(如邮件服务器),了解它们是什么以及它们如何工作可以为你省去很多麻烦。
希望您喜欢这篇文章,并学到了有关 Linux 中 inode 的新知识和重要知识。订阅我们的网站以了解更多与 Linux 相关的信息。