我真的不明白为什么我们需要索引节点。在搜索手册后,我了解到它存储了一些有关文件或目录的元数据。但这不已经是目录的作用了吗? (存储保存其大小、名称等的文件条目。)
答案1
这只是它的实施方式。
尝试设置一些目录的模式
将其设置为可读,但不可交叉:ug=r
。您将看到文件名,但看不到模式、文件大小等。
将其设置为可交叉,但不可读:ug=x
。您将无法看到名称,但如果您知道名称,那么您将能够获取模式、文件大小等。
为什么
将元数据保留在目录结构之外(因此它只是名称),可能会使其速度更快。没有必要处理大量的数据,那是不需要的。然后需要的时候就可以读取了。
每个索引节点可以有零到多个名称(可能在不同的目录中)。如果删除其名称,则该文件的名称将为零,但该文件仍由进程打开。它也可能有多个名称。
它使重命名更容易实现:为 inode 创建一个新的目录项(名称)(可能在不同的目录中),然后删除旧的目录项(名称)。
在较旧的文件系统中,目录有一个..
指向父目录的索引节点的条目。为此,允许单个文件使用多个名称(目录是一种文件类型)至关重要。不复制索引节点是一件好事(不可能出现不一致,减少浪费)。在现代文件系统(例如 ext3、ext4)上,这是(据我所知)模拟的。
答案2
“索引节点”,维基百科:
每个inode存储属性和磁盘块位置对象的数据
(重要的是位置,而不是大小)
目录是分配给 inode 的名称列表。目录包含其自身、其父目录及其每个子目录的条目。
当对象是常规文件时,它是叶子并且仅包含数据。目录的数据是其他文件列表,包括更多目录,它们本身包含列表等。
这一切都有实用的一面(空间、速度、稳健性)。 ReiserFS 似乎没有显式的 inode:
一些 Unix 风格的文件系统(例如 ReiserFS)省略了 inode 表,但是 必须存储等效数据以提供同等的能力。数据可以称为统计数据,参考向程序提供数据的 stat 系统调用。
我写了一段话来说明;我从 /sys 运行它。 Sysfs 的顶部 inode 是“1”(就像 proc 一样 - 它们都是已安装; “/”有“2”,这在ls -a DOT
)中显示为“2 ..”
for dir in . block bus; do echo -n "---[$dir]"; command ls -ali $dir | sed -E 's/( *\w ).*( \w*)/\1\2/' |head -5; done |sed "s/total .*/---/"
它列出了目录和两个子目录中的前四个条目,仅显示索引节点和名称(ls -ali
仅显示第一个和最后一个字段)。
---[.]---
1 .
2 ..
3321 block
8 bus
---[block]---
3321 .
1 ..
62233 ../devices/virtual/block/loop0
62347 ../devices/virtual/block/loop1
---[bus]---
8 .
1 ..
25390 ac97
3573 acpi
name
展平,例如对于带有,id
和的普通数据库表parent_id
这相当于:
"/" 2 2
sys 1 2
bus 8 1
block 3321 1
ac97 25390 8
文件(或任何条目)“ac97”的parentid=8。所以它属于“总线”。 (这是我用手指做的)
从技术上讲,同一目录(parentid)中的第二个“ac97”也可以,只要它获得唯一的 id。这与硬链接相反;路径名是不够的,你必须说/sys/bus/ac97 with inode xy
.没有人想要这样,所以你会得到“文件存在”,或者man 2 mkdir
很好地解释:
EEXIST pathname already exists (not necessarily as a directory).
This includes the case where pathname is a symbolic link, dangling or not
...因为即使是死链接也有(是?)目录。
目录就像文件一样,必须能够在不同的块上增长。层次结构为用户划分数据和系统。文件名是供用户使用的。系统的索引节点(索引节点编号)。硬链接是用户处理真实文件的方式,而不仅仅是文件的一个名称。
索引节点是用户目录结构和块上文件系统数据之间的粘合剂。
在经典意义上(“索引”偏移/外包元数据)它们是不需要的。
文章“btrfs”在“文件系统树”下有:
在每个目录中,目录条目显示为目录项,其[这些右侧键值]是[其CRC32C哈希值] 文件名。他们的数据是地点键,或索引节点项它指向。因此,目录项可以一起充当路径到 inode 查找的索引
文章树,首先消除歧义:
可以定义树形数据结构递归地作为一个节点集合(从根节点开始),其中每个节点是一个由值组成的数据结构,以及对节点的引用列表 (“子级”),其约束条件是没有重复的引用,并且没有一个指向根。
你是不是询问 NODE 前面的“i”代表什么。你是?
文章“链接列表”,“加快搜索速度”
另一种常见的方法是“指数”使用更高效的链表外部数据结构。例如,可以构建一个 红黑树或哈希表,其元素是对链表的引用节点。可以在单个列表上构建多个此类索引。缺点是每次添加或删除节点时(或者至少在再次使用该索引之前)可能需要更新这些索引。
难怪“i”在“inode”中代表的并不多,只是干巴巴的“索引”。