我在不同目录中的两个相同文件具有相同的inode

时间:2019-06-02 20:30:23

标签: linux

我在不同目录中有两个相同的文件。当我查找inode编号时,两个目录中的所有文件都相同。这些目录中的那些文件是否单独使用磁盘空间?

它们不是符号链接。它们是硬链接。

1 个答案:

答案 0 :(得分:0)

我有一个类似的查询。答案很长,但希望会对您有所帮助:

2个文件可以具有相同的inode,但前提是它们是不同分区的一部分。

Inode仅在分区级别是唯一的,而不在整个系统上唯一。 在每个分区上,都有一个超级块。该超级块告诉系统使用了哪些inode,哪些inode是免费的,等等(我将为您提供技术详细信息)。

磁盘上的每个项目-so文件,还有目录,Fifo管道和特殊设备文件-都有自己的inode。所有inode都存储在磁盘上,通常在超级块旁边。

例如对于常规文件,inode仅包含一些信息,例如上次访问/修改时间,文件大小,文件许可权,占用的磁盘块等。

对于目录,inode会告诉系统包含目录内容的块的存储位置,以及目录的上次访问/修改日期和权限。

如果通过“ ls -ld dir”查看目录的大小,则可以看到此信息。它通常是磁盘块大小的倍数(通常为512kB或1MB)。目录块的内容不过是一个名称-索引节点对列表(即文件名+它的索引节点编号)。当您执行“ ls”操作时,将打印这些内容,而无需系统实际在目录中定位所有文件。如果访问文件或子目录,则系统只需从目录内容中查找索引节点编号,然后检索相关索引节点,即可快速访问相关文件/子目录。

因此,您可以立即看到inode信息直接描述了系统分区上的内容。它是分区上文件系统的核心。

除非您使用LVM之类的特殊软件使系统相信多个物理磁盘或多个分区充当一个分区,否则每个分区都需要知道其自身的内容。否则,您将永远无法通过NFS挂载来共享磁盘(共享磁盘的每台计算机都必须知道其内容)。

继续这一思路,逻辑上是inode在(逻辑)分区级别上是唯一的。

在硬链接上回答您的问题。您首先需要知道硬链接和软链接(或符号链接)之间的区别。假设您想将A链接到B,无论A和B到底是什么(文件,目录,设备文件等)。因此,创建了两种访问文件系统上相同项目的方式。

使用软链接很容易。 A和B都有自己的inode,并且都属于不同目录。

但是,A实际上包含B的完整路径和名称。当您的系统尝试访问A时,它将看到对B的引用(通过完整路径),通过遵循该路径来定位B,然后对其进行访问。由于使用了完整的文件系统路径,因此软链接可在不同分区上工作。如果A确实是到另一个分区上B的软链接,并且B的分区已卸载,则该链接将继续存在,但仅指向不可达的链接。因此,您也无法访问A。 B被删除时也是如此。如果要删除A(软链接),则B仍然存在,并且保持不变。

硬链接是一个不同的故事。正如我所解释的,目录的内容不过是成对的inode数字和名称。索引节点用于访问目录中的实际项目。这些名称只是为了易于使用,或多或少。硬链接无非就是将某个目录内容中一个条目的索引节点号复制到另一个条目中。第二个条目可以在不同目录的内容中,甚至可以在同一目录中(使用不同的名称)。

由于两个目录条目均具有相同的inode编号,因此它们指向磁盘上的相同项目(即,相同的物理文件)。当然,如上所述,索引节点号是特定于分区的。因此,在不同分区上复制inode编号将无法按预期进行。这就是硬链接无法跨分区工作的原因。

在内部,文件和目录等项目的索引节点也包含一个链接计数器。此计数器保存指向该项目的(硬)链接的数量。删除项目时(例如,使用“ rm”),您将在内部对其进行“取消链接”(因此,在某些外壳程序(例如Perl)中看到的术语“取消链接”而不是“删除”或“删除”)。取消链接只会减少索引节点中的链接计数器,并删除目录内容列表中的条目。如果链接计数器降为0(删除最后一个链接),则该项目占用的磁盘块将被释放。以后在磁盘上创建新项目时,它们可能会使用释放的块并覆盖它们。换句话说,当删除最后一个链接时,该项目将变得不可访问(就像从磁盘上删除了该项目一样)。因此,只要不删除最后一个链接,项目(文件/目录)的内容仍然可以通过其余的硬链接访问和使用。

符号链接由“ ln -s”创建,硬链接通过简单的“ ln”创建。有关详细信息,请参见ln的手册页。