拡張ファイル属性

拡張ファイル属性または拡張属性 ("extended file attribute", "extended attribute", "xattr", "EA")は、ファイルシステムが解釈しないメタデータをユーザがファイルに結びつけることが出来るようにするファイルシステムの機能である。これに対し、通常のファイル属性(パーミッション、作成時間、更新時間など)はファイルシステムによって厳密に定義された目的を持っている。
一般的にフォークはファイルの最大サイズと同じくらいに大きくすることができるが、拡張属性の最大サイズはかなり小さい値に制限される。これの典型的な用途は、文書の著者、プレーンテキストの文字コード、誤り検出訂正符号などを保存することである。
実装例.
OS/2.
OS/2バージョン1.2以降のHPFSは拡張属性を考慮して設計された。また、DOSのFATファイルシステムも改造して拡張属性をサポートした。
FATパーティションを用いる他のOSと互換性を保つため、OS/2属性はルートディレクトリ上の一つのファイル「EA DATA. SF」に保存される。拡張属性をサポートするOSがディスクを管理する場合、通常このファイルはアクセス不能になる。ただし、DOSのようなOSだと簡単に操作できてしまう。拡張属性があるファイルやディレクトリは、この「EA DATA. SF」ファイルの内部で一つまたはそれ以上のクラスタを消費する。最初に使われる論理クラスタ番号は、ファイルやディレクトリを所有するディレクトリエントリに保存される。これは元々は未使用であった2バイトの中にある。この2バイトはFAT32ファイルシステム上では別の目的で使われる。従ってOS/2拡張属性はFAT32に保存することが出来ない。
OS/2バージョン2.0以降の一部の機能、すなわちワークプレース・シェル等は幾つかの標準化された拡張属性("EA"とも呼ぶ)を利用する。これには、ファイルタイプの識別、コメント、アイコン、ファイルのキーワードといった目的がある。
インタラプタ言語REXXで書かれたプログラムは、より高速な実行を行なうために、パース済みのコードを拡張属性に保存する。
Windows NT.
Windows NTは、OS/2と同じ方法でFATとHPFSで拡張属性をサポートする。NTFSファイルシステムもまたOS/2サブシステムに適応するよう、多くの有効なファイルフォークの一つとして拡張属性を保存するように設計された。OS/2拡張属性は、ネイティブなOS/2と同じ方法でいかなるOS/2プログラムにアクセスできるし、BackupReadとBackupWriteシステムコールを通せばいかなるWindowsプログラムへもアクセスできる。それらは特にInterix POSIXサブシステム上のNFSサーバでUnix風のパーミッションを実装するために利用される。
Linux.
Linuxのカーネル設定でlibattr機能が有効になっていれば、ext2、ext3、ext4、JFS、ReiserFS、XFSファイルシステムで拡張属性(略称: xattr)がサポートされる。いかなるレギュラーファイルも拡張属性のリストを持つことができる。それぞれの属性は名前とそれに対応するデータで表現される。その名前はNULL終端文字列でなければならず、直前に名前空間識別子とドット文字が付かなければならない。現在は四つの名前空間(user, trusted, security, system)がある。user名前空間には名前の付け方と内容に関する制限がない。system名前空間はカーネルが主にアクセス制御リストとして利用する。security名前空間は、例えばSELinuxが利用する。
拡張属性はカーネルバージョン2.6以降でサポートしているが、ユーザスペースのプログラムでは広く用いられていない。Beagleは拡張属性を利用しており、freedesktop.orgは拡張属性の利用を推奨している。
FreeBSD.
FreeBSD 5.0以降はUFS1とUFS2ファイルシステムで拡張属性をサポートする。いかなるレギュラーファイルも拡張属性のリストを持つことができる。それぞれの属性は名前とそれに対応するデータによって表現される。その名前はNULL終端の文字列でなけらばならず、小さな整数の名前空間識別子によって識別された名前空間の中に存在する。現在は二つの名前空間(user, system)がある。user名前空間には名前の付け方と内容に関する制限がない。system名前空間はカーネルが主にアクセス制御リストと強制アクセス制御として利用する。
OpenBSD.
OpenBSDのネイティブなfssファイルシステムは拡張属性をサポートしている。これらはフラグとして参照され、chflagsコマンドで制御できる。
Solaris.
Solaris 9以降ではファイルに「拡張属性」を持たせることができるが、これは事実上フォークである。事実上これらは内部的に通常ファイルのように保存/アクセスできる。なぜなら、それらの名前は「/」文字を含むことが出来ず、サイズは実用上無制限であり、所有権とパーミッションは親ファイルと別に設定できるからである。
NFSバージョン4はSolarisとほぼ同じ方法で拡張属性をサポートする。
Mac OS X.
Mac OS X v10.4以降は、名前付きフォークを使えるようにしたHFS+の属性ファイルのB*木機能を用いることで拡張属性をサポートする。HFS+内では名前付きフォークがエクステントを介することで任意の大量データをサポートできるにもかかわらず、OSはインライン属性しかサポートしない。これのサイズは単一のB*木ノードに納まるように制限される。いかなるレギュラーファイルも拡張属性のリストをもつことができる。HFS+は任意の数の名前付きフォークをサポートするが、Mac OSが拡張属性の数に何らかの制限をしているかどうかは不明である。それぞれの属性は名前とそれに対応するデータで表現される。その名前はNULL終端のUnicode文字列である。Mac OS XのAPIはファイルやディレクトリの拡張属性のリスト、取得、設定、削除をサポートする。