次のページ 前のページ 目次へ

7. Macintosh Hierarchical Filesystem - HFS

Macintosh のフロッピーディスクを除く全ての記憶デバイスは 1 つまたは 複数のボリュームにパーティション分割されています.ボリュームは 4 つの 要素を持つことができます.すなわちファイル,ディレクトリ, ディレクトリスレッド,ファイルスレッドです.各要素は,UNIX の i-ノード に似たカタログレコードによって記述されます.カタログレコードは ディスク上のカタログ B-ツリーにまとめられています.ディレクトリの内容 はカタログ B-ツリーを検索して得られます.カタログレコードの外部に場所 を取るのはファイルだけです.

Macintosh の「ファイル」は 2 つの要素,すなわちフォークを持ちます. リソースフォークはコードセグメント,メニュー要素,ダイアログボックス等 を持つインデックス付けされたファイルで,データフォークは UNIX のファイ ルの内容と同じセマンティクスを持つ「バイトストリーム」です.それぞれの フォークは 1 つまたは複数の範囲か,あるいは連続した範囲を持つブロックか らなります.範囲指示子(extent descriptor)は範囲の開始ブロックと長さを 32 ビット長に エンコードしたものです.それぞれのフォークの最初の範囲レコード (領域指示子 3 つ)はファイルのカタログレコードの一部です.それ以降の 範囲レコードは全て範囲オーバーフロー B-ツリーに保存されます.

ファイルと B-ツリーが持つ範囲に加えて,ボリュームには 2 つの起動ブロック, 1 つのボリューム情報ブロック,1 つの空き容量ビットマップも含まれていま す.ディスクのデータ構造にはかなりの量の冗長性があるので,クラッシュから の復帰もより頑健に行えます.これは厳密にはファイルシステムの一部ではな いのですが,いくつかのカタログレコードのフィールドがファインダー(ユーザ からのファイルシステムへのアクセスを処理し,アプリケーションとデータ ファイルの関係を自動的に管理するプログラム)と排他的に使われるように 予約されていることは覚えておくべきです.したがって,HFS はファインダー の情報も管理しなければなりません.

HFS ボリューム上のそれぞれのファイルとディレクトリは,UNIX ファイルシステムの i-ノード番号に似た識別番号を持っています.しかし, ファイルまたはディレクトリを指示するのには,それらの親の識別番号とそれ ら自身の名前(NULL を含んでもよい 32 文字の文字列)を使います. この組み合わせはボリュームのカタログ B-ツリーを検索するための検索キー となります.カタログ B-ツリーは,B-ツリーの各レベルの全てのノードが 二重リンクリストの形になるように互いにリンクされている点と,全ての レコードは葉ノードにある点が伝統的な B-ツリーとは異なります. この変形 B-ツリーを用いると,リンクリストを使って葉ノードを調べること で同じディレクトリのたくさんの要素にアクセスできるようになります. 厳密に言うと,HFS の B-ツリーは B+-ツリーの変形ですが,Apple の 技術文書ではこれを B*-ツリーと呼んでいます.

ルートディレクトリを含むそれぞれのディレクトリはディレクトリスレッドを 持っています.ディレクトリスレッドは空のファイル名を持っています. ディレクトリスレッドレコードはディレクトリ名とそのディレクトリの親の ID を持っています.同様に,ファイルスレッドはファイルの名前とファイル が置かれているディレクトリの ID を持っています.全てのディレクトリは ディレクトリスレッドを持たなければなりませんが,ファイルスレッドはほと んど使われていません.実際にはどちらも HFS の冗長性の例になりますが―― 障害のないツリーの場合はスレッドは厳密には必要ありません.ファイルレコード とディレクトリレコードはどちらもファインダーが使う 32 バイトの情報を持っ ています.カタログ B-ツリーに対する最初の 3 つの範囲指示子はボリューム 情報ブロックに保存されます.もしカタログ B-ツリーファイルがこの 3 つの範囲 よりも大きくなったら,残りの範囲指示子は範囲オーバーフローに保存されま す.

HFS と HFS+ (Sequoia とも呼ばれます)ファイルシステムに関する文書はよく整備 されています.HFS について最も役に立つ技術情報は書籍の Inside Macintosh シリーズに載っています. http://developer.apple.com/techpubs/mac/Files/Files-99.html を見てください.HFS+ ファイルシステムは Technote 1150 で説明 されています.これは http://developer.apple.com/technotes/tn/tn1150.html からオンラインで入手できます.他の技術文書にもたくさんの情報があります. Paul H. Hargrove が集めたリンクを以下に示します:

7.1 Linux から HFS にアクセスする方法

7.2 OS/2 から HFS にアクセスする方法 (HFS/2)

HFS/2 を使うと OS/2 のユーザは HFS でフォーマットされたディスク上のファ イルの読み書きを透過的に行えます. HFS/2 を使うと Macintosh のフロッピーディスクは単に普通の フロッピーディスクのように使えます.

このプログラムの開発はもう止まっています.なぜなら,作者が OS/2 を使わ なくなったからです.このプログラムのメンテナンスをするつもりがあれば,作者に連 絡してください.

7.3 Windows 95/98/NT から HFS にアクセスする方法(HFV Explorer)

Windows NT と Windows 9x 用の HFS ボリュームブラウザは hfsutils を ベースにしています.Launch pad は Windows 上で動く全ての主要な Macintosh エミュレータに対応しています.

7.4 DOS から HFS にアクセスする方法 (MAC-ETTE)

Mac-ette は HFS 形式の 1.4MB のフロッピーを PC に付いている 3.5 インチ の高密度フロッピーディスクドライブで読み書き,フォーマット,複製できる PC 用ユーティリティです.

7.5 HFS utils

hfsutils パッケージは hformat, hmount, hdir, hcopy 等のコマンドライン ユーティリティ群を含むパッケージです.このユーティリティを使うと HFS ボリューム上にあるファイルやディレクトリを読み書きできます.

7.6 MacFS: 移植性の高い Macintosh ファイルシステムライブラリ

これは色々な OS やプラットフォームに移植できる Macintosh ファイルシステム対応ライブラリです.このライブラリは ユーザレベル API を作るのに十分なプログラミングインタフェースと これらに対応するための OS 用のシステムドライバを提供します. 作者はこのようなユーザレベル API とそれを元にしたユーティリティ プログラム,それから UNIX 用の実験的な仮想ファイルシステムの実装とテス トを行っています.作者は Macintosh HFS とその実装についても説明してお り,その設計がリエントラント性に向いていないこととデータ構造が複雑なた めに複数のプログラムが動作する環境では実装が遅くなってしまうことを述べ ています.性能測定によると,作者らの実装はリクエストのサイズが小さい場 合にはファイルの作成,削除,削除がネイティブの Macintosh の実装よりも 高速ですが,Berkeley Fast File System (FFS) よりは遅いことがわかってい ます.しかし,ネイティブの Macintosh の実装は大量の読み書きについては 作者らの実装と FFS のどちらよりも高速に動作します.


次のページ 前のページ 目次へ