Sen*_*Sen 144 filesystems terminology inode files
从M.?Tim Jones的文章Anatomy of the Linux file system 中,我读到 Linux 从一组通用对象的角度查看所有文件系统,这些对象是superblock、inode、dentry和file。尽管该段的其余部分解释了上述内容,但我对这种解释并不满意。
有人可以向我解释这些术语吗?
Tok*_*Tok 162
首先,我意识到这不是您问题中的术语之一,您必须了解metadata。简而言之,从维基百科中窃取的元数据是关于数据的数据。也就是说,元数据包含关于一条数据的信息。例如,如果我拥有一辆汽车,那么我有一组关于汽车的信息,但这些信息不是汽车本身的一部分。注册号、品牌、型号、制造年份、保险信息等信息。所有这些信息统称为元数据。正如您将看到的,在 Linux 和 UNIX 文件系统中,元数据存在于多个组织级别。
该超级块基本上是文件系统元数据和定义了文件系统的类型,大小,状态信息,以及关于其他元数据结构(元数据的元数据)。超级块对文件系统非常关键,因此每个文件系统都存储在多个冗余副本中。超级块是文件系统的一个非常“高级”的元数据结构。例如,如果分区的超级块 /var 损坏,则操作系统无法挂载相关文件系统 (/var)。通常在这种情况下,您需要运行fsck这将自动选择超级块的备用备份副本并尝试恢复文件系统。备份副本本身存储在分布在文件系统中的块组中,第一个存储在距分区开头的 1 个块偏移处。这在需要手动恢复的情况下很重要。您可以使用该命令查看有关 ext2/ext3/ext4 超级块备份的信息,该命令dumpe2fs /dev/foo | grep -i superblock在尝试手动恢复时很有用。让我们假设 dumpe2fs 命令输出行Backup superblock at 163840, Group descriptors at 163841-163841。我们可以利用这些信息,并附加知识有关文件系统的结构,尝试使用此超级块的备份:/sbin/fsck.ext3 -b 163840 -B 1024 /dev/foo。请注意,在本示例中,我假设块大小为 1024 字节。
一个索引节点存在于,或上,文件系统和表示关于文件的元数据。为清楚起见,Linux 或 UNIX 系统中的所有对象都是文件;实际文件、目录、设备等。请注意,在 inode 中包含的元数据中,没有人类想象的文件名,这在以后很重要。inode 主要包含有关所有权(用户、组)、访问模式(读取、写入、执行权限)、文件类型和包含文件内容的数据块的信息。
一个目录项是由与索引节点号为文件名保存的inode和文件连接在一起的粘合剂。dentries 还在目录缓存中发挥作用,理想情况下,它可以保留最常用的文件以加快访问速度。文件系统遍历是 dentry 的另一个方面,因为它维护目录与其文件之间的关系。
一个文件,除了是人们在看到这个词时通常会想到的东西之外,实际上只是一个逻辑相关的任意数据块。考虑到为跟踪它们所做的所有工作(以上),相对来说非常乏味。
我完全意识到几句话并不能提供对这些概念中的任何一个的完整解释,因此请随时在必要时询问更多详细信息。
pin*_*ept 56
文件
文件只是意味着按特定顺序排列的一堆字节。这就是普通人所说的文件内容。当 Linux 打开一个文件时,它还会创建一个文件对象,该对象保存有关文件存储位置以及哪些进程正在使用它的数据。文件对象(但不是文件数据本身)在文件关闭时被丢弃。
节点
inode(“索引节点”的缩写)是关于 Linux 存储的文件的一堆属性。每个文件都有一个 inode(尽管对于某些文件系统,Linux 必须创建自己的 inode,因为信息分布在文件系统中)。inode 存储诸如谁拥有文件、文件有多大以及允许谁打开文件等信息。每个 inode 还包含文件系统分区唯一的编号;它就像该 inode 描述的文件的序列号。
牙科
dentry(“目录条目”的缩写)是 Linux 内核用来跟踪目录中文件层次结构的工具。每个 dentry 将一个 inode 编号映射到一个文件名和一个父目录。
超级块
超级块是文件系统中唯一的数据结构(尽管存在多个副本以防止损坏)。超级块保存有关文件系统的元数据,例如哪个 inode 是顶级目录以及使用的文件系统类型。
Pre*_*raj 21
superblock,索引节点(或inode),目录项(或dentry),最后,文件对象是虚拟文件系统(VFS)或虚拟文件系统开关的一部分。VFS 的目的是允许客户端应用程序以统一的方式访问不同类型的具体文件系统。
VFS中主要对象的关系
一个索引节点是在Unix / Linux文件系统上的数据结构。inode 存储有关常规文件、目录或其他文件系统对象的元数据。inode 充当文件和数据之间的接口。inode 可以引用文件或目录或指向另一个对象的符号链接。它包含一个唯一编号(i 编号)、文件的属性,包括名称、日期、大小和读/写权限,以及指向文件位置的指针。它是 DOS/Windows 世界中 FAT 表的对应物。
程序、服务、文本、图像等都是文件。根据系统,输入和输出设备,通常是所有设备,都被认为是文件。
该超级块是关于文件系统的高级元数据的容器。超级块是一种存在于磁盘(实际上,磁盘上的多个位置以实现冗余)和内存中的结构。它提供了处理磁盘文件系统的基础,因为它定义了文件系统的管理参数(例如,块总数、空闲块、根索引节点)。
Dentry 是文件和 Inode 之间的接口。dentries 还在目录缓存中发挥作用,理想情况下,它可以保留最常用的文件以加快访问速度。
请注意,这些术语不是特定于 Linux 的,而是特定于文件系统的。当前 Unix 和类 Unix 系统使用的大多数文件系统要么源自定义超级块和 inode 惯用语的原始 Unix 文件系统,要么受其启发。Linux 还可以挂载几个没有超级块和/或 inode 概念的文件系统,最常见的是 FAT。另一个,ZFS,不使用超级块,而是使用超级块。
简单来说,dentry 和 inode 是同一个东西,是文件或目录的抽象。dentry 和 inode 的区别在于 dentry 用于促进特定于目录的操作,inode 只是关于文件或目录的元数据的集合。超级块是文件系统的抽象。
struct file,在 linux 内核中,被错误地命名为许多其他文件(例如struct address_space),并且不是真正“文件”(例如 /etc/passwd)的抽象。它代表打开的“文件”或目录。struct file是sys_open在内核中创建的,所以一个进程可以有很多struct files 用于同一个文件。
为什么我们需要dentry?它用于加快从路径名(例如 /etc/passwd)到 inode 的转换。Linux 内核使用 inode 来操作“文件”或目录,而不是它们的名称。