当前位置: 首页 > 科技观察

关于Linux中的索引节点,你需要知道的一切

时间:2023-03-14 17:22:24 科技观察

你是否曾经抱怨过你的Linux系统没有剩余空间,而你显然还有足够多的空间?发生在我个人身上,我还有很多GB,但我的Linux系统抱怨没有剩余空间。这是我开始学习inode的时候。inode简介inode以表状结构存储系统上每个文件的元数据,通常位于分区的开头附近。它们存储除文件名和数据之外的所有信息。给定目录中的每个文件都是一个具有文件名和inode编号的条目。有关该文件的所有其他信息都是通过引用inode编号从inode表中检索的。inode编号在分区级别是唯一的。每个分区都有自己的inode表。如果inode耗尽,则即使给定分区上还有剩余空间,也无法创建新文件。Linux中的inode是什么?索引节点(IndexNode)翻译成中文就是索引节点。虽然历史上对此不太确定,但这是他们提出的最合乎逻辑和最佳的猜测。它曾经被写成I-node,但连字符随着时间的推移丢失了。如linfo.org所述:inode是一种数据结构......它存储除文件名和实际数据之外的文件的所有信息。Inode存储有关它引用的文件的元数据。此元数据包含有关相关文件的所有信息。文件大小访问权限创建时间修改时间数据在磁盘上的位置其他信息使用的每个inode都引用一个文件。每个文件都有一个索引节点。目录、字符文件、块设备都是文件。他们每个人都有一个inode。对于目录中的每个文件,都有一个条目,其中包含文件名和与之关联的索引节点号。Inode在分区级别是唯一的。如果两个文件位于不同的分区,则它们可以具有相同的inode编号。Inodes信息存储在每个分区的战略部分的类似表的结构中,通常在开头附近找到。如何在Linux中查看inode?您可以使用以下命令轻松列出inode编号:ls-i下图显示了我的根目录和相应的inode编号。每个文件系统拥有的inode数量是在创建文件系统时确定的。对于大多数用户来说,默认的inode数量就足够了。创建文件系统时的默认设置是每2K字节空间创建1个索引节点。这为大多数系统提供了大量的索引节点。在用完inode之前,您很可能会用完空间。如果需要,您可以在创建文件系统时指定要创建的索引节点数。如果您用完inode,您将无法创建新文件。您的系统也无法做到这一点。大多数用户不会发生这种情况,但这是可能的。例如,邮件服务器存储大量非常小的文件。许多这些文件将小于2K字节。它也有望继续增长。因此,邮件服务器有可能在空间用完之前用完inode。一些文件系统,例如Btrfs、JFS、XFS已经实现了动态inode。如果需要,他们可以增加可用的inode数量。inode是如何工作的?创建新文件时,会为其分配一个inode编号和文件名。inode编号在该文件系统中是唯一的。名称和inode编号都作为条目存储在目录中。当我运行ls命令“ls-li/”时,文件名和inode号是存储在目录/中的内容。使用inode号从inode表中检索剩余信息用户、组、文件权限、大小等。Linux中可以使用df命令列出各个文件系统的inode信息:┌──(linuxmi?linuxmi)-[~]└─$df-hi列出inode信息Linux中的inode和软/硬链接软链接或符号链接是Linux的一个众所周知的特性。但是,当您在Linux中创建符号链接时,Inode会发生什么变化?在下图中,我有一个名为“dir1”的目录,一个名为“file1”的文件,在“dir1”中我有一个名为“slink1”的软链接,它指向“../file1”┌──(linuxmi?linuxmi)-[~/linuxmi]└─$tree.├──dir1│└──slink1->../file1└──file11目录,2个文件现在我可以递归地列出和显示inode信息。┌──(linuxmi?linuxmi)-[~/linuxmi]└─$ls-liR.:Total413247036drwxr-xr-x2linuxmilinuxmi4096Feb3rd20:19dir113119533-rw-r--r--2linuxmilinuxmi0Jan814:28file1./dir1:total013247041lrwxrwxrwx1linuxmilinuxmi8Feb320:19slink1->../file1dir1和file1具有预期的不同inode编号。软链接也是如此。创建软链接时,您创建了一个新文件。在其元数据中,它指向目标。对于您创建的每个软链接,您都使用一个索引节点。使用ln命令在dir1中创建硬链接后:┌──(linuxmi?linuxmi)-[~/linuxmi/dir1]└─$ln../file1hlink1inodenumberlist给了我以下信息:┌──(linuxmi?linuxmi)-[~/linuxmi]└─$ls-liR.:total413247036drwxr-xr-x2linuxmilinuxmi4096Feb3rd20:23dir113119533-rw-r--r--2linuxmilinuxmi01Jan814:28file1./dir1:总计013119533-rw-r--r--2linuxmilinuxmi0Jan814:28hlink113247041lrwxrwxrwx1linuxmilinuxmi8Feb320:19slink1->。./file1可以看到“file1”和“hlink1”的inode号相同。说实话,由于索引节点,硬链接成为可能。硬链接不会创建新文件。它只是给相同的数据一个新名称。在旧版本的Linux中,可以硬链接目录。甚至可以使给定目录成为它自己的父目录。由于inode实现,这是可能的。这现在受到限制,以防止用户创建非常混乱的目录结构。inode的其他含义inode的工作方式也是不可能在不同文件系统之间创建硬链接的原因。允许此类任务会带来inode编号冲突的可能性。另一方面,可以跨不同的文件系统创建软链接。因为硬链接和原文件有相同的inode号,你可以删除原文件,数据仍然可以通过硬链接访问。在这种情况下,您所做的只是删除指向该inode编号的名称之一。链接到此inode编号的数据将保持可用,直到删除与其关联的所有名称。索引节点也是Linux系统无需重启即可更新的重要原因。这是因为一个进程可以使用库文件,而另一个进程可以用新版本替换该文件。因此,为新文件创建一个新的inode。已经运行的进程将继续使用旧文件,而每次对它的新调用都会导致使用新版本。inode附带的另一个有趣的特性是能够在inode本身中存储数据。这称为内联。这种存储方式的优点是节省空间,因为不需要数据块。它还通过避免更多的磁盘访问来获取数据来增加寻道时间。一些文件系统(如ext4)有一个名为inline_data的选项。启用后,它允许操作系统以这种方式存储数据。由于大小限制,内联只适用于非常小的文件。ext2及以后的版本常以这种方式存储软链接信息。也就是说,如果大小不超过60个字节。结论Inode不是您直接与之交互的东西,但它们发挥着重要作用。如果一个分区将包含许多非常小的文件,例如邮件服务器,了解它们是什么以及它们如何工作可以为您省去很多问题。