ジャンクションを使ってみる(その1)
2月15日の記事「ToClip と Truecrypt」で、暗号化ソフトの Truecrypt を紹介した。当然、私も普段使用しているのであるが、暗号化領域は個別のドライブレターが付いた仮想ドライブとして認識されるため、その点で少し使い難さを感じることがある。
具体的にどういうことかと言うと、例えば、私はフリーソフトは、C:\freesoft フォルダ以下にジャンル別のサブフォルダを作り、その下に置いているのであるが、2月15日の記事でも書いたように、例外としてクリップボード拡張ソフト「ToClip」を含むクリップボード関連のソフトだけは暗号化領域にインストールしている。従って、他のフリーソフトは全て C:\freesoft\ジャンル名\ の下にあるのに、クリップボード関連だけは(暗号化された仮想ドライブを Q とすると)、Q:\クリップボード\ の下にあるという少し気持ちの悪い配置になっている。
何とか全て C:\freesoft\ジャンル名¥ の下に統一する方法はないか?と思ったのがそもそもジャンクションを使い始めた動機である。(このような動機でジャンクションを使うのはむしろ少数派で、通常は、ディスク容量が足りなくなって外部ディスクを増設したときに、それらの増設領域を現行フォルダ以下にシームレスにつなげる目的で使用する方が多いと思う。)
これをWindowsで(正確には「NTFSファイルシステム」で)実現する方法の1つがジャンクションである。とは、言っても、暗号化する以上、ファイルの実体は Q ドライブに置くしかない。そこで、Q:\クリップボード フォルダ以下のサブフォルダやファイルに、C:\freesoft\クリップボード からでも同様にアクセスできるようにする方法がジャンクションである。(UNIXでいう シンボリックリンクである。)
また、この仲間に ハードリンクやボリュームマウントというものもある。
ハードリンクは、ファイルに対して別名をつけるものであり、UNIXでも Windwos(NTFS)でも利用可能である。また、ボリュームマウントは、例えば上で言う Q などのボリューム全体に、別のボリュームの特定のフォルダ以下(例えば、C:\Qfolder 以下)からアクセスできるようにする(フォルダ以下にぶら下げる)ものである。
厳密には、ジャンクションは シンボリックリンクとは違うものらしく、事実、Vista から、ジャンクションとは別物の 「ホンモノのシンボリックリンク」が導入されたとのこと。これらの違いなど詳細については、emk さんの以下のページが詳しい。
リンク/ジャンクション作成ツール
http://homepage1.nifty.com/emk/symlink.html
余談ではあるが、ジャンクションと(NTFSの)シンボリックリンクはどちらも NTFSの りパースポイント(reparse point)という仕組みを使って実装されているのだが、私は最近までこれを リバースポイント(reverse point)だと思っていた。リバースポイント(reverse point)でググっても結構引っかかるので、私以外にも勘違いしている人は多いようだ・・・
以下に、ハードリンクやジャンクション(このレベルでは、シンボリックリンクも同じ)のイメージと特徴を図で説明する。(あくまでもイメージなので細かいところに突っ込まないように・・・ )
NTFSファイルシステム
NTFSファイルシステムでは、MFT(マスターファイルテーブル)という領域内のレコードで、フォルダやファイルを1つづつ管理している。1つのレコードには、フォルダ名やファイル名の他にそれらの各種属性情報や、フォルダであればサブフォルダのレコードへのポインタ、ファイルであればファイルの実体のある外部クラスタ領域へのポインタ(インデクス情報)を保持している。
下図のように、各ボリュームのルートからこれらのポインタをたどって行くことで目的のファイルを探し当てることができる。
ハードリンク
ハードリンクというのは、MFTの中に、同じファイルの実体を指す、別のレコードを作成することで実現している。これにより、同じ実体が、異なる複数のパスおよびファイル名で参照されることになる。ファイルの実体側では、いくつのレコードからリンクを張られているかという数(リンク数)を管理しており、最後の1つのファイル(レコード)が削除される時に実体が削除される。なお、下図の点線は、外部クラスタ領域のインデクス情報によるリンクなので、他のボリュームの外部クラスタ領域にリンクすることはできない。すなわち、ハードリンクは、同一ボリューム内でのみ可能という制約がある。
ジャンクション
ジャンクションは、MFTのレコード中に別のパスの情報を記録しておき、そのパスへ強制的にリンクさせることで実現している。下図の例では、Q ボリューム内に実体のあるファイルに、C ボリュームからのリンクを作成している。ハードリンクと異なり、リンクされた側では「リンクされたこと」を管理してはいないので、この状態で、Q:\xx\yy フォルダを削除することも可能である。削除後に、C:\aa\bb\cc にアクセスすると「リンク先がない」旨のエラーとなる。
なお、エクスプローラで Q:\xx\yy フォルダを削除すると、それ以下のサブフォルダやファイルが削除されることは当然であるが、C:\aa\bb\cc フォルダを削除しても Q:\xx\yy フォルダ以下のサブフォルダやファイルが削除されてしまうので注意が必要だ。(マイクロソフトは「仕様」というのかも知れないが、限りなく不具合に近い代物だ。)
安全にリンクだけを消すには、DOS窓からRMDIRコマンドを使用する、次回の実践編で紹介するフリーソフトを導入する、などの手がある。(Vista からは、エクスプローラでの削除もOKになったようだ。遅すぎるぞ、マイクロソフト!!)
さて、長々と、ジャンクションやハードリンクの説明を書いたが、驚いたことに Windows では、これらをまともに使える手段が標準では提供されていない。そこで、フリーソフトの登場となるのであるが、これら実践編は次回と言うことで。
では。
【2009年6月13日追記】
その2 実践編をアップ。→ココ
| 固定リンク
コメント
「・・、C:\aa\bb\cc フォルダを削除しても Q:\xx\yy フォルダ以下のサブフォルダやファイルが削除されてしまうので注意が必要だ。」
と書いてある問題は7では解消されているということですか?
投稿: t | 2013年2月 9日 (土) 15時39分