NTFSリンクは、 Windows NTファミリーに属するすべてのMicrosoft WindowsバージョンのデフォルトファイルシステムであるNTFSファイルシステムで使用される抽象化であり、パス名と特定の種類のメタデータをNTFSマスターファイルテーブル(MFT)のエントリに関連付けます。NTFSは、ファイルデータとメタデータの保存および参照方法において、一般的なUnixファイルシステムに類似したパターンを広く採用しています。最も大きな違いは、NTFSではMFTがinode(インデックスノード)の「代わり」となり、一般的なUnixファイルシステムでinodeが果たす機能のほとんどを果たしている点です。
NTFSでは、ファイルシステム内のエンティティは基本的にNTFSボリュームのMFTに格納されるレコードとして存在します。MFTはNTFSファイルシステムの中核となるデータベースであり、そのレコードに関連付けられた属性やNTFSストリームも格納されます。NTFSにおけるリンクはそれ自体がMFTに格納されるレコードであり、別のMFTレコード(リンクのターゲット)を「ポイント」します。リンクはボリュームの階層的なファイルツリーにおけるファイルの「エントリ」であり、例えば次のようなNTFSパス名です。\foo.exeまたは\foobar\baz.txtリンクです。これらのパス名を含むボリュームがD:Windowsシステムでは、これらは次のように参照されます。D:\foo.exeそしてD:\foobar\baz.txt(典型的な Unix ファイル システムと比較すると、リンクはディレクトリ内のエントリであり、ディレクトリ自体はファイル システムに格納されるファイルの一種であり、別のリンクまたは inode を指します。)
NTFSには4種類のリンクがあります。これらは、一般的なハードリンクとソフトリンクの概念に対応しています。
ハードリンクの動作は典型的です。ハードリンクはMFTレコードを「指し示します」。このターゲットレコードは、テキストファイルや実行ファイルなどの「通常の」ファイルのレコードになります(NTFSボリュームが通常の「健全な」状態にあると仮定した場合)。一般的なUnixファイルシステムでは、ハードリンクはinodeを指し示します。このようなファイルシステムと同様に、NTFSハードリンクはディレクトリを指すことはできません。
NTFSボリューム上の典型的な新しいファイル作成イベントは、NTFSが新しいファイルエンティティのファイルメタデータ(ファイルに割り当てられたデータクラスタとファイルのデータストリームを含む)を保存するための1つの新しいMFTレコードを割り当てて作成し、最初の新しく作成されたMFTレコードをターゲットとして指すハードリンク用の1つのMFTレコードを作成し、ディレクトリファイルにハードリンクへの参照を保存し、これらのMFTレコードの両方の参照カウントを設定するだけです。 1ファイル作成イベントで指定されたファイル名はすべてハードリンクに保存されます。MFTレコードは最大1024個のハードリンクのターゲットにすることができます。既存のMFTレコードをターゲットとする新しいハードリンクが正常に作成されるたびに、ターゲットの参照カウントが増加します。
対称的に、ハードリンクを削除するときにNTFSが典型的なファイル削除イベントで実行する即時タスクは、リンクを含むディレクトリファイル(該当する場合はルートディレクトリ)からリンクへの参照を削除することと、 1リンクの対象となるMFTレコードの参照カウントと、ハードリンク自体を含むエントリの参照カウント。現在参照カウントが 0は、現在「削除」状態にあります。関連するすべてのリソースは NTFS によって「空き」とみなされ、必要に応じて自由に上書きして使用できます。
ジャンクションポイントはNTFSの再解析ポイントであり、UnixやLinuxのシンボリックリンクと同様に動作しますが、ディレクトリに対してのみ定義され、ローカルファイルシステム上の絶対パスのみで指定できます(アクセス先のリモートファイルシステムとは異なります)。ジャンクションポイントはハードリンクと同様に作成され、動作しますが、対象ディレクトリの名前変更、移動、または削除が行われると、リンクは無効になります。[ 1 ] [ 2 ]
シンボリックリンクは、ジャンクションポイント(UnixやLinuxのシンボリックリンク)と同様に動作する再解析ポイントであり、ディレクトリだけでなく、相対パスやファイルへのパスも受け入れます。ディレクトリとUNCパスのサポートはNTFS 3.1で追加されました。
すべてのNTFSリンクは、アプリケーションに対して透過的であるように設計されています。つまり、リンクにアクセスするアプリケーションは、ファイルシステムドライバによってシームレスにリダイレクトされ、特別な処理は必要ありません。ユーザーからは、通常のディレクトリまたはファイルとして表示されます。これにより、エイリアシング効果も発生します。つまり、リンクへの書き込みは、その書き込みを基盤となるリンクファイルまたはMFTエントリに渡します。
シンボリックリンクには、リンク先のディレクトリまたはファイルへのパスと、その動作を実装したドライバを識別するタグが含まれます。パスを記録するため、他のボリューム上のファイルやリモートファイルにもリンクできます。ただし、これは、参照先のファイルが削除または名前変更された場合、リンクが無効になることも意味します。また、参照先のファイルまたはディレクトリが別のファイルに置き換えられた場合、リンクは新しいファイルまたはディレクトリを参照するようになります。
NTFSシンボリックリンクは、通常拡張子が である通常のファイルであるWindowsショートカットファイルとは異なります.LNK。後者は任意のファイルシステム(以前のFAT32など)上に作成でき、メタデータ([リンクの削除]でショートカットを表示したときに表示されるアイコンなど)を含む場合があり、アプリケーションに対して透過的ではありません。
CygwinやMinGWなどの Windows 用のUnixライクな環境の実装では、ホスト オペレーティング システムがシンボリック リンクをサポートしていない場合でも、ショートカット ファイルを使用してシンボリック リンクをエミュレートできます (そのように構成されている場合)。
C:\Documents and Settings指しているC:\Users%USERPROFILE%\Application Data指している%USERPROFILE%\AppData\Roaming%USERPROFILE%\My Documents\My Pictures指している%USERPROFILE%\Picturesソフトウェアの特定のバージョンを含むディレクトリを指すジャンクション ポイントを設定すると、ソフトウェアの別のバージョンを追加し、ジャンクション ポイントを目的のバージョンを指すようにリダイレクトできるようになります。
ジャンクションの内容はほとんどストレージ容量を使用しません(元のディレクトリを指すだけです)。管理者が大きなディレクトリへの複数のエントリポイントを必要とする場合、ジャンクションポイントは効果的なソリューションとなります。ジャンクションポイントは、単に元のディレクトリを指すだけなので、何かのコピーと混同しないでください。ディレクトリを個別に変更する必要がある場合、ジャンクションはディレクトリやその中のファイルの明確なコピーを提供しないため、使用できません。
同様に、シンボリック リンクとハード リンクは、個々のファイルの内容をマージするのに役立ちます。
Windowsの再インストール(または新バージョンのインストール)では、ドライブの内容を削除する必要があることが多いため、インストール時に削除するパーティションを1つだけに抑えるために、複数のパーティションC:を作成しておくと便利です。しかし、一部のプログラムでは、ユーザーがインストールディレクトリを選択できないか、別のドライブにインストールしたにもかかわらず、一部のファイルをドライブにインストールしてしまうことがあります。ジャンクションポイントを作成することで、プログラムを別のディレクトリにインストールするように誘導することができます。 C:
Windows には、NTFS リンクを作成および操作できるツールがいくつか付属しています。
New-Itemのコマンドレット。 [ 3 ] PowerShell 5.0以降では、シンボリックリンクも作成できます。 [ 4 ]コマンドレットとコマンドレットは、ファイルシステムオブジェクトを調べ、NTFSリンクの場合はその情報を取得するために使用できます。このコマンドレットはこれらのアイテムを削除できますが、バグにより正常に動作しないという報告があります。 [ 5 ]Get-ItemGet-ChildItemRemove-Itemmklink内部コマンドを使用してジャンクション、ハード リンク、シンボリック リンクを作成できます。 [ 6 ]このコマンドは、 ReactOSでも使用できます。 [ 7 ]さらに、この古くからあるdirコマンドは、スイッチを使用してジャンクション ポイントを表示およびフィルターできます/aL。 [ 8 ]最後に、rdコマンド (とも呼ばれるrmdir) を使用してジャンクション ポイントを削除できます。hardlinkサブコマンドは、ファイルに関連付けられたハードリンクを作成したり、ハードリンクの一覧を表示したりすることができます。[ 9 ]別のサブコマンドは、ジャンクションポイント、ハードリンク、シンボリックリンクを構成するファイルシステムオブジェクトである再解析ポイントをreparsepoint照会または削除することができます。[ 10 ]さらに、次のユーティリティは Windows に付属していませんが、NTFS リンクを作成できます。
ハードリンクを作成するには、アプリはWindows APIのCreateHardLink()関数を使用できます。Windows NTファミリのすべてのバージョンでは、GetFileInformationByHandle()を使用して、ファイルに関連付けられたハードリンクの数を確認できます。MFTエントリに関連付けられたリンクは最大1024個です。同様に、CreateSymbolicLink()関数はシンボリックリンクを作成できます。ジャンクションの作成はより複雑で、手動で再解析ポイント情報を入力する必要があります。[ 15 ]ジャンクションはディレクトリに対してのみ定義されています。ファイルを指すジャンクションを作成してもAPIは失敗しませんが、後で使用するとジャンクションは正常に解釈されません。
ディレクトリを指すジャンクションとシンボリック リンクはRemoveDirectory()を使用して削除できます。
シンボリックリンクとNTFSジャンクションは、オペレーティングシステムがターゲットの存在を継続的に確認しないため、存在しないターゲットを指すことがあります。[ 16 ]
NTFS ディレクトリ ジャンクションの使用には、次のような追加の危険が潜んでいます。
X:\path\to\parent指すハードリンクを作成するなど、自身の親フォルダを参照するリンクを含めるX:\path\X:\path\to\X:などのボリューム ドライブ文字を使用してターゲットを指定しますX:\some\path\。最初のケースの問題は、再帰パスが作成され、ディレクトリ構造で無限再帰がさらに発生することです。再入可能性を導入することで、1 つ以上のディレクトリ ジャンクションの存在により、ファイル システムの構造が単純な適切なツリーから有向グラフに変わりますが、再帰リンクによってグラフ理論的特徴が非巡回から巡回へとさらに複雑になります。同じファイルとディレクトリに複数のパスで遭遇する可能性があるため、再入可能または再帰的な構造を単純に走査するアプリケーションは、不正確な結果や矛盾した結果を返したり、終了しなくなったりする可能性があります。さらに悪いことに、再帰的に削除する場合、そのようなプログラムは現在走査しているディレクトリの親を削除しようとする可能性があります。
上記の両方の条件は、C:Windowsのデフォルトセットアップでドライブ上に確立されるハードリンクシステムに存在することに注意してください。例えば、Windows 10のすべてのインストールでは、以下の再帰パスが定義されています。
C:\プログラムデータ\ C:\ProgramData\アプリケーションデータ\ C:\ProgramData\アプリケーションデータ\アプリケーションデータ\ C:\ProgramData\アプリケーション データ\アプリケーション データ\アプリケーション データ\ C:\ProgramData\アプリケーション データ\アプリケーション データ\アプリケーション データ\アプリケーション データ\ C:\ProgramData\Application Data\Application Data\Application Data\Application Data\ ...
この一見無限に見えるパス名の各追加パスは、実際には同じ場所を参照する有効なWindowsパスです。実際には、パス名はDOSの260文字のパス制限(またはより新しい32,767文字のパス制限)によって制限されますが、切り捨てによってパス名やファイル名が不完全または無効になる可能性があります。Windowsインストールのコピーを、ディレクトリジャンクションを維持したまま、同じコンピュータ(あるいはさらに悪いことに別のコンピュータ)上の別のボリュームにアーカイブすると、アーカイブされたコピーには実行中のインストールのアクティブなフォルダが依然として含まれている可能性があります。例えば、コピー方法によっては、Windowsドライブのバックアップコピーに、現在のアクティブなインストールの フォルダを指すX:\archive\...というハードリンクが含まれることがあります。X:\archive\Users\USERNAME\My DocumentsC:\Users\USERNAME\Documents\
遅延ターゲット誤参照の2番目の形態は、概念的には単純ですが、より深刻な結果をもたらす可能性があります。ボリュームドライブ文字パス名を使用するハードリンクを含む、自己一貫性のあるボリュームまたはディレクトリ構造が別のボリュームにコピーまたは移動された場合(またはボリュームのドライブ文字が他の手段で再割り当てされた場合)、そのようなリンクはコピーされた構造内の対応するターゲットを指していなくなる可能性があります。この場合も、結果はコピーに使用されたソフトウェアによって異なります。一部のプログラムは、構造の一貫性を維持するために、コピーに含まれるハードリンクを完全に変更することで介入しますが、他のプログラムはハードリンクを無視したり、完全にコピーしたり、ハードリンク内を横断してその内容をコピーしたりすることもあります。
深刻な問題は、ハードリンクがコピーされた結果、新しいコピーでもソースボリューム上の元のファイルやフォルダを参照するボリューム間ハードリンクとなる場合に発生します。「アーカイブ」フォルダ内のハードリンクのように、元のボリューム上の場所(ドライブ文字による)を参照し続けるような意図しないボリューム間ハードリンクは、深刻な事態を招く可能性があります。例えば、使用されていないバックアップボリューム上で、ずっと後になって未使用のアーカイブディレクトリであると判明したディレクトリを削除すると、現在アクティブなユーザーデータやシステムファイルが削除されてしまう可能性があります。
ドライブ文字ハザードの予防策としては、ディレクトリジャンクションのターゲットパスを指定する際に、ボリュームドライブ文字を含むパスではなく、ボリュームGUIDパス構文[ 17 ]X:\Some\Other\Pathを使用することです。例えば、 atのエイリアスを作成することを考えてみましょうX:\Some\Path\Foo。
X:\Some\Path> linkd Foo X:\Some\Other\Path
前述のように、結果として得られるリンクを含むフォルダ構造が 以外のドライブ文字を持つディスクに移動された場合X:、またはドライブX:自体のドライブ文字が変更された場合、ターゲットの場所にあるデータコンテンツは、偶発的な破損や悪意のある不正使用に対して脆弱になります。このリンクのより耐障害性の高いバージョンでは、ターゲットボリュームをGUID識別子値(コマンドを実行することで確認できますfsutil volume list)で参照することで、このリスクを部分的に軽減できます。
X:\Some\Path> linkd Foo \\?\Volume{12345678-abcd-1234-abcd-1234567890ab}\Some\Other\Path
X:こうすることで、ドライブ文字が何らかの方法で変更された 場合でも、ジャンクションが有効なままになることが保証されます。
ディレクトリ ジャンクションの障害を事前に回避する方法としては、 コマンドをdir /AL /S /B "X:\Some\Path"使用して、ファイル システムへの不可逆的な変更をコミットする前に、特定のファイル システムの場所の「下」にあるすべてのハード リンクのリストを取得し、注意深く分析することができます。定義により、結果のリスト内のすべてのリンクのパス名は で始まりますがX:\Some\Path\、これらのハード リンクのいずれかに に包含されないターゲットが含まれている場合X:\Some\Path、指定されたスコープがエスケープされ、指定した開始ディレクトリは を完全に包含していません。この場合、指定されたディレクトリには、他の物理ボリュームに存在するファイルやディレクトリ、またはルートへの親トラバーサルに指定されたディレクトリが含まれないファイルやディレクトリが含まれているため、特別な注意が必要です。
Windowsのデフォルトのセキュリティ設定では、管理者権限を持たないユーザーと管理者以外のユーザーはシンボリックリンクの作成は許可されていますが、ジャンクションの作成は許可されています。この動作は、ローカルセキュリティポリシー管理コンソール「secpol.msc」(セキュリティ設定\ローカルポリシー\ユーザー権利の割り当て\シンボリックリンクの作成)を実行することで変更できます。この問題を回避するには、 cmd.exeを「管理者として実行」オプション付きで起動するか、runasコマンドを使用します。Windows 10 Insidersビルド14972以降、Windowsの「開発者モード」で管理者権限の要件が削除され、コンソールを管理者として昇格させることなくシンボリックリンクを作成できるようになりました。APIレベルでは、SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATEこのためのフラグが提供されています。[ 18 ]
Windowsの起動プロセスはジャンクション ポイントをサポートしていないため、特定のシステム フォルダーをリダイレクトすることはできません。
スリープ イメージ ファイルなどの他の重要なシステム ブート ファイルhiberfil.sysもリダイレクトをサポートしていません。
次の重要でないシステム フォルダーの場所をリダイレクトすることは技術的に可能です。
これを実行すると、Windowsの長期的な信頼性や互換性に問題が生じる可能性があります。別のドライブへのジャンクションを作成して\Usersその\ProgramDataドライブを指定することは、更新プログラムやWindowsストアアプリの動作に支障をきたすため、推奨されません。[ 19 ]
\Users、\ProgramDataのジャンクションを作成したり、\Program Files他\Program Files (x86)の場所を指定すると、Windowsのインストールまたはアップグレードが中断されます。[ 20 ]
別のドライブへのジャンクションを作成したり\Program Files、別のドライブをポイントしたりすると、リポジトリ \Windows\SxS からインストール ディレクトリにファイルをハードリンクする \Program Files (x86)Windows のコンポーネント ベース サービスが機能しなくなります。
Windowsインストーラーはシンボリックリンクを完全にサポートしていません。リダイレクトすると\Windows\Installer、ほとんどの.msiベースのWindowsインストーラーがエラー2755またはエラー1632で失敗します。
Windows XPは、それ以降のリリースと同じNTFSフォーマットバージョンを使用しているため、シンボリックリンクのサポートを有効にすることが可能です。Windows 2000およびXPでNTFSシンボリックリンクを使用する場合は、ファイルシステムフィルターとしてインストールすることでシンボリックリンクをサポートするサードパーティ製ドライバーが存在します。[ 21 ] [ 22 ]
ジャンクションポイントおよびマウントポイントと呼ばれるディレクトリまたはボリュームへのシンボリックリンクは、Windows 2000に搭載されたNTFS 3.0で導入されました。NTFS 3.1以降では、あらゆる種類のファイルシステムオブジェクトに対してシンボリックリンクを作成できます。NTFS 3.1はWindows XPとともに導入されましたが、この機能はユーザーモードアプリケーションでは(ntfs.sysを通じて)利用できませんでした。しかし、Masatoshi Kimura氏のオープンソースドライバーなどのサードパーティ製フィルタードライバーをインストールすることで、ユーザーモードでもこの機能を利用できるようになりました。Windows Vistasenableでリリースされたntfs.sysでは、ユーザーモードアプリケーションでこの機能がデフォルトで利用可能になりました。
NTFS 3.1以降、シンボリックリンクはファイルまたはリモートSMBネットワークパスを指すこともできます。NTFSジャンクションポイントはローカルドライブ上の絶対パスのみをサポートしますが、NTFSシンボリックリンクは相対パスを使用したリンクを可能にします。さらに、NTFSシンボリックリンクの実装は、ファイルシステム間のリンクを完全にサポートしています。ただし、ホスト間のシンボリックリンクを有効にするには、リモートシステムもシンボリックリンクをサポートしている必要があるため、実質的にWindows Vista以降のWindowsオペレーティングシステムでのみサポートされます。
場所がファイルシステムドライブ内にある場合、次の値が許可されます。場所がファイルシステムドライブ内にある場合、次の値が許可されます。File[,] Directory[,] Junction[,] HardLink