HFS+文件系统是目前的Apple电脑中默认的最常用的文件系统。HFS+来源于UNIX,但又不用于UNIX,它增加了许多新的特性,同时也有许多不同于Windows、UNIX等系统的概念。
HFS+把文件系统的“卷”称为“宗卷”。为了真正地融入Apple电脑的HFS+文件系统中,就要接受并适应这些概念,所以本书将使用Apple官方的定义方式讲解HFS+文件系统中的相关概念。
早期的Apple电脑使用MFS文件系统,它是一种平面文件系统。到了1985年9月17日,Apple发布了HFS文件系统,它取代了MFS成为Apple电脑上新的文件系统。
HFS即Hierarchical File System,是指分层文件系统,也被称为Mac OS Standard(Mac OS标准系统)。因为Apple系统所产生的数据与Windows、UNIX等系统有很大的不同,所以HFS文件系统能够支持更多的文件属性和双分支文件。每个文件的数据分支(Data Fork)和资源分支(Resource Fork)可以分开存储,数据分支用来存放原始数据,而资源分支则用来存放相应的参数。
1998年1月19日,Apple在其最新发布的Mac OS 8.1系统中推出了HFS Plus文件系统,也写作“HFS+”,同时HFS+文件系统也被称为Mac OS Extended(Mac OS扩展系统)。HFS+文件系统改善了HFS对磁盘空间地址定位效率低下的问题,并加入了很多新的改进。
2002年11月11日,Apple推出了Mac OS X v10.2.2版本,该版本在HFS+文件系统中增加了可选的日志功能,以提高数据的可靠性。但日志型的HFS+主要应用于Mac OS X的服务器中,客户端则需要通过命令行的方式访问日志型的HFS+文件系统。
2003年10月24日,在Apple发布的Mac OS X v10.3版本中,HFS+文件系统全面地支持日志功能,所有的HFS+宗卷将被默认为日志型HFS+文件系统,并且这种具有日志功能的HFS+宗卷被定义为“HFSJ”。
在Mac OS X v10.3版本中,Apple还推出了另外一种HFS+文件系统,称为“HFSX”。HFSX与HFS+几乎完全一样,只是在HFSX中支持大小写敏感,也就是说在HFSX中文件名将区分大小写。
那么如何分辨出Apple的宗卷是HFS+还是HFSX呢,这很容易,通过查看宗卷的卷头就可以分辨出来。具体方法将在下文的卷头结构讲解中详细介绍。
虽然当前版本的Mac OS仍旧支持HFS,但从Mac OS X版本开始,HFS宗卷不能作为启动的宗卷。
由于HFS文件系统早已淘汰,基本不再使用,所以本书不对HFS做更多的讲解,只把重点放在目前流行的HFS+文件系统上。
相对于HFS,HFS+文件系统主要有以下特点。
(1)支持更多的块
Mac系统把硬盘内的空间分为一个个的逻辑块(Logic Block),每个逻辑块大小为512字节,所以逻辑块其实就是扇区。文件系统中文件的分配单元并不是扇区,而是分配块(Allocation Block),每个分配块的大小为2N扇区,所以分配块也就相当于FAT文件系统及NTFS文件系统中的簇。
提示:在本站中我们把Mac系统中的分配块称为“块”。
HFS用16位记录块的数量,这样在一个宗卷中最多可以管理216个块。而HFS+用32位记录块的数量,所以一个宗卷中最多可以管理232个块。
对于相同大小的宗卷,块数增加了就意味着可以减小块的大小,这样就可以减少存储空间的浪费,同时也能够增加文件系统中存储文件的个数。
(2)支持更大的文件
在HFS文件系统中,文件的大小用32位描述,而在HFS+文件系统中用64位描述,所以能够支持更大的文件。
(3)支持更长的文件名
HFS文件系统的文件名只能达到31个字符的长度,而HFS+文件系统则支持255个字符长度的Unicode码文件名。
(4)支持更大的节点
HFS文件系统的节点大小为512字节,而HFS+文件系统则支持4096字节的节点。
HFS+文件系统中有5种特殊的文件,用来保存文件系统结构的数据性数据和属性,我们称这5个文件为“元文件”,它们分别是分配文件(Allocation File)、盘区溢出文件(Extents Overflow File)、编录文件(Catalog File)、属性文件(Attributes File)、启动文件(Startup File)。
HFS+文件系统的元文件只有数据分支,没有资源分支,它们的起始地址和大小都在文件系统的卷头中描述。
(1)分配文件(Allocation File)
分配文件的作用是描述文件系统中的块是空闲的还是已被占用,它相当于NTFS文件系统中的位图文件。
(2)盘区溢出文件(Extents Overflow File)
HFS+文件系统的“盘区”是为“分支”分配的一系列连续的块,并用“起始块号”和“块数”描述“盘区”的所在地址。对于一个用户文件,每个分支前8个盘区的信息保存在宗卷的编录文件中,如果文件的分支大于8个盘区,超出的盘区信息存放在“盘区溢出文件”中,文件系统只要通过跟踪“分支”的“盘区”就能确定块的具体归属了。
通过上面的描述可以看出,盘区溢出文件的功能实际上类似于UFS文件系统中的间接块指针。
另外,盘区溢出文件也可以为元文件保存除盘区溢出文件自身以外的其他附加盘区信息,不过有一个元文件例外,这个例外就是启动文件。如果启动文件需要的盘区数量大于在卷头中所描述的8个,也因此而需要用盘区溢出文件来保存的话,系统对它的访问就会变得很困难,也就无法达到快速启动的目的。所以,在实际中启动文件将单独保存,这样就不需要在盘区溢出文件中保存它的额外盘区信息了。
(3)编录文件(Catalog File)
编录文件用来描述文件系统内的文件和目录的层次结构,该文件内存储着文件系统中所有文件和目录的重要信息。
编录文件用B-树的形式组织目录结构,B-树能够快速而有效地在一个层次很多的大目录中寻找目标文件。
(4)属性文件(Attributes File)
属性文件的作用是保存文件及目录的附加信息,它的组织结构与编录文件一样,都采用B-树结构。
(5)启动文件(Startup File)
启动文件是一个为了从HFS+宗卷上启动非Mac OS系统而设置的元文件。
另外,在HFS+文件系统中还有一个特殊的文件,用来管理文件系统中有缺陷的块地址,该文件被称为“坏块文件”。
提示:坏块文件不属于用户文件,但它也不属于元文件,在文件系统的卷头中没有对其进行描述。