2006 年 10 月 28 日 23 時 57 分

リパースポイント


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


NTFS のボリュームマウントポイントは、
ディレクトリに設定することができ、
リンクの処理は NTFS によって行われる。

そのため、一度設定したマウントポイントは、
OS を再起動しても維持されている。
また、ディスクを異なる PC に持っていっても、
リンク先のボリュームが存在すれば利用できる。

こんなことが可能なのは、リンク先に関する情報が、
ディスク自身に保存されているからである。

しかしながら、一般的にディレクトリが持てる情報は、
自分の中に含まれるファイルやサブディレクトリの情報や、
ディレクトリの属性や作成日時しかない。

そこで、NTFS はディレクトリに対して特殊な属性を持たせ、
拡張情報を追加することで対応している。

まず、マウントポイントとして機能するディレクトリには、
読み取り専用やシステム属性と同じように、
「リパースポイント」という属性が設定されている。

この属性は <winnt.h> ヘッダファイルに、
FILE_ATTRIBUTE_REPARSE_POINT として定義されており、
GetFileAttributes などの API で取得できる。

また、リパースポイントの属性を持つディレクトリには、
リパースタグという特殊な追加情報が関連付けられている。

リパースは、再解析という意味であり、
この属性が設定されたディレクトリは、
NTFS ドライバが特別な扱いをする。
その処理は、リパースタグの内容に沿って行われる。

リパースタグは、タグの種類とそのデータで構成されている。
NTFS は、リパースポイントを色々な用途に使えるように、
タグの種類によって機能を定義できるようにしている。

ボリュームマウントポイント機能は、
リパースタグに設定できる 1 つの種類に過ぎず、
そのタグの種類を表す値は、<winnt.h> に、
IO_REPARSE_TAG_MOUNT_POINT として定義されている。

他の種類のリパースタグもある。最新の開発キットには、
IO_REPARSE_TAG_SYMBOLIC_LINK なんて値も確認できる。
近い将来シンボリックリンクが実装されるのかもしれない。

ディレクトリに設定されているリパースタグの種類は、
FindFirstFile などの API で得ることができる。

ボリュームマウントポイントの場合は、
リパースタグのデータとして、
リンク先のパス情報を持っている。
つまり、以下のようなイメージである。

パス: d:\mnt\system
属性: FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_DIRECTORY
タグの種類: IO_REPARSE_TAG_MOUNT_POINT
タグデータ: Volume{2c4c2620-c203-11d9-a821-806d6172696f}

NTFS ドライバは、ディレクトリにアクセスする際、
この情報を元に、リンク先のボリュームを識別し、
ボリュームが、まるでディレクトリの配下にあるように
パスで扱うことができるように処理しているのである。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.