inode 与文件的关联是什么?

mat*_*age 3 filesystems inode files

我从一些来源(例如:this)中了解到以下几点:

  • inode 是一种数据结构,用于存储有关文件的相关信息。
  • 一个 inode 编号指向一个 inode。
  • 有一个单独的inode 表,用于维护inode 编号与相应inode 的映射信息。
  • 在创建文件时,将 inode 编号和文件名分配给文件。
  • 当使用文件名访问文件时,在内部,名称首先与其inode 编号映射,然后访问相应的inode

我不明白的主要是最后一行。inode 访问inode,但inode 是独立于文件的实体。并且给出的描述并没有说 inode 以任何方式与文件相关联,只是说 inode 是包含与文件相关的元数据的数据结构。那么文件是如何访问的呢?inode 是否调用文件?

che*_*ner 5

inode文件,它由其 inode 编号标识。文件名只是文件系统中引用文件的元数据。单个文件/inode 可以有多个文件名引用它:

$ touch foo
$ ln foo bar
$ ls -li foo bar
28098391 -rw-r--r--  2 xxxxxxx  xxxxx  0 Jul  6 22:15 bar
28098391 -rw-r--r--  2 xxxxxxx  xxxxx  0 Jul  6 22:15 foo
Run Code Online (Sandbox Code Playgroud)

第一列是inode编号;请注意,这两个文件是相同的。权限后的第一个数字是链接数;双方foobar具有2链接数,因为每个两个名字指的是同一个文件。

$ rm foo
$ ls -li bar
28098391 -rw-r--r--  1 xxxxxxx  xxxxx  0 Jul  6 22:15 bar
Run Code Online (Sandbox Code Playgroud)

rm foo仅删除指向基础文件的特定链接;bar仍然引用它(注意 inode 编号没有改变,但链接计数现在是 1 而不是 2)。另请注意,文件的“真实”名称既不是,foo也不bar是;foo首先创建的事实并没有使其特别。在删除所有链接之前(即,直到链接计数减少到 0),文件才真正被删除。即便如此,该文件实际上并未被删除;分配给该 inode 的块被简单地标记为可供文件系统重用。

  • inode *是以下意义上的文件:如果给定了 inode,您就知道这是什么类型的文件、它有多大、它具有哪些权限位以及它的所有数据都存储在磁盘的哪个位置。IOW,如果为您提供了 inode,则有关文件的所有内容都是已知的,*除了*其名称(正如@chepner 指出的那样,这可能不是唯一的)。您应该解决的是当您说“cat myfile”时会发生什么。简而言之:在当前目录中查找字符串“myfile”并获得文件的编号。从innumber,我们可以得到inode。从中我们可以得到其他一切。 (2认同)