NTFSファイル システムでは、ファイルやフォルダーをリダイレクトするさまざまな方法が定義されています。たとえば、コピーを作成せずに、ファイルを別のファイルまたはそのコンテンツにポイントさせる方法などがあります。ポイントされるオブジェクトはターゲットと呼ばれます。このようなファイルは、ファイルシステムに保存される方法に応じて、ハード リンクまたはシンボリック リンクと呼ばれます。
歴史
ジャンクション ポイントおよびマウント ポイントと呼ばれるディレクトリまたはボリュームへのシンボリック リンクは、 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 オペレーティング システムのみにサポートが制限されます。
種類
リンクには 3 つのクラスがあります。
- ハード リンクでは、同じファイルシステム内で、同じ MFT エントリ ( inode ) がファイルによって共有されます。これらは、ディレクトリ エントリがファイル自体を参照するという点で、Unix または Linux のハード リンクと同じように動作します。そのため、ファイルを参照する他のエントリの名前を変更したり削除したりしても、リンクには影響しません。
- ジャンクションポイントは再解析ポイントであり、UnixやLinuxのシンボリックリンクと同様に動作しますが、ディレクトリに対してのみ定義され、ローカルファイルシステム上の絶対パスのみになります。これらはハードリンクと同様に作成され動作しますが、ターゲットディレクトリの名前が変更されたり、移動されたり、削除されたりすると、リンクは無効になります。[1] [2]
- シンボリック リンクは、ジャンクション ポイント、または Unix や Linux のシンボリック リンクと同様に動作する再解析ポイントであり、相対パス、ファイルへのパス、およびディレクトリを受け入れます。ディレクトリと UNC パスのサポートは、NTFS 3.1 で追加されました。
すべての NTFS リンクは、アプリケーションに対して透過的になるように設計されています。つまり、リンクにアクセスするアプリケーションは、ファイル システム ドライバーによってシームレスにリダイレクトされ、特別な処理は必要ありません。ユーザーには、通常のディレクトリまたはファイルとして表示されます。これにより、エイリアシング効果も発生します。リンクへの書き込みは、その書き込みを基礎となるリンクされたファイルまたはMFTエントリに渡します。
シンボリック リンクとジャンクション ポイントには、リンクされたファイルへのパスと、動作を実装するドライバーを識別するタグが含まれます。パスを記録するため、他のボリューム上のファイルやリモート ファイルにもリンクできます。ただし、これは、参照先のファイルが削除または名前変更された場合、リンクが無効になり、参照先のファイルまたはディレクトリが別のものに置き換えられた場合、リンクは新しいファイルまたはディレクトリを参照するようになることも意味します。
ハード リンクは、同じ MFT レコードを参照する新しいディレクトリ エントリを作成し、MFT レコードの参照カウントを増やします。つまり、同じファイル システム内のファイルに制限されますが、削除によって参照カウントが 1 つ減り、カウントが 0 になるまで MFT 内のファイルは削除されないため、ハード リンクを無効にせずに元のファイルを削除できます。
ショートカットファイル
NTFS シンボリック リンクは、通常のファイルである Windows ショートカット ファイルとは異なります。後者は、任意のファイル システム (以前のFAT32など) 上に作成でき、メタデータ (ショートカットが [リンクの削除] で表示されるときに表示されるアイコンなど) を含めることができ、アプリケーションに対して透過的ではありません。
CygwinやMingwなどの Windows 用の Unix ライクな環境の実装では、ホスト オペレーティング システムがシンボリック リンクをサポートしていない場合でも、ショートカット ファイルを使用してシンボリック リンクをエミュレートできます (そのように構成されている場合)。
使用例
組み込み用途
- Windows コンポーネント ストア ( WinSxS ) は、ハード リンクを使用して、ハード ディスク ドライブに保存されているDLLのさまざまなバージョンを追跡します。
- Windows Server 2008の基本インストールでは、\Users\All Users\ → \ProgramData\ リダイレクトにシンボリック リンクが使用されていました。
- Windows Vista以降、すべてのバージョンの Windows では、組み込みディレクトリの特定のスキームを使用し、隠しジャンクションを利用してWindows XP 以前との下位互換性を維持しています。これらのジャンクションの例は次のとおりです。
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 リンクを作成および操作できるツールがいくつか付属しています。
- PowerShell :空のファイル、フォルダー、ジャンクション、ハードリンクを作成できるWindows PowerShell
New-Itemのコマンドレット。 [3] PowerShell 5.0 以降では、シンボリックリンクも作成できます。 [4]コマンドとコマンドレットを使用して、ファイルシステムオブジェクトを調べ、NTFS リンクの場合はその情報を検索できます。コマンドレットは上記の項目を削除できますが、このコマンドレットが正常に動作しないバグが記録されています。 [5]Get-ItemGet-ChildItemRemove-Item - Windowsコマンドプロンプト: Windows VistaおよびWindows Server 2008以降では、
mklink内部コマンドを使用してジャンクション、ハードリンク、シンボリックリンクを作成できます。 [6]このコマンドはReactOSでも使用できます。 [7]さらに、この古くからあるdirコマンドは、スイッチを介してジャンクションポイントを表示およびフィルタリングできます/aL。 [8]最後に、rdコマンド(とも呼ばれるrmdir)はジャンクションポイントを削除できます。 - fsutil.exe: Windows 2000で導入されたコマンドラインユーティリティ。
hardlinkサブコマンドは、ファイルに関連付けられたハードリンクを作成したり、ハードリンクを一覧表示したりできます。[9]別のサブコマンドは、ジャンクションポイント、ハードリンク、シンボリックリンクを構成するファイルシステムオブジェクトである再解析ポイントreparsepointを照会または削除できます。 [10]
さらに、次のユーティリティは Windows に付属していませんが、NTFS リンクを作成できます。
- linkd: Windows 2000およびWindows Server 2003のリソースキットのコンポーネントです。[11]ジャンクションポイントを作成できます。[12]
- junction: Microsoftの無料コマンドラインユーティリティ。ジャンクションを作成または削除できます。[2]
- PowerShellコミュニティ拡張機能(PSCX): Microsoft PowerShellギャラリー[13]でホストされているこのモジュールは、New-Hardlink、New-Junction、Get-ReparsePoint、Remove-ReparsePoint、New-Symlinkなど、NTFSリンクを処理するためのいくつかのコマンドレットを追加します。[14]
APIについて
ハードリンクを作成するには、アプリはWindows APIの .mw-parser-output .monospaced{font-family:monospace,monospace}CreateHardLink() 関数を使用できます。Windows NT ファミリのすべてのバージョンは、ファイルに関連付けられたハードリンクの数を決定するために使用できますGetFileInformationByHandle()。MFT エントリに関連付けられたリンクは最大 1024 個です。同様に、 CreateSymbolicLink() 関数はシンボリックリンクを作成できます。ジャンクションは作成がより複雑です。手動で再解析ポイント情報を入力する必要があります。[15]コード例はlibuvにあります。[16]ジャンクションはディレクトリに対してのみ定義されています。ファイルを指すジャンクションを作成しても API は失敗しませんが、後で使用するとジャンクションは正常に解釈されません。
ジャンクションやシンボリックリンクは、ディレクトリを指しているものであっても、 を使用して削除できますpNtSetInformationFile。Windows 上の Libuv の実装はunlinkこの使用法を示しています。[17]また、.NETSystem.IO.Directory.Delete()メソッドもこれらに対して機能します。[18]
危険
一貫性
シンボリックリンクとNTFSジャンクションは、オペレーティングシステムがターゲットの存在を継続的に確認しないため、存在しないターゲットを指すことがあります。[19]
NTFS ディレクトリ ジャンクションの使用には、次のような追加の危険が潜んでいます。
- または
X:\path\to\parentを指すハードリンクを作成するなど、自身の親フォルダを参照するリンクを含めるか、X:\path\X:\path\to\ X:などのボリューム ドライブ文字を使用してターゲットを指定しますX:\some\path\。
再帰構造
最初のケースの問題は、再帰パスが作成され、ディレクトリ構造に無限再帰がさらに発生することです。再入可能性を導入することで、1 つ以上のディレクトリ ジャンクションの存在により、ファイル システムの構造が単純な適切なツリーから有向グラフに変わりますが、再帰リンクによって、グラフ理論上の特性が非巡回から巡回へとさらに複雑になります。同じファイルとディレクトリが複数のパスで検出される可能性があるため、再入可能または再帰的な構造を単純にトラバースするアプリケーションは、不正確な結果や矛盾した結果を返したり、終了しなくなったりする可能性があります。さらに悪いことに、再帰的に削除する場合、そのようなプログラムは現在トラバースしているディレクトリの親を削除しようとする可能性があります。
上記の両方の条件は、デフォルトの Windows セットアップでドライブ上に確立されたハード リンク システムに存在することに注意してくださいC:。たとえば、すべてのWindows 10インストールでは、再帰パスが定義されます。
C:\プログラムデータ\ C:\ProgramData\アプリケーションデータ\ C:\ProgramData\アプリケーション データ\アプリケーション データ\ C:\ProgramData\アプリケーション データ\アプリケーション データ\アプリケーション データ\ C:\ProgramData\アプリケーション データ\アプリケーション データ\アプリケーション データ\アプリケーション データ\ C:\ProgramData\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パス構文[20]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--abcdefghijkl}\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この目的のためにフラグが提供されています。[21]
起動時間
Windowsの起動プロセスはジャンクション ポイントをサポートしていないため、特定のシステム フォルダーをリダイレクトすることはできません。
- \ウィンドウ
- \Windows\System32
- \Windows\System32\構成
スリープ イメージ ファイルなどの他の重要なシステム ブート ファイルhiberfil.sysもリダイレクトをサポートしていません。
システム定義の場所
次の重要でないシステム フォルダーの場所をリダイレクトすることは技術的に可能です。
- \ユーザー
- \ドキュメントと設定
- \プログラムデータ
- \プログラムファイル
- \プログラムファイル (x86)
これを行うと、Windowsの長期的な信頼性や互換性の問題が発生する可能性があります。別のドライブへのジャンクションを作成し\Usersて\ProgramDataそのドライブを指すことは、更新プログラムやWindowsストアアプリに支障をきたすため、推奨されません。[22]
\Users、\ProgramDataのジャンクションを作成したり\Program Files、\Program Files (x86)他の場所を指定したりすると、Windowsのインストールやアップグレードが中断されます。[23]
別のドライブへのジャンクションを作成したり\Program Files、別のドライブを指すと、リポジトリ \Windows\SxS からインストール ディレクトリにファイルをハードリンクする\Program Files (x86)Windows のコンポーネント ベース サービスが機能しなくなります。 [引用が必要]
Windowsインストーラー
Windows インストーラーはシンボリック リンクを完全にはサポートしていません。リダイレクトすると、\Windows\Installerほとんどの .msi ベースの Windows インストーラーがエラー 2755 やエラー 1632 で失敗します。
Windows XP でのシンボリック リンクのサポート
Windows XP は、それ以降のリリースと同じ NTFS 形式バージョンを使用しているため、シンボリック リンクのサポートを有効にすることは可能です。Windows 2000 および XP で NTFS シンボリック リンクを使用するには、ファイル システム フィルターとしてインストールすることでこれを実現するサードパーティ ドライバーが存在します。[24] [25]
参照
参考文献
- ^ 「ハードリンクとジャンクション」。Windows Developer。Microsoft 。 2018年5月31日。
- ^ ab "Junction v1.07". Sysinternals . Microsoft . 2016年7月4日.
- ^ "New-Item (PowerShell 3.0)". Microsoft Docs . Microsoft . 2020 年 6 月 22 日.
場所が FileSystem ドライブ内にある場合、次の値が許可されます。場所が FileSystem ドライブ内にある場合、次の値が許可されます。File[,] Directory[,] Junction[,] HardLink
- ^ 「New-Item (PowerShell 5.0)」。Microsoft Docs。Microsoft。2020年6 月 22日。
- ^ 「Remove-Item <ディレクトリへのシンボリック リンク> を修正」。PowerShellリポジトリ。Microsoft。2016年3 月 4 日 – GitHub経由。
- ^ "Mklink". Microsoft Docs . Microsoft . 2012 年 4 月 18 日。
- ^ "mklink.c". reactos リポジトリ. ReactOS Deutschland eV 2017 年 10 月 3 日 – GitHub.com経由。
- ^ 「Dir」。Microsoft Docs。Microsoft。2012年 4 月 18 日。
- ^ 「Fsutil ハードリンク」。Microsoft Docs。Microsoft。2012年 4 月 18 日。
- ^ "Fsutil 再解析ポイント". Microsoft ドキュメント。マイクロソフト。 2012 年 4 月 18 日。
- ^ 「Windows Server 2003 リソース キット ツールのダウンロード」。ダウンロード センター。2015 年 3 月 10 日。2015 年 3 月 10 日時点のオリジナルよりアーカイブ。
- ^ 「NTFS ジャンクション ポイントを作成および操作する方法」。2015 年 3 月 9 日。2015 年 3 月 9 日時点のオリジナルよりアーカイブ。
- ^ "Pscx". PowerShell ギャラリー. Microsoft . 2018 年 1 月 17 日。
- ^ Hill, Keith; Grehan, Oisin (2018 年 1 月 17 日). 「README.md」. pscx リポジトリ– GitHub経由。
- ^ 「NTFS リンク、ディレクトリ ジャンクション、および Windows ショートカット」。www.flexhex.com。2021年 1 月 25 日時点のオリジナルよりアーカイブ。2019 年10 月 4 日閲覧。
- ^ "libuv/src/win/fs.c". GitHub . 2019年12月12日閲覧。
- ^ "libuv/src/win/fs.c fs__unlink". GitHub . 2019年12月12日閲覧。
- ^ 「PowerShell Remove Junction」。StackOverflow 。 2019年12月12日閲覧。
- ^ 「プログラミングに関する考慮事項 (Windows)」。msdn.microsoft.com。
- ^ 「Windows システム上のファイル パス形式」。docs.microsoft.com。
- ^ 「Windows 10 のシンボリックリンク! - Windows 開発者ブログWindows 開発者ブログ」。blogs.windows.com。2016年 12 月 2 日。
- ^ 「Users ディレクトリと ProgramData ディレクトリを、Windows ディレクトリを含むドライブ以外のドライブに再配置する」 。2015年 3 月 12 日閲覧。
- ^ 「Users または Program Files フォルダーを別のパーティションにリダイレクトするため、Windows 8.1 をインストールしようとするとエラーが発生します」 。2015年 3 月 12 日閲覧。
- ^ Hermann Schinagl (2013 年 8 月 23 日)。「ln - コマンドライン ハードリンク - Windows XP のシンボリック リンク」。
- ^ 「リンク/ジャンクション作成ツール」. emk.name。
外部リンク
- MSDN の NTFS シンボリック リンクに関するドキュメント
- Win32 API の CreateSymbolicLink 関数
- fsutil hardlink create -ハードリンクを作成します( Windows 2000以降)
- Microsoft サポート技術情報の記事 - 「NTFS ジャンクション ポイントの作成と操作方法」(アーカイブ版)
- Microsoft TechNet の Junction コマンドライン ユーティリティ
- Codeproject の記事 – プログラマー向けのジャンクション ポイント ユーティリティのソース コードに関する議論
- スタート メニューに任意のディレクトリを追加する方法 (スタート メニュー内でサブメニューとしてプレビューできるようにする) に関する、Wayback Machineに 2008 年 12 月 11 日にアーカイブされた PC Mag の記事。
