第8回 HFS、HFS Plusの基本的概念【中編】:Undocumented Mac OS X(3/3 ページ)
Mac OS XのデフォルトファイルシステムHFS Plus。今回もHFSおよびHFS Plus共通の機能を解説していく。
ハードリンク
UFSやExt2といったいわゆるUNIX系ファイルシステムでは、複数のファイル名に対して同じiノードを対応づけることが可能であり、これを利用した特有の仕掛けがハードリンクだ(図4)。ハードリンクを使うと、複数のファイル名が同じファイルの実体を指すことができる。
図4 UFS、FFS、Ext2などでは、iノードの中にはファイル名はなく、ディレクトリエントリでiノードとファイル名の対応が行われる。この対応はn:1にすることが可能であり、これをハードリンクという。この例の場合、/path/to/Dir_1/foo.txtと/path/to/Dir_2/foo2.txtは異なるパスだが、まったく同じファイルを指し示す
似た実装に、Windowsのショートカット、Macのエイリアス、そしてUNIXのシンボリックリンクなどがあるが、これらは本体となるファイルに対する別名を定義するだけで、それぞれ本体のファイルを指定するためのデータ領域を必要とする。ハードリンクはそれぞれ対等で主従関係がなく、また消費するのはディレクトリエントリだけでそれ以上に領域を使用しないというメリットがある。
ハードリンクはそもそもiノードを使用したファイルシステム特有の仕組みであり、そのためHFS Plusではそうした枠組みは本来的には存在しない。しかしMac OS XはUNIXとしての側面も持つOSであり、ハードリンクが使えないというのはかなり問題となる。
このためHFS Plusファイルシステムレイヤーでは「kernel-level symbolic link」という機能を用意しハードリンクの代わりに用いている。
まず、通常にファイルが作成された場合、普通にファイルが作成される。こうしたすでに存在するファイルに対してハードリンクを作成しようとしたとき、そのファイル本体はHFS Plusファイルシステムレイヤーの持つ、/からたどることのできない、階層構造から外された隠しディレクトリにファイルを移動する。そして、リンク元、リンク先の双方にハードリンクファイルを作成するのだ。このハードリンクファイルは、クリエータに「hfs+」、ファイルタイプに「hlnk」という値を持ち、隠しディレクトリに隠されたファイルを指すように仕向けられている(図5)。
図5 HFS Plusではiノードのようにn:1の関係を作ることができない。このため、ハードリンクはカーネル内部のHFS Plusレイヤーで解釈される「kernel-level symbolic link」という仕組みで処理される。kernel-level symbolic linkでは、リンクを張られたファイルを通常見えない領域に移動、それぞれのリンクをHFS Plus内部で処理される「リンク」として配置する。この代替処理はユーザー空間からは検出できない。また、ハードリンクファイルのクリエータは「hfs+」、ファイルタイプは「hlnk」だが、これはMac OS XのHFS Plusでは見ることができない。OSを経由してこれらのファイルのクリエータやファイルタイプを取得しても、本来のファイルのクリエータやファイルタイプが返されてしまうためだ
すでにリンクのあるファイルにハードリンクを行った場合は、ただリンク先にハードリンクファイルを作成、リンクカウントを加算するだけだ。すべてのハードリンクファイルが削除された場合に限り、隠しディレクトリにある本来のファイルも削除される。
ハードリンクファイルから本来のファイルを探す処理はシステムコールより下の、HFS Plusファイルシステムレイヤーで行われるため、BSD、Carbon、CocoaのどのAPIからも本来のファイルとして扱われ、これをユーザーランドから検知する術はない*。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このページで出てきた専門用語
ユーザーランドから検知する術はない
Mac OS 9のようにHFS Plusを理解する、かつkernel-level symbolic linkに非対応のOSを使うことで検出できる。しかし、不用意にハードリンクファイルを操作するとリンクが壊れてしまうので、こうした古いOSでのアクセスはやめた方が良い。
本記事は、オープンソースマガジン2006年3月号「Undocumented Mac OS X」を再構成したものです。
関連記事
- 連載第1回 initを置き換えるlaunchd【前編】
UNIX使いに真のMACPOWERを! 本連載では、UNIX使いに向け、UNIX系OSとしてのMac OS Xを解説していく。記念すべき第1回では、initに代わるものとしてMac OS X Tigerで採用された、launchdを紹介しよう。 - 連載第2回 initを置き換えるlaunchd【後編】
- 連載第3回:plist(プロパティリスト)とFoundation【前編】
- 連載第4回:plist(プロパティリスト)とFoundation【後編】
- 連載第5回:OpenDirectory
- 連載第6回:迷走の痕跡を抱えるMac OS XのOpenDirectory
- 連載第7回:HFS、HFS Plusの基本的概念【前編】
Copyright © ITmedia, Inc. All Rights Reserved.