我正在尝试了解 HFS+,它一直提到“范围”。
维基百科
Fork 数据属性记录最多包含以下引用八个范围可以容纳更大的属性。扩展属性用于扩展 Fork 数据属性记录,当其八度记录已被使用。
- 什么是范围以及如何使用它?
- 使用范围的文件系统是否也使用集群?
- 范围和集群有何不同?
我读过 Wikipedia 中有关扩展区的条目,它只说:它们是保留内存的连续块。如果没有上下文,这没有任何意义。
答案1
(免责声明:我了解一般的文件系统,但并不特别了解 HFS。)
簇是一组作为一个单位分配的磁盘扇区。它通常是 2 的幂。例如,如果文件系统以 4 KB 为单位分配空间,但磁盘的物理扇区大小为 512 字节,则簇将对应于一组 8 个扇区。簇也称为“块”或“分配单元”。
简而言之,簇是文件系统中最小的存储单位,就像扇区是底层磁盘中最小的存储单位一样。它们可能相同(例如,文件系统使用 4k 簇,而磁盘的物理扇区为 4k),也可能不同(您可以创建具有 64k 簇的 FAT 文件系统,但没有磁盘的扇区这么大)。
区段是指磁盘上某处的连续簇范围,由起始簇号和长度(起始簇后有多少个簇)描述。它们用于跟踪文件内容在磁盘上的位置。理想情况下,文件的所有内容应存储在一个连续的区域中,以便可以通过单个区段记录来描述,但如果文件是碎片化的,则每个部分都由单独的区段记录来描述。
答案2
我认为 Apple 试图隐藏它,但可以在他们的开发者网站上找到 HFS+ 卷格式的完整技术描述:
以下是与您的问题相关的一些内容:
HFS Plus 以称为分配块的单位分配空间;分配块只是一组连续的字节。分配块的大小(以字节为单位)是 2 的幂,大于或等于 512,该大小在初始化卷时设置。如果不重新初始化卷,则无法轻易更改此值。分配块由 32 位分配块号标识,因此卷上最多可以有 2^32 个分配块。文件系统的当前实现针对 4K 分配块进行了优化。注意:为了获得最佳性能,分配块大小应为扇区大小的倍数。如果卷具有 HFS 包装器,则包装器的分配块大小和分配块起始也应为扇区大小的倍数,以实现最佳性能。
因此,基本上,微软在 FAT 和 NTFS 中称之为“簇”,而苹果在 HFS+ 中称之为“分配块”。这回答了你的第二个问题:是的,HFS+ 是一个同时使用扩展区和簇的文件系统的示例 分配块. 就此而言,NTFS 也使用范围和集群。
HFS+ 通过维护分叉区列表来跟踪哪些分配块属于分叉。区是分配给某个分叉的连续分配块范围,由一对数字表示:第一个分配块编号和分配块数量。对于用户文件,每个分叉的前八个区存储在卷的目录文件中。任何其他区都存储在区溢出文件中,该文件也以 B 树的形式组织。
因此,在 HFS+ 中,区段是用于存储文件*或文件的一部分的连续分配块。如果文件有碎片,则每个碎片使用一个区段。据我所知,这与 NTFS 内部讨论使用术语“区段”的方式相符。
*文件:从技术上讲,我应该在这里说“fork”,但由于没有人再使用资源fork,所以 HFS+ 为每个文件支持单独的“数据”和“资源”fork 的事实基本上只是历史错误。
答案3
关于范围\群集大小的一个非常重要的点是,尽管范围大小 = 4KB,您仍可以在 io 块大小为 512B 的文件中写入内容。
我们为什么要使用扩展区?这只是一种存储文件使用哪些块的信息的便捷方式。我们可以只存储扩展区的起始块地址,而不是存储有关硬盘上所有块的文件使用信息。当我们知道扩展区编号时,我们可以计算所有块的文件使用情况。计算出所有块的文件使用情况后,我们可以在文件内写入从 512B 到 4K(扩展区大小)的任意块大小。
因此,重点是,如果 FS=4K 的区段大小,这并不意味着所有 IO 写入操作都不能小于 4KB。不。如果需要,我们可以在文件内写入 512B,而不管区段大小如何。