尝试设置一些目录的模式

尝试设置一些目录的模式

我真的不明白为什么我们需要索引节点。在搜索手册后,我了解到它存储了一些有关文件或目录的元数据。但这不已经是目录的作用了吗? (存储保存其大小、名称等的文件条目。)

答案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”中代表的并不多,只是干巴巴的“索引”。

相关内容