連載
» 2007年08月03日 00時59分 公開

第8回 HFS、HFS Plusの基本的概念【中編】Undocumented Mac OS X(2/3 ページ)

[白山貴之,ITmedia]

クランプ

 効率の良いエクステントの利用を考慮すると、HFS Plusではできるだけ連続領域が確保されるようにアロケーションブロックを割り当てることが望ましい。このためMac OS XのHFS Plusファイルシステムの実装では新しくエクステントを確保する際にはほかのエクステントの使用している領域ときっちり詰めて配置するのではなく、エクステントの伸張が可能なようにわざとすき間を空けて配置するようになっている。この、どれぐらい余白を作るかを指定する数値がボリュームヘッダにあるクランプ値だ。

 なお、クランプ値を用いて余白を作るのはあくまでMac OS X(およびMac OS 9)のHFS Plusファイルシステムの実装における挙動で、HFS Plusというファイルシステムの仕様ではないことに注意。

区切り文字

 これまでのMac OSではパスという概念が希薄であった。GUIからファイルを操作するとき、そこには「すでに見えているファイルかフォルダ」しかなく、ファイルをクリックされると「現在のフォルダのCNID」と「指定のファイル名」からカタログノードを検索、ファイルに関する情報を取得でき、一方フォルダを指定された場合は「そのフォルダのCNID」と「ファイル名をワイルドカード」にすることでそのフォルダに含まれるファイルを一覧取得する、それだけができれば良かったからだ。しかし、ユーザーの操作ではなくプログラム上からの処理などで複数のフォルダをまたがる操作をする場合には、UNIXやWindowsと同じパスによる指定が可能であった。

 このMac OSにおけるパスは「/」や「\」ではなく、「:」が区切り文字で、

:書類:Microsoft ユーザー データ:MSN Messenger 履歴


といった感じで表現される。なお、こうしたパスによる表現はできるだけユーザーに見せないというのが古いMac OSの推奨事項だったため、この表記はMac版のMicrosoft Officeの「最近使ったファイル」など少数の場面でしか見ることがない。

 こうした事由から、HFS Plusにおける区切り文字は「:」となっており、一方「/」や「\」は使用可能文字となっている。これはUNIXの標準的な仕様とは異なる。

 Mac OS Xでは、HFS PlusファイルシステムレイヤーからVFSを通じてより上位のBSDレイヤーにつながるところで、「:」と「/」の文字の置き換えを行っている。つまりUNIXのシステムコールからは「/」が区切り文字だが、HFS Plusのファイルシステムレイヤーでは「/」が「:」に置き換えられ、「:」が区切り文字になる。

 一方、旧来からMacを使っているユーザーには、例えば「原稿 1995/12/05」といった、「/」をファイル名に使う習慣がある。Mac OSではこれまで「/」を通常文字として扱っていたためだが、Mac OS Xへの移行で「/」が使えなくなると、そうしたユーザーから苦情が発生しうることが予想された。

 このため、CarbonおよびFinderではさらに「:」を「/」に置き換える処理を行っている。つまり、Finder上において「原稿 1995/12/05」となっているファイルは、UNIX的なパスでは「原稿 1995:12:05」となっており、システムコールへはこの文字列が渡される。そしてHFS Plusのレイヤーではもう一度「:」が「/」に直され「原稿 1995/12/05」というファイル名で検索がなされるのだ(図3)

図3 図3 パスに含まれる「/」と「:」の扱い

 かなりややこしい事態になっているが、GUIしか使わないユーザーには「/」は相変わらず使用可能文字であり、UNIXユーザーで「/」をファイル名に使う人はいないので、これが問題となることは極めて少ない。

 これは、やや美しさに欠けるが現実的な、いかにもMac OS X的な対処であるといえよう。

コラム1 HFSとHFS Plusの違い

 本文中にもあるように、HFS PlusではHFSにはないファイルのオーナーやパーミッションといった情報がつけ加えられている。それ以外にも各種管理情報のデータ長が長くなっており、より多く、より大きなファイルを管理できるようになっている。加えて、アトリビュートファイルによって、データフォークとリソースフォーク以外のフォークや属性を格納できるようになった。この機能は、TigerでサポートされたEA*やACL*に利用されている。

 しかし利用者にとっての最大の違いは、おそらくファイル名についてだろう。HFSではカタログノードにおけるファイル名の領域が32バイト固定であった。HFS PlusではUnicodeを用いてファイル名を記録するが、HFSでは各国ごとに別個の文字コードを使用しており、文字コード種別はボリュームヘッダに格納される。ファイル名はこの文字コードで解釈される。

 しかし、Mac OS自身にはこの文字コードを鑑みない処理が散見され、特に大文字小文字を区別せず(Case Insensitive)、ファイル名を検索する処理にそうした文字コードを無視してバイト列ごとに行うという、もはやバグといえるような仕様があり、「レモン」と「メロン」など本来異なるファイル名が同一視されるという問題があったことは有名である。

 HFS Plusではファイル名のための領域は255バイトまで拡張された上、そのファイル名はUCS2*で記録されることになっている。もちろん大文字小文字に関する処理も文字を正しく把握して行われ、過去のHFSのようなバグはない。

 Mac OS XにおいてはHFSはあくまで以前のMac OSとの互換性のためだけに存在する。名前こそ「Mac OS 拡張」ではあるが、実質的にHFS Plusがマックの標準フォーマットなのだ。


EA:Extended Attributesの略称で、拡張属性などと訳される。任意のファイルに対して、ファイル名やパーミッション、作成日付以外の属性を自在に付与する仕組みである。
ACL:Access Common Listの略称で、アクセス制御リストの意。パーミッションとは別の、より細やかなアクセスコントロールを行う機能で、エンタープライズ向けのUNIXではすでに一般的である。
UCS2:UCSは、Universal multiple-octet coded Character Setの略称で、ISO/IEC 10646として定められた国際文字集合。UCS2は、文字コードであるUnicodeを16ビットで表現したエンコーディング。

関連キーワード

Mac | Mac OS X | UNIX | カーネル


Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ