HFS+文件系統(tǒng)結(jié)構(gòu)原理分析
1. 引言
HFS+文件系統(tǒng)是HFS 文件系統(tǒng)的更新版本,它改進了HFS 文件系統(tǒng)的結(jié)構(gòu)和對數(shù)據(jù)管
理中存在的不足。HFS+文件系統(tǒng)的主要特點體現(xiàn)在以下幾個方面:
(1)采用32bit 記錄分配塊數(shù)量
HFS 和HFS+文件系統(tǒng)對磁盤卷采用分塊進行分配,將一個卷分成等大的分配塊。HFS
文件系統(tǒng)采用16bit 來記錄分配塊的數(shù)量,最多只能描述216個分配塊。而對于HFS+文件系
統(tǒng),采用32bit 來記錄分配塊的數(shù)量,最多能描述232 個分配塊。對于Mac 系統(tǒng)上的非空數(shù)
據(jù),都必須占用整數(shù)個分配塊,也就是說,即使一個數(shù)據(jù)只有一個字節(jié),也要占用一個分配
塊。而HFS+文件系統(tǒng)增大了每個卷分配塊的數(shù)量,可以使分配塊的單位空間更小,從而達
到減少存儲空間浪費的目的。
(2)目錄樹節(jié)點大小增加到4KB
HFS 文件系統(tǒng)的目錄樹節(jié)點大小為512 字節(jié),由于HFS+文件系統(tǒng)目錄樹索引節(jié)點需要
存儲附加指針和節(jié)點描述符兩個關(guān)鍵值,HFS+文件系統(tǒng)的目錄樹節(jié)點大小增加到4KB。
(3)單一文件大小得到提升
HFS 文件系統(tǒng)的單一文件大小上限為231bit,而HFS+文件系統(tǒng)的單一文件大小最大可
達到263bit。
(4)支持長文件名
HFS 文件系統(tǒng)對文件名最長支持到31 個字符,而HFS+文件系統(tǒng)對文件名采用Unicode
編碼,最長達到255 個字符。
2. 基本概念
不同文件系統(tǒng)的體系結(jié)構(gòu)和對數(shù)據(jù)的管理方式也都采用了不同的方式,每種文件系統(tǒng)都
有自己特有的一些結(jié)構(gòu)和文件,每種結(jié)構(gòu)和文件都有特定的意義和概念。
2.1 卷頭
卷頭內(nèi)存儲著各種與卷相關(guān)的信息,如卷建立的時間、卷大小等,每個HFS+都有必須
由一個卷頭,卷頭通常位于2 號扇區(qū)。卷頭有一個備份存儲在卷的倒數(shù)第二個扇區(qū)。
2.2 域溢出文件
HFS+通過跟蹤“叉”的“域”來確定哪些分配塊屬于這個“叉”。“域”是為“叉”分
1
配的一系列連續(xù)的分配塊,用分配塊號和分配塊的數(shù)量來描述。對于一個用戶文件,每個叉
的前8 個域的信息保存在卷的總目錄文件中,如果多于8 個,超出的其他域的信息保存在域
溢出文件中。
2.3 目錄文件
目錄文件用來描述卷內(nèi)的文件和目錄的層次結(jié)構(gòu),存儲著卷內(nèi)所有文件和目錄的重要信
息,采用B-tree 結(jié)構(gòu)可以快速的在目錄中尋找文件。
2.4 屬性文件
屬性文件的結(jié)果和目錄文件一樣,采用B-tree 結(jié)構(gòu),它的作用是用來保存文件或目錄的
信息。
2.5 壞塊文件
磁盤上的缺陷或受損位置由壞塊文件來記錄,以免文件系統(tǒng)對磁盤缺陷位置進行分配。
3. 文件系統(tǒng)總體布局
HFS+卷由七種類型的區(qū)域組成,分別為用戶文件、分配文件、目錄文件、域溢出文件、
屬性文件、啟動文件和未使用空間。HFS+卷開始和結(jié)尾分別保留1024bytes 和512bytes,卷
頭一般位于第二扇區(qū),并在倒數(shù)第二扇區(qū)有卷頭的備份。
4. 卷頭數(shù)據(jù)結(jié)構(gòu)
每個HFS+卷都有一個卷頭,它開始于1024 字節(jié)處,記錄著其他關(guān)鍵結(jié)構(gòu)位置和大小
的信息,在卷的倒數(shù)第二個扇區(qū),有一個卷頭的備份,用來在文件系統(tǒng)出現(xiàn)問題時進行修復(fù)。
卷頭的數(shù)據(jù)結(jié)構(gòu)如下表:
表1 卷頭數(shù)據(jù)結(jié)構(gòu)
Tab.1 Volume the first data structure
字節(jié)偏移(16 進制)字節(jié)數(shù)簡要說明
0000~0001 2 簽名
0002~0003 2 版本
0004~0007 4 屬性
0008~000B 4 最后裝載版本
000C~000F 4 日志信息塊
0010~0013 4 建立時間
0014~0017 4 修改時間
0018~001B 4 備份時間
001C~001F 4 最后檢查時間
0020~0023 4 文件數(shù)
0024~0027 4 文件夾數(shù)
0028~002B 4 分配塊大小字節(jié)數(shù)
002C~002F 4 總塊數(shù)
0030~0033 4 空閑塊數(shù)
0034~0037 4 下一分配塊號
2
5. 節(jié)點
在HFS+文件系統(tǒng)中,共有四種節(jié)點,分別是頭節(jié)點、圖節(jié)點、索引節(jié)點和葉節(jié)點。所
有的節(jié)點都具有相同的基本結(jié)構(gòu),主要包括三個部分,分別是位于節(jié)點開始處的節(jié)點描述符、
檔案列表和位于節(jié)點尾部的檔案起始偏移量列表。
5.1 頭節(jié)點
B-tree 文件的第一個節(jié)點就是頭節(jié)點,它包含整個B-tree 文件的基本信息。頭節(jié)點由頭
節(jié)點描述符和檔案列表組成,其中檔案列表包括B-tree 頭檔案、保留檔案和B-tree 位圖檔案。
5.1.1節(jié)點描述符的數(shù)據(jù)結(jié)構(gòu)
表2 節(jié)點描述符的數(shù)據(jù)結(jié)構(gòu)
Tab.2 Node data structure descriptor
5.1.2頭檔案的數(shù)據(jù)結(jié)構(gòu)
表3 頭檔案的數(shù)據(jù)結(jié)構(gòu)
Tab.3 The first file data structure
0038~003B 4 資源叉塊組大小
003C~003F 4 數(shù)據(jù)叉塊組大小
0040~0043 4 下一目錄ID
0044~0047 4 寫入計數(shù)
0048~004F 4 文檔編碼位圖
0050~006F 32 Finder 信息
0070~00BF 80 分配文件信息
00C0~010F 80 域溢出文件信息
0110~015F 80 目錄文件信息
0160~01AF 80 屬性文件信息
01B0~01FF 80 啟動文件信息
字節(jié)偏移(16 進制)字節(jié)數(shù)簡要說明
0x00~0x03 4 第一個圖節(jié)點的節(jié)點號
0x04~0x07 4 前一個節(jié)點的節(jié)點號
0x08~0x08 1 節(jié)點類型
0x09~0x09 1 節(jié)點在B-tree 結(jié)構(gòu)中的高度
0x0A~0x0B 2 頭節(jié)點中含有的檔案數(shù)
0x0C~0x0D 2 保留
字節(jié)偏移(16 進制)字節(jié)數(shù)簡要說明
0x00~0x01 2 本節(jié)點在B-tree 中的深度
0x02~0x05 4 根節(jié)點的節(jié)點號
0x06~0x09 4 所有葉節(jié)點總的檔案數(shù)
0x0A~0x0D 4 第一個葉節(jié)點節(jié)點號
0x0E~0x11 4 最后一個葉節(jié)點節(jié)點號
0x12~0x13 2 節(jié)點的大小字節(jié)數(shù)
0x14~0x15 2 索引或葉節(jié)點中一個key 的最大長度
3
5.2 索引節(jié)點
索引節(jié)點的檔案項使用key 結(jié)構(gòu),key 結(jié)構(gòu)包含一個key 長度(KeyLength),之后是key
本身,之后是檔案的數(shù)據(jù)內(nèi)容。
5.2.1 key長度
key 長度指的是緊跟在后面的key 的長度,不包含用以記錄其長度的這個數(shù)據(jù)本身所占
的空間。key 長度值的大小只有兩種,即1 個字節(jié)或者兩個字節(jié)。
5.2.2 key
key 的作用是說明本檔案項的一些基本屬性,如文件名等,對于B-tree 中節(jié)點的連接和
父子目錄及文件間的連接起重要作用。
5.2.3數(shù)據(jù)
數(shù)據(jù)總是起始于偶數(shù)字節(jié)并占用偶數(shù)倍字節(jié)數(shù),數(shù)據(jù)的格式取決于節(jié)點的類型。
5.3 圖節(jié)點和葉節(jié)點
(1)圖節(jié)點實在頭節(jié)點的位圖檔案無法完全記錄B-tree 中的所有節(jié)點的時候來存儲分配
數(shù)據(jù)。當使用圖節(jié)點來描述數(shù)據(jù)時,頭節(jié)點描述符中的0x00~0x03 字節(jié)處的fLink 位置指出
第一個圖節(jié)點的節(jié)點號。圖節(jié)點由節(jié)點描述符和一個位圖檔案組成。
(2)葉節(jié)點位于B-tree 結(jié)構(gòu)的最末端,由數(shù)據(jù)檔案組成,這些數(shù)據(jù)檔案同樣使用key 結(jié)
構(gòu)。從節(jié)點描述符0x08 字節(jié)處的值可以判斷一個節(jié)點是否為葉節(jié)點,葉節(jié)點此處的值為
“FF”。
6. 目錄文件
6.1 檔案項的key部分
(1)數(shù)據(jù)結(jié)構(gòu)
表4 檔案項key 數(shù)據(jù)結(jié)構(gòu)
Tab.4 File of key data structure
(2)詳細解釋
00~03:4 個字節(jié),文件或文件夾的父目錄ID。
04+:0~510 個字節(jié),描述該文件或文件夾在其父目錄中的名字,使用Unicode 編碼。
0x16~0x19 4 B-tree 中節(jié)點總數(shù)
0x1A~0x1D 4 B-tree 中未使用節(jié)點總數(shù)
0x1E~0x1F 2 保留
0x20~0x23 4 不使用
0x24~0x24 1 B-tree 類型
0x25~0x25 1 保留
0x26~0x29 4 B-tree 屬性標識
0x2A~0x69 64 保留
字節(jié)偏移(16 進制)字節(jié)數(shù)簡要說明
00~03 4 父目錄ID
04~05 2 文件夾名或文件名長度
06+ 0~510 文件夾名或文件名
4
6.2 檔案項的數(shù)據(jù)部分
6.2.1文件檔案項
(1)數(shù)據(jù)結(jié)構(gòu)
表5 文件檔案項數(shù)據(jù)結(jié)構(gòu)
Tab.5 Data file structure
(2)HFSPlusCatalogFile 結(jié)構(gòu)
struct HFSPlusCatalogFolder {
SInt16 recordType;
UInt16 flags;
UInt32 reservedl;
HFSCatalogNodeID fileID;
UInt32 createDate;
UInt32 contentModDate;
UInt32 attributeModDate;
UInt32 accessDate;
UInt32 backupDate;
HFSPluspermissions permissions;
FInfo userInfo;
FXInfo finderInfo;
UInt32 textEncoding;
UInt32 reserved;
HFSPlusForkDate dateFork;
HFSPlusForkDate resourceFork;
};
6.2.2文件夾檔案項
(1)數(shù)據(jù)結(jié)構(gòu)
字節(jié)偏移(16 進制)字節(jié)數(shù)簡要說明
00~01 2 檔案類型,文件檔案總為0x0002
02~03 2 文件夾位標志
04~07 4 保留
08~0B 4 文件自身的CNID
0C~0F 4 文件建立的時間和日期
10~13 4 文件最后修改的時間和日期
14~17 4 屬性時間
18~1B 4 最后訪問的時間和日期
1C~1F 4 文件備份的時間和日期
20~2F 16 文件夾許可
30~3F 16 用戶信息
40~4F 16 Finder 信息
50~53 4 文件命名編碼
54~57 4 保留
58~A7 80 數(shù)據(jù)叉存放位置及大小
A8~F7 80 資源叉存放位置及大小
5
表6 文件夾檔案項數(shù)據(jù)結(jié)構(gòu)
Tab.6 Data file folder structure
(2)HFSPlusCatalogFolde r 結(jié)構(gòu)
struct HFSPlusCatalogFolder {
SInt16 recordType;
UInt16 flags;
UInt32 valence;
UInt32 folderID;
UInt32 createDate;
UInt32 contentModDate;
UInt32 attributeModDate;
UInt32 accessDate;
UInt32 backupDate;
HFSPlusPremissions permissions;
DInfo userInfo;
DXInfo finderInfo;
UInt32 textEncoding;
UInt32 reserved;
};
6.2.3鏈接檔案項
(1)數(shù)據(jù)結(jié)構(gòu)
表7 鏈接檔案項數(shù)據(jù)結(jié)構(gòu)
Tab.7 Links to the file data structure
字節(jié)偏移(16 進制)字節(jié)數(shù)簡要說明
00~01 2 檔案類型,文件夾檔案總為0x0001
02~03 2 文件夾位標志
04~07 4 文件或文件夾數(shù)量
08~0B 4 文件夾自身的CNID
0C~0F 4 文件夾建立的時間和日期
10~13 4 文件夾最后修改的時間和日期
14~17 4 屬性修改時間
18~1B 4 最后訪問時間和日期
1C~1F 4 文件夾備份時間和日期
20~2F 16 文件夾許可
30~3F 16 用戶信息
40~4F 16 Finder 信息
50~53 4 文檔命名編碼
54~57 4 保留
字節(jié)偏移(16 進制)字節(jié)數(shù)簡要說明
00~01 2
檔案類型
0x0003 文件夾鏈接
0x0004 文件鏈接
02~03 2 保留
6
(2)HFSPlusCatalogThread 結(jié)構(gòu)
struct HFSPlusCatalogThread {
SInt16 recordType;
SInt16 reserved;
HFSCatalogNodeID parentID;
HFSUniStr255 nodeName;
};
7. 壞塊文件
壞塊文件是用來記錄那些有缺陷的不能正常存數(shù)數(shù)據(jù)的塊。壞塊文件用一個特殊的
CNID 作為域溢出文件中域檔案的key,當一個塊被標記為壞塊,擁有這個CNID 的域和壞
塊被添加到域溢出文件,壞塊則被分配文件標記為已使用,是文件系統(tǒng)不會再次使用它。壞塊文件不屬于用戶文件,它在目錄中沒有文件記錄,也不屬于特殊文件。
8. 屬性文件
屬性文件屬于特殊文件,同樣具有B-tree 結(jié)構(gòu),由一個長度可變的key 和三個數(shù)據(jù)記錄
類型組成。有兩種屬性類型,分別為叉數(shù)據(jù)屬性和域?qū)傩浴?/SPAN>
叉數(shù)據(jù)屬性由4 個字節(jié)的recordType來表示屬性數(shù)據(jù)檔案類型,由一個HFSPlusForkData
類型的theFork 記錄屬性數(shù)據(jù)存儲的大小和位置,同時保留了一個4 個字節(jié)的reserved。
域?qū)傩杂? 個字節(jié)的recordType 來表示屬性數(shù)據(jù)類型,由一個HFSPlusExtentRecord 類
型的extents 來描述屬性數(shù)據(jù)的前8 個域,同時保留一個4 個字節(jié)的reserved。
9. 總結(jié)
通過本文對HFS+文件系統(tǒng)的分析,可以看書HFS+文件系統(tǒng)對于HFS 文件系統(tǒng)在結(jié)構(gòu)
和管理方便的不足采取了有效的改進,使文件系統(tǒng)的性能得到了提升。HFS+文件系統(tǒng)已經(jīng)
取代了HFS 文件系統(tǒng)成為蘋果操作系統(tǒng)的主流文件系統(tǒng),但從現(xiàn)在專家和用戶的評價來看,HFS+文件系統(tǒng)任然存在一個不足。本文通過對HFS+文件系統(tǒng)結(jié)構(gòu)和數(shù)據(jù)管理的分析,為用戶初步的了解此文件系統(tǒng)提供了依據(jù),同時也為用戶了解和發(fā)現(xiàn)文件系統(tǒng)的優(yōu)點和不足提供了參考。