目录
前言:
一、文件系统存储方法基本原理和常见应用案例:
二、Windows FAT文件系统
2.1 概述
三、Linux EXT文件系统
3.1 基本原理
3.2 索引节点表(Inode Table)
3.2.1 索引节点表层次结构
3.2.2 间接索引表的大小和表项个数
四、NFS文件系统
前言:
为了在以块为基本单位的硬盘上,管理和存储数据长度不定长的文件,且能够实现不连续存储(在硬盘上连续存储数据的要求抬高了,硬盘上很难保证有连续大块的存储空间),操作系统想了很多的办法,采用了很多算法和数据结构来达成此目的。
一、文件系统存储方法基本原理和常见应用案例:
操作系统的文件系统:解决的是数据数据在内存和硬盘中进行映射的方法。
下面将详细介绍每种存储方法的基本原理和常见应用案例:
-
随机存取存储(Random Access Storage):
- 基本原理:随机存取存储方法将文件数据划分为块或扇区,并使用磁盘寻址技术实现对这些块的随机访问。每个块都有一个唯一的地址,可以通过地址直接访问块内的数据。
- 应用案例:Windows操作系统中常用的NTFS文件系统采用了随机存取存储方法。NTFS通过索引节点表(MFT)来管理文件,使用簇(Cluster)作为数据存储的基本单位,支持高效的随机读写和快速定位。
-
连续存储(Contiguous Storage)://不常见,早期文件系统
- 基本原理:连续存储方法将文件的数据连续地存储在磁盘上。文件在存储时被分配一段连续的物理空间,数据块按照顺序存储,形成一个连续的数据区域。
- 应用案例:早期的FAT文件系统和一些嵌入式设备常使用连续存储方法。这种方法对于传输速度要求较高的应用场景非常适用,例如音频和视频的播放器,因为可以连续读取文件数据以提供流畅的播放体验。
-
链接表存储(Linked List Storage):
- 基本原理:链接表存储方法使用链表结构来记录文件数据的存储位置。每个链表节点包含一部分文件数据和指向下一个节点的指针,通过遍历链表可以读取整个文件的数据。
- 应用案例:许多UNIX和类UNIX系统使用的文件系统,如EXT系列(如EXT2、EXT3、EXT4)和XFS,采用了链接表存储方法。这种方法可以高效地管理不连续的文件存储,适用于支持大文件和灵活的文件分配的场景。
-
文件分配表存储(File Allocation Table Storage):
- 基本原理:文件分配表存储方法通过维护一个文件分配表(FAT)来记录磁盘上每个块的使用情况和链表关系。FAT表中的每个表项对应一个块,记录了该块的使用状态和下一个块的地址。
- 应用案例:早期的FAT文件系统(如FAT16、FAT32)以及一些嵌入式设备中使用了文件分配表存储方法。这种方法简单且易于实现,适用于存储容量较小、对性能要求不高的应用场景。
-
索引节点存储(Indexed Node Storage):
- 基本原理:索引节点存储方法使用索引节点(inode)来记录文件和目录的元数据,包括文件属性和数据的物理存储位置。通过索引节点,文件系统可以快速定位和访问文件的数据。
- 应用案例:常见的UNIX和类UNIX系统(如Linux、Mac OS)所使用的文件系统,如EXT2/EXT3/EXT4、HFS+,采用了索引节点存储方法。索引节点结构允许快速访问和管理文件,适用于大型文件系统和复杂的数据结构。
-
日志结构存储(Log-structured Storage):
- 基本原理:日志结构存储方法通过将文件的修改操作以日志的形式记录下来,并按时间顺序追加到日志区域中。重放日志可以恢复文件系统的状态,实现高度的数据一致性和恢复能力。
- 应用案例:ZFS(Zettabyte File System)是一种常见的日志结构存储的文件系统,在大规模存储和高可靠性要求的场景下被广泛使用。ZFS使用了写时复制(Copy-on-Write)技术和数据校验来保证数据的完整性和可靠性。
这些文件系统存储方法的应用案例说明了不同存储方法的特点和适用场景。根据需求和应用场景的不同,选择合适的存储方法对于文件系统的性能、可靠性和效率非常重要。
二、Windows FAT文件系统
2.1 概述
FAT(File Allocation Table)文件系统是一种使用在许多操作系统中的文件系统,如Windows中的FAT16、FAT32以及有些可移动存储设备和嵌入式系统中的FAT12。
以下是FAT文件系统的原理和数据结构的简要说明:
-
分区和引导扇区:FAT文件系统以分区的形式存在于存储设备上,每个分区的开头有一个引导扇区(Boot Sector),包含分区的基本信息和引导代码。
-
文件分配表(FAT):FAT文件系统的核心是文件分配表(File Allocation Table),它是一个表格,用于记录文件在存储设备上的分配情况。每个表项记录着磁盘上的一个簇(Cluster)的状态,标识它的使用情况。
-
簇:FAT文件系统将存储设备分为一个个固定大小的簇(Cluster),每个簇由连续的扇区组成。FAT通过簇号来标识文件的存储位置,而不是直接使用物理磁盘块号。
-
目录项:FAT文件系统使用目录项(Directory Entry)来存储文件和目录的元数据,包括文件名、扩展名、属性、起始簇号等等。目录项以目录的形式组织,每个目录的起始位置都有一个特殊的目录项(根目录项)作为入口。
-
文件分配:文件在FAT文件系统中分配的方式是通过在FAT表中标记簇的使用情况。文件的第一个簇号存储在目录项中,然后通过在FAT表中依次查找下一个簇号来确定文件的完整存储位置。
-
空闲空间管理:FAT文件系统通过在FAT表中标记空闲簇来管理可用空间。标记为“未使用”的表项表示该簇是可用的,标记为“已使用”的表项表示该簇已被分配给文件或目录。
这些是FAT文件系统的基本原理和数据结构。通过使用FAT表来跟踪和管理文件的存储位置,FAT文件系统能够支持文件的读取、写入和删除。不同版本的FAT文件系统(如FAT12、FAT16和FAT32)在文件分配表的结构和大小、簇大小等方面略有差异,但基本原理是相似的。
三、Linux EXT文件系统
3.1 基本原理
Linux EXT(Extended File System)文件系统的基本原理和数据结构是构建在磁盘块、索引节点(inode)和数据块上的。下面是关于EXT文件系统的基本原理和数据结构的简要说明:
-
基本原理:EXT文件系统是一个层次化的文件系统,通过块设备(如硬盘)来存储文件和目录。它将磁盘分为若干个块组(Block Group),每个块组包含了文件系统的关键组件:超级块、组描述符表、索引节点表和数据块。其中最重要的是索引节点表。
-
超级块(Superblock):每个EXT文件系统都有一个超级块,存储文件系统的整体信息,如块设备的大小、块组数量、inode数量等等。它提供了文件系统的整体结构和配置信息。
-
组描述符表(Group Descriptor Table):组描述符表存储了每个块组的元数据信息,如空闲块数量、inode数量、位图地址等。它提供了块组级别的信息,帮助系统定位和管理块组。
-
索引节点表(Inode Table):EXT文件系统使用索引节点(inode)来记录文件的元数据信息,如文件大小、权限和时间戳等。每个文件和目录都有一个唯一的inode编号,通过inode可以快速地找到文件的元数据信息。
-
数据块(Data Block):数据块是用于存储文件的实际内容的区域。EXT文件系统使用不同大小的数据块,如4KB、8KB等,具体的块大小取决于文件系统的配置。文件的数据块通过inode中的指针链表来引用。
-
索引节点之间的关系:索引节点之间的关系是通过指针链表来建立的。一个索引节点中包含一组指针,指向数据块或其他索引节点。具体的指针链表结构有三级间接指针、二级间接指针和一级间接指针。
EXT文件系统的数据结构使得系统可以高效地管理文件和目录,快速定位和读取文件的元数据和内容。同时,EXT文件系统还实现了一些高级特性,如日志功能(journaling)以提高文件系统的可靠性和恢复能力,以及扩展属性(extended attributes)等。
需要注意的是,EXT文件系统是在Linux平台上使用的,而其他操作系统可能使用不同的文件系统。因此,在跨平台使用时应注意文件系统的兼容性和可能存在的差异。
3.2 索引节点表(Inode Table)
3.2.1 索引节点表层次结构
索引节点表(Inode Table)是文件系统中的一个重要的数据结构,用于存储文件和目录的元数据信息。索引节点表的内容和层次结构如下:
-
索引节点(Inode):索引节点表中的每个条目对应一个文件或目录的数据,称为索引节点。每个索引节点包含了文件或目录的元数据信息和指向数据块的指针。
-
文件或目录的属性:每个索引节点记录了与文件或目录相关的属性,如文件大小、所有者和所属组、访问权限、时间戳(创建、修改、访问时间)等。
-
文件类型和权限:索引节点中存储的文件类型信息可以标识文件是普通文件、目录、符号链接等。同时,索引节点还记录了与文件或目录相关的权限信息,如读、写和执行权限。
-
数据块的指针/索引:索引节点中包含了指向文件数据块的指针,用于快速定位和读取文件的实际内容。指针的数量和类型取决于文件的大小。
a. 直接指针/索引:索引节点中通常包含一些(如N个)直接指向文件数据块的指针。例如,对于小文件,索引节点可能直接指向文件的数据块。N个直接索引指向的数据块的大小为N * BlockSize,如BlockSize=4K字节。
b. 一级间接指针:对于较大的文件,索引节点可能包含一个一级间接指针,指向一个数据块,该数据块存储了更多的指针或索引,被称为一级间接索引块。索引块的大小是操作系统指定的,通常与数据块的大小相同,如4K。一个间接所有指向的数据块的个数为4K/4Bye=1K个数据块,则指向的数据块的大小= 4K/4 * 4K = 1K * 4K = 4M, 即一个间接块使得数据块的大小扩展了1K倍数 =》4M字节。
c. 二级间接指针:对于更大的文件,索引节点可能包含一个二级间接指针,指向一个二级索引块,该数据块存储了更多的一级间接指针,被称为二级间接索引块。索引块的大小是操作系统指定的,通常与数据块的大小相同,如4K或1K。 一个二级块在一级块的基础之上又扩展了1K倍数, 每个二级间接指针代表的数据块的大小为:1K * 1K * 4K = 4G字节。
d. 三级间接指针:对于非常大的文件,索引节点可能包含一个三级间接指针,指向一个数据块,该数据块存储了更多的二级间接指针索引块,被称为三级间接索引块。索引块的大小是操作系统指定的,通常与数据块的大小相同,如4K。 一个三级块在二级块的基础之上又扩展了1K倍数, 每个二级间接指针代表的数据块的大小为:1K * 1K * 1K * 4K = 4T字节。
通过索引节点表,文件系统可以按照层次结构组织和管理文件和目录的元数据信息。每个文件或目录对应一个索引节点,而索引节点中的指针链表(直接指针、间接指针和双重间接指针)指示了文件数据块的层次化结构。这种层次结构的设计提供了灵活性和效率,同时减少了索引节点表的大小和数据的存储开销,提高了文件系统的性能。
3.2.2 间接索引表的大小和表项个数
对于文件系统中的一级间接索引表(Single Indirect Index Table),它是一种用于扩展文件系统容量的指针结构。一级间接索引表存储了一级间接索引的指针,这些指针指向一级间接块。
一级间接索引表的内容可以描述为:
-
一级间接索引表条目:每个条目是一个指针,对应一个一级间接块。
-
一级间接块:一级间接索引表中的每个指针所指向的一级间接块是一个数据块,其中存储了多个指针。这些指针指向其他数据块,通常称为数据块指针。
-
数据块指针:一级间接块中的指针记录了文件分散存储在文件系统中的数据块的地址。通过这些指针,文件系统可以根据需要在存储介质上找到文件的相应数据块。
通过一级间接索引表的引入,文件系统可以处理比直接索引更大的文件,因为一级间接索引表存储了更多的指针,指向许多数据块。这进一步扩展了文件系统的存储容量和索引能力。
需要注意的是,一级间接索引表只是一种指针结构,其真正的内容是一级间接块。一级间接块中存储了数据块指针,这些指针才是实际用于查找和访问文件数据的关键。
总结而言,一级间接索引表在文件系统中用于扩展容量,存储了多个一级间接索引的指针。这些指针指向一级间接块,其中存储了数据块指针,提供了对大型文件的索引和访问能力。
一级间接块中的索引个数通常是由文件系统的设计和设置决定的。它取决于文件系统的块大小以及索引块中每个索引项所占用的空间大小。
在一个典型的文件系统中,一个数据块的大小是固定的,比如4KB或8KB。同时,每个索引项的大小也是确定的,通常是4字节或8字节,具体取决于文件系统的实现。以4KB索引块大小为例,每个索引项的大小为4直接,则索引项的个数为:4KB/4B = 1024 = 1K 个索引项。
因此,计算一级间接块中索引的个数可以按照以下步骤进行:
-
确定每个索引项的大小:根据文件系统的实现,确定每个索引项所占用的空间大小。
-
确定一级间接块的大小:根据文件系统的块大小,确定一级间接块的大小。
-
计算索引的个数:一级间接块的大小除以每个索引项的大小,得到一级间接块中索引的个数。
需要注意的是,由于文件系统需要保留一些元数据信息,一级间接块中实际可用的索引项数量可能会略少于计算得到的索引个数。
文件系统设计人员在确定文件系统的块大小和索引项大小时,需要综合考虑文件系统的性能、存储效率和对大文件的支持能力等因素。大块和较大的索引项可以增加文件系统的容量和性能,但会带来存储空间的浪费;小块和较小的索引项可以提高存储空间利用率,但可能限制了文件系统的最大容量和大文件的支持能力。因此,文件系统设计者需要在权衡这些因素的基础上选择适当的块大小和索引项大小。
四、NFS文件系统
NFS(Network File System)文件系统的原理和数据结构主要涉及以下几个方面:
-
服务器和客户端交互:NFS采用客户端-服务器模型,其中NFS服务器存储文件和目录,并提供对这些文件和目录的远程访问。 客户端通过网络连接到NFS服务器,并通过特定的协议进行交互,如RPC(Remote Procedure Call)协议。
-
文件句柄(File Handle):在NFS中,文件和目录通过唯一的文件句柄进行标识。文件句柄是一个由服务器生成的固定大小的唯一标识符,用于识别特定的文件或目录。当客户端发送访问请求时,它将使用文件句柄来标识所需的文件或目录。
-
NFS协议:NFS采用基于请求和响应的协议进行通信。客户端向服务器发送请求消息,包括操作类型(如读取、写入、创建、删除等),以及相关的参数,如文件句柄和偏移量等。服务器接收请求,并执行相应的操作,然后将结果封装为响应消息发送回客户端。
-
数据缓存:为了提高性能,NFS客户端采用了数据缓存机制。当客户端首次读取文件时,它会从服务器获取文件的内容,并将这些数据缓存在本地。这样,当下次需要访问相同的文件时,客户端可以直接从本地缓存中读取数据,而无需再次请求服务器。
-
权限和访问控制:NFS使用Unix/Linux样式的访问权限和安全机制来保护共享的文件和目录。服务器可以设置访问权限,例如所有权和权限位,以控制对文件的读写访问。客户端必须具有适当的权限才能执行访问操作。
-
锁定机制:NFS支持锁定(locking)机制,用于协调对同一文件的并发访问。为了避免并发冲突,客户端可以在读取或写入文件时,请求文件的锁定。服务器将根据锁定请求来协调访问,并确保文件的一致性和完整性。
-
挂载和导出:在NFS中,服务器上的文件和目录需要被导出(export),以便客户端可以挂载(mount)并访问它们。服务器上的导出定义了可以被哪些客户端挂载的共享资源以及响应的访问权限。
NFS的数据结构和实现涉及到文件句柄的生成和管理,客户端的缓存机制,服务器端的导出配置和请求处理等。这些机制和数据结构的设计旨在提供高效、可靠的文件共享体验,并确保共享操作的一致性和安全性。