Spotlightについてわかったこと、更に追加

こんなカンジですか。買ったまま放置していたkeynoteがどれくらい使えるか試しがてら、ちょっとずつ情報を作成していこうかなと。

ファイルシステムの上では、3つの異なる情報が存在している。

  • 従来からあるメタデータである、カタログ。これは、ファイル名とか、更新日時とか、パーミッション
  • いわゆるファイルの本体
  • 今回新たに追加された、ファイルシステムレベルの拡張属性。これは、BSD層のAPIであるgetxattr/setxattr等でアクセスが可能

その上には、これらの3つの相異なるメタデータを統一的に管理する、Carbon/CocoaAPIが存在する。それが、MDItemなどのCarbon APIと、NSQueryなどのCocoa API。これらのAPIでは現状、Queryのみがサポートされている。恐らくMDItemSetAttributeといった非公開のAPIが存在する。Spotlight Metadata Attributesの流儀でデータを追加するためには、Plug-in形式のSpotlight Importerを作成し、ファイル内の属性からメタデータをセットする以外にない。

更に、メタデータの値を保存するだけではなく、索引を作成したりするためのサービスが動作している。これが、mds(meta data server)。これは、カーネルからnotifyを受けて動作をしはじめ、メタデータの更新や索引の作成を行う。

BFSでは、大きくないサイズのメタデータはファイルと同一のブロックに配置されたり、索引は更新と同期して自動的に作成されていたが、HFS+のアーキテクチャでは、ファイル本体、従来型のカタログ、拡張属性の3種類は全く別のデータブロックに存在している。キャッシュを無視して考えれば非常に性能上の問題を含んだ設計であるが、実際キャッシュが効いているとこれがどれくらい性能の足を引っ張っているかは分からない。