カタログノードには、8つのエクステントが記録される。8つ以下のエクステントで表現されている限りは、ディスクの連続領域に対する直接参照となるため高速にアクセスできる。しかし、ディスクの断片化が進んだ、またあるいはファイルが非常に大きくなってくると連続領域が確保できなくなり、8つのエクステントでは足りなくなることもある。そんなときに使われるのがエクステントオーバーフローファイルだ。 エクステントオーバーフローファイルは、カタログファイルと同じB-Tree構造を持つ。そのキーとなる構造(HFSPlusExtentKey)はファイルのCNIDに加え、どのフォークなのか、そしてファイルの先頭から通算で何アロケーションブロック目からを格納しているか(startBlock)を格納している(リスト4)。
/* HFS Plus Extent key */
struct HFSPlusExtentKey {
u_int16_t keyLength; /* length of key, excluding this field */
u_int8_t forkType; /* 0 = data fork, FF = resource fork */
u_int8_t pad; /* make the other fields align on 32-bit boundary */
u_int32_t fileID; /* file ID */
u_int32_t startBlock; /* first file allocation block number in this extent */
};
typedef struct HFSPlusExtentKey HFSPlusExtentKey;
このキーでエクステントオーバーフローファイルを検索すると、また8つのエクステントを取得できる。16のエクステント以上になった場合は、またエクステントオーバーフローファイルを検索する。このとき、startBlockが加算されているため、別のキーになることに注意されたい。
エクステントによる効率の良いディスク領域の管理と、カタログファイルのB-Treeを用いた強力な検索能力を伴うファイル情報の管理、この2つがHFS Plusの要だ。
今回紹介したもの以外にもHFS Plusにはいろいろと興味深い機能や仕様がある。次回は、そうしたものをトピックごとに説明しよう。
本記事は、オープンソースマガジン2006年2月号「Undocumented Mac OS X」を再構成したものです。
Copyright © ITmedia, Inc. All Rights Reserved.