Windows TIPS
[System Environment]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

ファイルへの別名を割り当てるハードリンクを作成する

解説をスキップして操作方法を読む

デジタルアドバンテージ 打越 浩幸
2008/02/08
2013/01/31更新
対象OS
Windows XP
Windows Server 2003
Windows Vista
Windows Server 2008
ハードリンクを作成すると、既存のファイルに対して別のファイル名やパスを使ってアクセスできるようになる。
Windows OSでハードリンクを作成するにはfsutil hardlink createコマンドを利用する。
ハードリンクは、同一ボリューム上のファイルにしか張ることはできない。フォルダやほかのボリューム上のファイルに対するリンクは作成できない。

解説

 UNIXやLinuxなどのOSでは(正確には、それらのOS上で利用されているファイル・システムでは)、「リンク」という、1つのファイルに対して複数の名前を付ける機能が用意されている。あるファイルの実体(データが書き込まれた領域、ファイルの中身のこと)に対して、例えば「c:\user01\mydata.txt」と「c:\data\sample\sampledata.txt」という2つのリンクを作成しておくと、これらのいずれの名前を使っても同じファイルのデータにアクセスできる。名前は複数付けられているが実体は1つなので、一方でデータを更新後に別の名前でアクセスすると、その更新された内容が得られる。

 ハードリンクを利用すると、1つのコマンドに2つの名前を付けたり、複数のプロジェクトでファイルを共有したりできる。ファイルをコピーしてデータを共有するのとは違い、常に同じ実体を指しているので、別名で起動しても常に同じものが実行されるし、多くの名前でファイルを共有してもディスク領域を圧迫することがない。

 UNIXの場合、リンクには「ハードリンク」と「シンボリック・リンク(ソフトリンク)」の2種類がある(リンクはlnコマンドで作成する)。ハードリンクは、同一のボリューム内で直接リンクを張る場合に利用される機能である。複数のディレクトリ・エントリが1つの実体を指しているが、同一ボリューム内に存在しているので、常にリンク先の実体が存在していることが保証される。これに対しシンボリック・リンクは、Windows OSのショートカット(およびジャンクションやリパース・ポイント)などのように動的に解釈されるため、自由度が高いが、場合によってはリンク先にアクセスできないことがある(詳細は省略)。

 Windows OSでもこのハードリンクを利用できるが、ハードリンクを作成するコマンドはWindows 2000以前では用意されていなかった(そのためハードリンクはWindows OSではほとんど使われていない)。だがWindows XP以降のOSにはfsutil.exeというコマンドがあり、これを使ってハードリンクを作成できる。本TIPSではこのハードリンクの作成方法について解説する。なおWindows VistaおよびWindows Server 2008では、より柔軟性の高いシンボリック・リンク機能が新たにサポートされている。詳細についてはTIPS「Windows Vista/Windows Server 2008でシンボリック・リンクを作成する」を参照していただきたい。

Windows OSにおけるハードリンクの制限

 Windows OSでもUNIXなどのようなハードリンクが利用できるが、いくらか制限があるのでまとめておく。

  • ハードリンクが利用できるのはNTFSボリュームのみである。FATボリューム上にはハードリンクは作成できない。
  • ハードリンクはファイルに対してのみ作成できる。フォルダ(ディレクトリ)に対してはハードリンクは作成できない。
  • ハードリンクは、同一ボリューム内のファイルに対してのみ作成できる。別ボリュームや別サーバの別ボリューム上のファイルへのハードリンクは作成できない(これはUNIXも同様)。
  • あるファイルに対して、いくつのハードリンクが作成されているかを知るコマンドはない(UNIXの場合はlsコマンドでリンク・カウント数を表示できる)。また、どれが最初に作成された実体を持つファイルで、どれが後から作成されたハードリンクかを区別できない。
  • ハードリンクを作成するにはコマンド・プロンプト上で作業する必要がある。エクスプローラでは操作できない。
  • リンクを作成するコマンドはUNIXとは異なるが、SFU(Microsoft Windows Services for UNIX)に含まれるlnコマンドを使えば、同様に操作できる(SFUについてはTIPS「UNIX互換環境を実現するSFUを利用する」参照)。
操作方法

fsutil hardlink createコマンドでハードリンクを作成する

 ハードリンクを作成するには、Windows XP以降に用意されているfsutil.exeというコマンドを利用する(このコマンドをWindows 2000上でも利用することはできるようであるが、保証外である)。コマンド・プロンプトを開き、次の書式でコマンドを入力してハードリンクを作成する。なおWindows Vistaの場合は、UACによってfsutil.exeの実行がブロックされるため、管理者権限のあるコマンド・プロンプト上で作業する必要がある(TIPS「Windows Vistaでプログラムを管理者モードで実行する」参照)。

fsutil hardlink create <新しいファイル名> <リンク先のファイル>

 <リンク先のファイル>は既存のファイル名で、それに対して付けたい新しい名前を<新しいファイル名>に指定する(UNIXのlnコマンドとは引数の順番が逆であることに注意)。

 例えばカレント・フォルダにtest.txtというファイルが存在する場合、それに対して新たにsample.textというハードリンクを付けたければ(sample.txtという別名でもアクセスできるようにしたければ)、次のように実行する。

C:\Document>fsutil hardlink create /?  ……使い方の表示
使用法 : fsutil hardlink create <新しいファイル名> <既存のファイル名>
    例 : fsutil hardlink create c:\foo.txt c:\bar.txt

C:\Document>dir  ……作成前のファイルの確認
ドライブ C のボリューム ラベルは NTFSVOL1 です
ボリューム シリアル番号は 2CA0-9B21 です

C:\Document のディレクトリ

2008/02/01  10:41    <DIR>          .
2008/02/01  10:41    <DIR>          ..
2008/02/01  10:41             3,710 test.txt  ……元のファイル
               1 個のファイル               3,710 バイト
               2 個のディレクトリ  10,424,483,840 バイトの空き領域

C:\Document>fsutil hardlink create sample.text test.txt  ……ハードリンクの作成
C:\Document\sample.text <<===>> C:\Document\test.txt のハードリンクが作成されました  ……ハードリンクが作成された

C:\Document>dir  ……作成後のファイルの確認
ドライブ C のボリューム ラベルは NTFSVOL1 です
ボリューム シリアル番号は 2CA0-9B21 です

C:\Document のディレクトリ

2008/02/01  10:42    <DIR>          .
2008/02/01  10:42    <DIR>          ..
2008/02/01  10:41             3,710 sample.text  ……元のファイル
2008/02/01  10:41             3,710 test.txt  ……ハードリンク
               2 個のファイル               7,420 バイト
               2 個のディレクトリ  10,424,483,840 バイトの空き領域

C:\Document>

 この結果で分かるように、作成されたハードリンクのファイル属性(サイズや更新日付)は元と同じである。いずれの名前でアクセスしても同じものが得られるし、sample.textを更新してからtest.txtを表示させると、内容が変更されていることが確認できる。

 なおリンクを張る先は同じフォルダ内でなくてもよいし、1つのファイルに対して2つ以上の多数のハードリンクを作成してもよい。

ハードリンクの削除

 ハードリンクを作成するコマンドはあるが、削除するコマンドは特に用意されていない(これもUNIXと同様)。通常のDELコマンドやエクスプローラの削除機能でファイルを削除すれば、リンクは削除される。ただし1つの実体に対して2つ以上のリンクが存在する場合は、ファイルの実体に対するリンク数が1つ減らされ、リンクがすべて削除された時点でファイルの実体が削除/解放される(リンクを削除する順番は任意)。オリジナルのファイル名も1つのリンクと数え、リンク数が0になった時点でファイルの実体が削除されるのである(この時点でディスクの空き領域が増える)。つまりファイルとは、1つの実体と、それに対する(複数の)リンクから構成されていると考えられる。

C:\Document>dir  ……削除前の状態の確認
ドライブ C のボリューム ラベルは NTFSVOL1 です
ボリューム シリアル番号は 2CA0-9B21 です

C:\Document のディレクトリ

2008/02/01  10:42    <DIR>          .
2008/02/01  10:42    <DIR>          ..
2008/02/01  10:41             3,710 sample.text
2008/02/01  10:41             3,710 test.txt
               2 個のファイル               7,420 バイト
               2 個のディレクトリ  10,424,483,840 バイトの空き領域

C:\Document>del test.txt  ……リンクを1つ削除してみる

C:\Document>dir  ……削除後のファイルの確認
ドライブ C のボリューム ラベルは NTFSVOL1 です
ボリューム シリアル番号は 2CA0-9B21 です

C:\Document のディレクトリ

2008/02/01  10:42    <DIR>          .
2008/02/01  10:42    <DIR>          ..
2008/02/01  10:41             3,710 sample.text
               1 個のファイル               3,710 バイト
               2 個のディレクトリ  10,424,483,840 バイトの空き領域  ……1つリンクを削除したが、空き領域のサイズは変わっていない。ファイルの実体がまだ削除されていないためである

C:\Document>

Windows Vista/Windows Server 2008のmklinkコマンド

 Windows Vista/Windows Server 2008では、リンクを作成するためにmklinkというコマンド(コマンド・プロンプトの内部コマンド)が用意されている。このコマンドでは、ハードリンクだけでなく、ジャンクション(リパース・ポイント)やシンボリック・リンクも作成できる。ハードリンクを作成するには、/hオプションを付けて実行すればよい(ジャンクションについてはTIPS「ジャンクション機能を使ってディスク・ボリュームをマウントする」、シンボリック・リンクについてはTIPS「Windows Vista/Windows Server 2008でシンボリック・リンクを作成する」をそれぞれ参照のこと)。End of Article

C:\Document>mklink /h sample2.txt test.txt
sample2.txt <<===>> test.txt のハードリンクが作成されました

更新履歴
【2013/01/31】 mklinkコマンドのことを「mklink.exe」すなわち外部コマンドとして表記していましたが、mklinkはコマンド・プロンプトの内部コマンドでした。そこで「mklink.exe」を「mklink」に修正し、内部コマンドであることを追記しました。以上、お詫びして訂正いたします。
【2008/02/22】 Windows Vista/Windows Server 2008のmklinkコマンドに関する記述を追加しました。

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間