什么是超级块,索引节点,牙科和文件?


125

从M. Tim Jones 撰写的Linux文件系统剖析文章中,我读到Linux从一组通用对象的角度查看所有文件系统,这些对象是superblockinodedentryfile。即使该段的其余部分解释了上述内容,我也不太满意该解释。

有人可以向我解释这些术语吗?

Answers:


136

首先,我意识到这不是您提出问题的术语之一,您必须了解meta。简而言之,元数据是关于数据的数据,并且从Wikipedia窃取。也就是说,元数据包含有关一条数据的信息。例如,如果我拥有一辆汽车,那么我会获得一组有关汽车的信息,但是这不是汽车本身的一部分。诸如注册号,制造商,型号,制造年份,保险信息等信息。所有这些信息统称为元数据。如您所见,在Linux和UNIX文件系统中,元数据存在于多个组织级别。

超级块基本上是文件系统元数据和定义了文件系统的类型,大小,状态信息,以及关于其他元数据结构(元数据的元数据)。超级块对文件系统非常重要,因此对于每个文件系统,超级块都存储在多个冗余副本中。超级块是文件系统的非常“高级”元数据结构。例如,如果分区的超级块/ var损坏,则操作系统无法挂载有问题的文件系统(/ var)。通常在这种情况下,您需要运行fsck它将自动选择超级块的备用备份副本,并尝试恢复文件系统。备份副本本身存储在整个文件系统中的块组中,第一个副本存储在与分区开始位置相距1个块的位置。如果需要手动恢复,这一点很重要。您可以使用以下命令查看有关超级块备份的信息,该信息dumpe2fs /dev/foo | grep -i superblock在尝试手动恢复时很有用。让我们假设dumpe2fs命令输出line Backup superblock at 163840, Group descriptors at 163841-163841。我们可以使用此信息以及有关文件系统结构的其他知识来尝试使用此超级块备份:/sbin/fsck.ext3 -b 163840 -B 1024 /dev/foo。请注意,在此示例中,我假设块大小为1024字节。

一个索引节点存在于,或上,文件系统和表示关于文件的元数据。为了清楚起见,Linux或UNIX系统中的所有对象都是文件;实际的文件,目录,设备等。请注意,在索引节点中包含的元数据中,没有人认为的文件名,这在以后很重要。索引节点实质上包含有关所有权(用户,组),访问模式(读取,写入,执行权限)和文件类型的信息。

一个目录项是由与索引节点号为文件名保存的inode和文件连接在一起的粘合剂。登齿在目录缓存中也起着重要作用,理想情况下,它可以保留最常用的文件以加快访问速度。文件系统遍历是Dentry的另一个方面,因为它维护目录与其文件之间的关系。

一个文件,除了是人们通常想到的带有单词的文件之外,实际上只是一个逻辑相关的任意数据块。考虑到所有已完成的工作(上面)以跟踪它们,这比较呆板。

我完全意识到,有几句话不能完全解释这些概念,因此请随时在必要时询问其他详细信息。


@Tok:会像这样转储(如答案中所示):备份超级块在163840,组描述符在163841-163841还是这样:备份超级块在163840,组描述符在163841-163842?那是拼写错误吗?:-)

@TOK:备份超级块在163840,组描述符在163841-163842,组描述符传达什么信息?

@Sen-理论上,组描述符可以跨越多个块,但是对于大多数桌面系统,您将看到它们仅占一个块,并被引用为$((BackupBlock + 1))-$((BackupBlock + 1))
Tok

@TOK:确定在我的系统我看到它像$((BackupBlock + 1)) - $((BackupBlock + 2))

@Sen-组描述符描述一个块组。这意味着什么?更多元数据。本质上,组描述符包含一个块位图(块分配位图的块号),一个inode位图(与inode相同),一个inode表(用于inode表的起始块的块号),空闲块和inode计数,以及使用的目录数。这些都是基于ext2文件系统的。组描述符对于正确的文件系统操作非常重要,并且与超级块一起复制。
Tok

49

文件

文件只是意味着以一定顺序排列的一堆字节。这就是普通人所说的文件内容。当Linux打开文件时,它还会创建一个文件对象,该对象保存有关文件存储位置和正在使用的进程的数据。关闭文件时,将丢弃文件对象(而不是文件数据本身)。

索引节点

索引节点(“索引节点”的缩写)是有关Linux存储的文件的一堆属性。每个文件都有一个索引节点(尽管对于某些文件系统,Linux必须创建自己的索引节点,因为信息分散在文件系统中)。索引节点存储信息,例如谁拥有文件,文件大小以及允许谁打开文件。每个索引节点还包含一个文件系统分区唯一的编号。就像该索引节点描述的文件的序列号一样。

牙科

Dentry(“目录条目”的缩写)是Linux内核用来跟踪目录中文件层次结构的工具。每个dentry都将一个索引节点号映射到一个文件名和一个父目录。

超级街区

超级块是文件系统中的唯一数据结构(尽管存在多个副本以防止损坏)。超级块保存有关文件系统的元数据,例如哪个inode是顶级目录以及所使用的文件系统的类型。


11

超级块,索引节点(或inode),目录条目(或dentry),最后,文件对象是虚拟文件系统(VFS)或虚拟文件系统开关的一部分。VFS的目的是允许客户端应用程序以统一的方式访问不同类型的具体文件系统。

VFS中主要对象的关系

在此处输入图片说明


一个索引节点是在Unix / Linux文件系统上的数据结构。索引节点存储有关常规文件,目录或其他文件系统对象的元数据。Inode充当文件和数据之间的接口。索引节点可以引用文件或目录或指向另一个对象的符号链接。它包含一个唯一编号(i编号),文件属性(包括名称,日期,大小和读/写权限)以及指向文件位置的指针。它与DOS / Windows世界中的FAT表相对应。

程序,服务,文本,图像等都是文件。根据系统,输入和输出设备(通常是所有设备)被视为文件

超级块是关于文件系统的高级元数据的容器。超级块是一种存在于磁盘(实际上,磁盘上有多个位置用于冗余)以及内存中的结构。它定义了文件系统的管理参数(例如,块总数,空闲块,根索引节点),为处理磁盘文件系统提供了基础。

Dentry是文件和Inode之间的接口。登齿在目录缓存中也起着作用,理想情况下,它可以将最常使用的文件保留在手边,以加快访问速度。

资源


5

简单来说,dentry和inode是同一件事,是文件或目录的抽象。dentry和inode之间的区别在于dentry用于促进特定于目录的操作,inode只是有关文件或目录的元数据的集合。Superblock是文件系统的抽象。

struct file在Linux内核中,会被重命名为其他名称(例如struct address_space),而不是真实的“文件”(例如/ etc / passwd)的抽象。它代表打开的“文件”或目录。struct filesys_open在内核中创建的,因此struct file同一文件的进程可以包含多个。

为什么我们需要牙科?它用于加速从路径名(例如/ etc / passwd)到inode的转换。Linux内核使用inode来操纵“文件”或目录,而不是它们的名称。


4

请注意,这些术语不是Linux特定的,而是文件系统特定的。当前的Unix和类似Unix的系统使用的大多数文件系统都是由原始Unix文件系统派生或受其启发的,该原始Unix文件系统定义了超级块和inode习惯用语。Linux还可以挂载几个没有超级块和/或inode概念的文件系统,最常见的是FAT。另一个ZFS不使用超级块,而使用überblock。


希望您能在很长时间后阅读此评论。我读到VFS的inode和超级块与EXT2的inode和超级块无关。因此,不要误解您的意思,由于每个Linux都有VFS,它们都应该使用inode和superblock,对吗?
CuriousKimchi

1
@CuriousKimchi尽管事实上它们在这里具有相同的名称,但是您不应混淆存储在磁盘(超级块/节点)上的信息以及内核用于访问文件系统及其文件的结构。每个文件系统在磁盘上都有一些描述文件系统特征的元数据,该元数据用于填充Linux VFS超级块结构。同样,文件在VFS下具有内核内inode结构。当基础文件系统缺少inode的概念时,此结构包含OS即时创建的虚假inode编号。
jlliagre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.