NTFSリンクは、 Windows NTファミリーに属するすべてのMicrosoft WindowsバージョンのデフォルトファイルシステムであるNTFSファイルシステムで使用される抽象化であり、パス名と特定の種類のメタデータをNTFSマスターファイルテーブル(MFT)のエントリに関連付けます。NTFSは、ファイルデータとメタデータの格納および参照方法において、一般的なUnixファイルシステムに似たパターンを広く採用しています。MFTのエントリは、一般的な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ファイルシステムと比較してみましょう。Unixファイルシステムでは、リンクはディレクトリ内のエントリであり、ディレクトリ自体はファイルシステムに格納されるファイルの一種です。このエントリは、別のリンク、またはinodeを指しています。)
NTFSは、ハードリンク、ジャンクション、シンボリックリンクの3種類のリンクをサポートしています。[ 1 ]
ハードリンクは、その動作において典型的なものです。ハードリンクはMFTレコードを「指し示します」。そのターゲットレコードは、テキストファイルや実行ファイルなどの「通常の」ファイルのレコードになります(NTFSボリュームが正常な状態にある場合)。ハードリンクがinodeを指す一般的なUnixファイルシステムと比較してみてください。このようなファイルシステムと同様に、NTFSのハードリンクはディレクトリを指すことはできません。
NTFS ボリューム上の典型的な新規ファイル作成イベントでは、NTFS は、新しいファイルエンティティのファイルメタデータ(ファイルに割り当てられたデータクラスタやファイルのデータストリームに関する情報を含む) を格納するための新しい MFT レコードを 1 つ割り当てて作成し、最初に新しく作成された MFT レコードをターゲットとするハードリンク用の MFT レコードを 1 つ作成し、ハードリンクへの参照をディレクトリファイルに格納し、これら 2 つの MFT レコードの参照カウントを1 つ設定します。 1ファイル作成イベントの一部として指定されたファイル名はすべてハードリンクに格納されます。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の再インストール(または新バージョンのインストール)では、多くの場合ドライブの内容を削除する必要があるため、複数のパーティションC:を作成して、インストール中に削除する必要があるパーティションを1つだけにしておくのが有利です。しかし、一部のプログラムでは、ユーザーがインストールディレクトリを選択できなかったり、別のドライブにインストールした場合でも、一部のファイルをドライブにインストールしてしまうことがあります。ジャンクションポイントを作成することで、プログラムをだまして別のディレクトリにインストールさせることができます。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:\ProgramData\ C:\ProgramData\Application Data\ C:\ProgramData\Application Data\Application Data\ C:\ProgramData\Application Data\Application Data\Application Data\ C:\ProgramData\Application Data\Application Data\Application Data\Application Data\ C:\ProgramData\Application Data\Application Data\Application Data\Application Data\Application Data\ ...
この一見無限に見えるセット内の追加のパス名はそれぞれ、同じ場所を参照する実際の有効な Windows パスです。実際には、パス名は 260 文字の DOS パス制限 (または新しい 32,767 文字制限) によって制限されますが、切り捨てによって不完全または無効なパス名やファイル名になる場合があります。ディレクトリ ジャンクションをそのままにして、Windows インストールのコピーを同じコンピュータ上の別のボリューム (さらに悪いことに、別のコンピュータ上) にアーカイブすると、アーカイブされたコピーには、実行中のインストールからのアクティブなフォルダがまだ含まれている可能性があります。たとえば、コピーに使用される方法によっては、Windows ドライブのバックアップ コピーには、現在のアクティブなインストール内のフォルダを指すX:\archive\...ハード リンクが含まれます。X:\archive\Users\USERNAME\My DocumentsC:\Users\USERNAME\Documents\
遅延ターゲット誤参照の2番目の形式は、概念的には単純ですが、より深刻な結果を招く可能性があります。ボリュームのドライブレターパス名を使用するハードリンクを含む自己整合性のあるボリュームまたはディレクトリ構造が別のボリュームにコピーまたは移動された場合(またはボリュームのドライブレターが他の手段で再割り当てされた場合)、そのようなリンクはコピーされた構造内の対応するターゲットを指しなくなる可能性があります。ここでも結果はコピーに使用されたソフトウェアに依存します。構造の一貫性を維持するために、コピー内の完全包含ハードリンクを変更して介入するプログラムもあれば、ハードリンクを無視したり、正確にコピーしたり、ハードリンクをたどってその内容をコピーしたりするプログラムもあります。
深刻な問題は、ハードリンクが正確にコピーされ、新しいコピーで元のボリューム上のファイルやフォルダを指すクロスボリューム・ハードリンクになってしまう場合に発生します。例えば、「アーカイブ」フォルダ内のハードリンクが(ドライブレターに基づいて)元のボリューム上の場所を指している場合など、意図しないクロスボリューム・ハードリンクは、重大な問題を引き起こす可能性があります。例えば、使用されていないバックアップボリューム上の、後になって未使用のアーカイブディレクトリだと判明したものを削除すると、現在アクティブなユーザーデータやシステムファイルが削除されてしまう可能性があります。
ドライブレターの危険性を回避するための対策として、ディレクトリジャンクションのターゲットパスを指定する際に、ボリュームドライブレターを含むパスではなく、ボリュームGUIDパス構文[ 17 ]を使用することが挙げられます。例えば、X:\Some\Other\Path次のエイリアスを作成することを検討してください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、\Program Files (x86)別のドライブを指すようにしたりすると、Windows のコンポーネントベースのサービスが壊れてしまいます。このサービスは、リポジトリ \Windows\SxS からインストール ディレクトリにファイルをハードリンクします。
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 Vistaに同梱された ntfs.sysにより、この機能はデフォルトでユーザーモードアプリケーションでも利用できるようになりました。senable
NTFS 3.1以降、シンボリックリンクはファイルまたはリモートSMBネットワークパスを指すことができます。NTFSジャンクションポイントはローカルドライブ上の絶対パスのみをサポートしますが、NTFSシンボリックリンクは相対パスを使用したリンクを可能にします。さらに、NTFSシンボリックリンクの実装は、ファイルシステム間リンクを完全にサポートします。ただし、ホスト間シンボリックリンクを有効にするには、リモートシステムもそれをサポートしている必要があるため、実質的にサポート対象はWindows Vista以降のWindowsオペレーティングシステムに限定されます。
場所がファイルシステム ドライブにある場合、次の値が許可されます。場所がファイルシステム ドライブにある場合、次の値が許可されます。File[,] Directory[,] Junction[,] HardLink