Windowsのシンボリックリンクとジャンクションとハードリンクの違いTech TIPS

Windows OSで利用できるリンクには、シンボリック・リンクやジャンクション、ハードリンクなどがある。これらは機能が少しずつ異なるので、使い分ける必要がある。それらの違いを解説する。

» 2013年06月07日 17時13分 公開
[打越浩幸デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 2000/Windows XP/Windows Vista/Windows 7/Windows 8/Windows Server 2003/Windows Server 2008/Windows Server 2008 R2/Windows Server 2012


解説

●Windows OSで利用できるリンクの種類

 Windows OSでは、ファイルやフォルダ名へのリンク(参照)を行う機能として、「ハードリンク」や「ジャンクション」「シンボリック・リンク」などがある。これらは同じような機能を提供しているが、例えば「フォルダへのリンク」と「ファイルへのリンク」の扱いが異なるなど、いくらか違いがある。ユーザーは用途に応じてこれらを使い分ける必要がある。

 それぞれのリンクの特徴を表にまとめておく。

機能名 ジャンクション シンボリック・リンク ハードリンク
サポートOS Windows 2000以降 Windows Vista/Windows Server 2008以降 Windows 2000以降
必要なファイル・システム NTFS NTFS NTFS
利用している機能 NTFSのリパース・ポイント NTFSのリパース・ポイント NTFSのファイル・オブジェクトのリファレンス・カウント
リンクの作成に必要な権限 一般ユーザー権限でよい 管理者権限が必要(シンボリック・リンクの作成権限SeCreateSymbolicLinkPrivilegeが必要) 一般ユーザー権限でよい
ファイルへのリンクとdirコマンド出力での表記 × <SYMLINK>
フォルダへのリンクとdirコマンド出力での表記 <JUNCTION> <SYMLINKD> ×
絶対パス指定
相対パス指定 ×(リンク先表記は絶対パスに変換されて保存される)
同一ボリューム内のオブジェクトへのリンク
同一PC内のほかのボリューム内オブジェクトへのリンク ×
ネットワーク共有フォルダへのリンク ×(リンク先はローカルのみ) ×(リンク先はローカルのみ)
リンクを作成するためのコマンド 「mklink /j 〜」 「mklink 〜」「mklink /d 〜」 「mklink /h 〜」「fsutil hardlink create 〜」
リンクを削除するためのコマンド 「rmdir 〜」 リンク先がファイルなら「del 〜」、フォルダなら「rmdir 〜」 「del 〜」
存在しないオブジェクトへのリンク 作成できる 作成できる 作成できない
エクスプローラで見ると…… ショートカットを表す矢印が付く ショートカットを表す矢印が付く 通常のファイルと同じように見える
Windows OSで利用できる3種類の「リンク」の仕様

 以下、各リンクについて簡単に説明しておく。

●ハードリンクとは

 ハードリンクとは、1つのファイル実体を指し示す複数のパスのことを指す。あるファイルに対して新しいハードリンクを作成すると、オリジナルのファイル名から見ても、新しいリンク名からみても、まったく同じように1つのファイルへアクセスできる。ハードリンクを作成すると、ファイルの実体は1つのまま、リファレンス・カウント(いくつのエントリから指されているかを表す回数。通常のファイルは1)が1つ増える。この状態で元のファイル・エントリを削除してもファイルの実体は残っているので(リファレンス・カウントは1つ減る)、新しいリンクの方からはそのまま継続してアクセスできる。ジャンクションやシンボリック・リンクの場合は、オリジナルのエントリを削除するとファイルの実体がなくなり、リンク先へアクセスできなくなってしまう。

 ほかの方法と比較すると、ハードリンクは一番透過的であり、さまざまなアプリケーションからほとんど問題なく利用できるが、同じボリューム上のファイルしかリンクできないという制限がある。存在しないファイルへのリンクをあらかじめ作成しておくといったこともできないし、ほかのボリュームやほかのサーバ上の共有ファイルを指すこともできない。

●ジャンクションとは

 ハードリンクに対して、ジャンクション(とシンボリック・リンク)は「ソフトリンク」と呼ばれる。これはNTFSの「リパース・ポイント(ファイル・パスの解釈を独自に行う機能)」を使って実装されたリンク機能であり、ショートカットのように、別の場所にあるフォルダへリダイレクトするために使われる。ハードリンクと違って、リンク先の実体が削除されるとリンク先不明となる。古くから使われている機能なのでほとんどのアプリケーションで問題なく利用できるが、フォルダにしかリンクできない、ローカルのPC以外の場所(共有フォルダなど)へはリンクできない、などの制限がある。

 以下はWindows Server 2012でジャンクションを含むフォルダ/ファイルの一覧を表示したところである。「<JUNCTION>」と表示されているのがジャンクションとそのリンク先である。元のフォルダ階層構造を保ったまま、別の場所へ誘導するために使われる。

※Windows Server 2012での使用例

C:\Users\Administrator>dir /a/p
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 229F-B519 です

C:\Users\Administrator のディレクトリ

2012/11/21  01:41    <DIR>          .
2012/11/21  01:41    <DIR>          ..
2012/11/21  01:40    <DIR>          AppData
2012/11/21  01:40    <JUNCTION>     Application Data [C:\Users\Administrator\AppData\Roaming]
2012/11/21  01:40    <DIR>          Contacts
2012/11/21  01:40    <JUNCTION>     Cookies [C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies]
2012/11/21  01:40    <DIR>          Desktop
2012/11/21  01:41    <DIR>          Documents
2012/11/21  01:41    <DIR>          Downloads
2012/11/21  01:40    <DIR>          Favorites
2012/11/21  01:41    <DIR>          Links
2012/11/21  01:40    <JUNCTION>     Local Settings [C:\Users\Administrator\AppData\Local]
2012/11/21  01:40    <DIR>          Music
2012/11/21  01:40    <JUNCTION>     My Documents [C:\Users\Administrator\Documents]
……(以下省略)……



●シンボリック・リンクとは

 シンボリック・リンクとは、ジャンクションよりも汎用性の高いリンク機能である。UNIXやLinuxのシンボリック・リンクとほぼ同じだ。リンク先はファイルでもフォルダでもよいし、相対パスでも指定できるし(リンクを移動させると相対パスでアクセスできなくなる可能性があるので注意)、ローカルのPC以外の場所(例:リモートの共有フォルダやその中にあるオブジェクト)へもリンクできる。ただしこの機能が実装されたのはWindows Vista/Windows Server 2008以降なので、アプリケーションによってはシンボリック・リンクを解釈できないことがある。またファイルへのリンクとフォルダへのリンクは異なるものなので、作成時に注意する必要がある(詳細は後述)。

●リンクの操作

 リンク機能は、Windows OSに導入された時期(Windows OSのバージョン)の違いにより、操作方法もいくらか異なっている。だが最近のWindows OS(Windows Vista/Windows Server 2008以降)ではmklinkというコマンドですべて作成できるようになっている。ジャンクションやシンボリック・リンクなどを操作する方法はすでにいくつか掲載しているので、それらのTIPS記事も参照していただきたい。

 エクスプローラではこれらのリンクを見ることはできるが(シンボリック・リンクやジャンクションにはショートカットを表す矢印のマークが付く)、作成することはできない。そのため、リンクを作成するためにはコマンド・プロンプトを開いて、「mklink 〜」というコマンドを利用する。

※mklinkコマンドの使い方

C:\>mklink
シンボリック リンクを作成します。

MKLINK [[/D] | [/H] | [/J]] リンク ターゲット

        /D          ディレクトリのシンボリック リンクを作成します。既定では、
                    ファイルのシンボリック リンクが作成されます。
        /H          シンボリック リンクではなく、ハード リンクを作成します。
        /J          ディレクトリ ジャンクションを作成します。
        リンク      新しいシンボリック リンク名を指定します。
        ターゲット  新しいリンクが参照するパス (相対または絶対)
                    を指定します。

C:\>



 作成したリンクをdirコマンドで表示させると、リンク名の前に「<JUNCTION>」や「<SYMLINK>」「<SYMLINKD>」と表示されるので確認できる。ただしハードリンクの場合は何も表示されない(ほかのファイルなどと同じように表示される)。

※作成前のフォルダの確認
C:\Folder1>dir
ドライブ C のボリューム ラベルは WINDOWS7 です
ボリューム シリアル番号は 2C9F-4796 です

C:\Folder1 のディレクトリ

2013/06/03  15:23    <DIR>          .
2013/06/03  15:23    <DIR>          ..
               0 個のファイル                   0 バイト
               2 個のディレクトリ  847,240,310,784 バイトの空き領域

※5種類のリンクを作成してみる
C:\Folder1>mklink /H f1.txt \Folder2\Folder2-File1.txt
f1.txt <<===>> \Folder2\Folder2-File1.txt のハードリンクが作成されました

C:\Folder1>mklink /J junction1 \Folder2\Folder1-Folder11
junction1 <<===>> \Folder2\Folder1-Folder11 のジャンクションが作成されました

C:\Folder1>mklink    symlink1.txt \Folder2\Folder2-File2.txt
symlink1.txt <<===>> \Folder2\Folder2-File2.txt のシンボリック リンクが作成されました

C:\Folder1>mklink /d symlinkd2    \Folder2\Folder1-Folder12
symlinkd2 <<===>> \Folder2\Folder1-Folder12 のシンボリック リンクが作成されました

C:\Folder1>mklink /d user01 \\server01\usr\user01
user01 <<===>> \\server01\usr\user01 のシンボリック リンクが作成されました


※作成した5種類のリンクを確認する
C:\Folder1>dir
ドライブ C のボリューム ラベルは WINDOWS7 です
ボリューム シリアル番号は 2C9F-4796 です

C:\Folder1 のディレクトリ

2013/06/03  15:23    <DIR>          .
2013/06/03  15:23    <DIR>          ..
2013/06/03  10:04             1,536 f1.txt
2013/06/03  15:23    <JUNCTION>     junction1 [C:\Folder2\Folder1-Folder11]
2013/06/03  15:23    <SYMLINK>      symlink1.txt [\Folder2\Folder2-File2.txt]
2013/06/03  15:23    <SYMLINKD>     symlinkd2 [\Folder2\Folder1-Folder12]
2013/06/03  15:23    <SYMLINKD>     user01 [\\server01\usr\user01]
               2 個のファイル               1,536 バイト
               5 個のディレクトリ  847,240,310,784 バイトの空き領域

C:\Folder1>

※ハードリンクの情報を表示させてみる。
C:\Folder1>fsutil hardlink list f1.txt
\Folder2\Folder2-File1.txt
\Folder1\f1.txt
※↑↑↑1つのファイルが、2つのパスとしてリンクされていることが分かる。通常のファイルでは1つしか表示されない。
C:\Folder1>



 ジャンクションなのにリンク先をファイル名にしたり、シンボリック・リンクのリンク先のファイルとフォルダの種類を間違えてしまっても、エラー・メッセージは表示されないので注意していただきたい。実際にアクセスしようとして初めてエラーとなる。

 コマンド・プロンプト上でリンクを削除する場合は、リンク先の種類に注意する。ファイル(へのリンク)を削除する場合は「del 〜」コマンド、フォルダ(へのリンク)を削除する場合は「rmdir 〜」コマンドを使用する。フォルダへのリンクに間違って「del 〜」を適用すると、リンク先のフォルダの中にあるファイルを消そうとするので注意していただきたい(いちおう確認メッセージが表示されるが)。

●ボリュームのマウント

 ボリュームを特定のパスの下に「マウントする(ぶら下げる)」には、mklink /jコマンドでジャンクションとして作成してもよいが、mountvolコマンドを使って直接マウントしてもよい。

 mountvolにボリューム名(「\\?\Volume{6ef71820-afb1-11df-acc0-806e6f6e6163}\」のようなパス指定。引数なしでmountvolを実行すると表示される)を渡すと、特定のフォルダの下にボリュームをマウントできる。ただしmountvolで指定するフォルダは空にしておく必要があるが(マウントする空フォルダは最初に作成しておくこと)、mklink /jコマンドを使う場合は、フォルダは自動作成されるので、最初に作成しておく必要はない。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。