从M. Tim Jones撰写的《 Linux文件系统的解剖》一文中,我读到Linux从一组通用对象的角度查看所有文件系统,这些对象是超级块,索引节点,牙科和文件。即使该段的其余部分解释了上述内容,我也不太满意。
有人可以向我解释这些术语吗?

#1 楼

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

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

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

牙科是通过将索引节点编号与文件名相关联来将索引节点和文件保持在一起的胶水。登齿在目录缓存中也起着一定的作用,理想情况下,它可以将最常用的文件保留在手边,以加快访问速度。文件系统遍历是Dentry的另一个方面,因为它保持目录与其文件之间的关系。

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

我完全意识到,有几句话不能完全解释所有这些概念,因此请随时提出有关何时需要的其他详细信息。

评论


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

–森
2010-11-30 13:44



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

–森
2010-11-30 13:46

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

– ok
2010-11-30 13:47

@TOK:在我的系统中可以看到$(((BackupBlock + 1))-$((BackupBlock + 2))

–森
2010-11-30 13:52

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

– ok
2010-11-30 13:53

#2 楼

文件

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

Inode

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

Dentry

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

Superblock

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

#3 楼

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

VFS中主要对象的关系




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

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

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

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

来源

#4 楼

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

评论


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

–好奇的泡菜
16-12-29在4:50



@CuriousKimchi尽管事实上它们在这里具有相同的名称,但您不应混淆存储在磁盘(超级块/节点)上的信息以及内核用于访问文件系统及其文件的结构。每个文件系统在磁盘上都有一些描述文件系统特征的元数据,该元数据用于填充Linux VFS超级块结构。同样,文件在VFS下具有in in kernel inode结构。当基础文件系统缺少inode的概念时,此结构包含OS即时创建的虚假inode编号。

– jlliagre
16/12/29在7:35



#5 楼

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

在Linux内核中,struct file被错误命名为许多其他名称(例如struct address_space),而不是真实的“文件”的抽象(例如/ etc / passwd)。它代表打开的“文件”或目录。 struct file是由内核中的sys_open创建的,因此一个进程可以在同一个文件中包含大量struct file。为什么我们需要dentry?
它用于加快翻译的速度索引节点的路径名(例如/ etc / passwd)。 Linux内核使用inode来操纵“文件”或目录,而不是它们的名称。