如果我运行这样的命令:
find / -inum 12582925
这是否有可能列出位于不同安装文件系统(来自不同分区)上的两个文件,而这些文件恰好被分配了相同的编号? inode 编号在单个文件系统上还是在所有已安装的文件系统上是唯一的?
答案1
索引节点号仅在单个文件系统上是唯一的。您很快就会遇到的一个例子是 ext2/3/4 文件系统上的根 inode,它是 2:
$ ls -id / /home
2 / 2 /home
如果你运行(假设 GNU find
)
find / -printf "%i %p\n" | sort -n | less
在具有多个文件系统的系统上,您会看到很多很多重复的 inode 编号(尽管您需要对输出持保留态度,因为它还将包含硬链接)。
当您通过 inode 编号查找文件时,如果您只有一个起始路径,则可以使用find
的-xdev
选项将其搜索限制在包含起始路径的文件系统:
find / -xdev -inum 12582925
只会在根文件系统上查找 inode 号为 12582925 的文件。 (-xdev
也适用于多个起始路径,但在这种特殊情况下它的用处会降低。)
它是 inode 号和设备号的组合(在结构st_dev
中,在 GNU 中)唯一地标识一个文件(在给定的系统上)。如果两个目录条目具有相同的 inode 和 dev 编号,则它们引用同一文件(尽管可能通过同一文件系统的两个不同挂载进行绑定挂载)。st_ino
stat
%D %i
find
-printf
某些find
实现还具有一个-samefile
谓词,可以查找具有相同设备和 inode 编号的文件。大多数[
/test
实现还有一个-ef
运算符来检查两个文件路径是否引用同一个文件(尽管在符号链接解析之后)。
答案2
是的,相同的索引节点号可能会出现在不同的文件系统中。如果要指定确切的值,则不仅需要 inode 编号 (st_ino),还需要 inode 所在的设备(st_dev,本身由 dev_major — 设备的通用类 — 和 dev_minor — 特定实例 — 组成)。
这对夫妇(st_dev,st_ino)将要识别特定文件(至少如果您不卸载该 inode 所在的文件系统)。
如上所述索引节点(7):
inode所在设备
每个 inode(以及关联的文件)都驻留在设备上托管的文件系统中。该设备通过其主 ID(标识设备的通用类别)和次要 ID(标识通用类别中的特定实例)的组合来标识。
索引节点号
文件系统中的每个文件都有一个唯一的索引节点号。索引节点号保证是仅在文件系统内唯一(IE,不同的文件系统可能使用相同的索引节点号,这就是硬链接不能跨越文件系统边界的原因)。