ハードリンク

ハードリンクは、コンピュータのファイルシステム上のファイルやディレクトリ等の資源とその資源につけられた名前を結びつけること、もしくは、その結びつきのことである。

概要
名前によってアクセスできるファイルは少なくともひとつのハードリンクを持っている。ファイルは複数のハードリンクを持つこともある。この場合、そのファイルは複数の異なった名前でアクセスできる。UNIXを例に言えば、すべてのファイル、ディレクトリにはinodeと呼ばれる固有のIDが割り当てられている。ハードリンクとは同じID（iノード）にアクセスするファイル（ディレクトリ）のことであり、新しくハードリンクを張れば、同じ実体（右図のActual Data on Disk）へアクセスする方法が複数あると言うことになる。そのいずれから変更を加えても、対象となる実体やiノードは同一であるため、見かけ上すべてのファイルに変更が反映される。これにより、あたかもソフトリンクであるかのように機能する。ソフトリンク(UNIXではシンボリックリンク)では、リンク対象（オリジナル）が改名されたり、ディレクトリを移動したりするとリンクが無効になってしまう。一方ハードリンクでは、オリジナルは単に先に張られたハードリンクというだけであり、後から張られたハードリンクとの差はない。したがって、オリジナルを改名したり、どこかに移動したりしてもリンクが切れることはない（右図の"LINK A.TXT"をたとえば"LINK C.TXT"のように改名しても、"LINK B.TXT"には影響しない）。

ソフトリンクが名前とファイルへのアクセス方法を結びつけるのに対し、ハードリンクは名前をファイルの実体に直接結びつけるものであるため、ファイルの実体へのアクセスはどの名前からハードリンクをたどっても同じ処理方法となる。ファイルに複数のハードリンクを作ることができるファイルシステムでは、ファイルを削除するというのはハードリンクを削除するという意味で使われる。そのようなシステムではファイルはハードリンクによる参照カウント（リンクカウント）を記録しており、1つのハードリンクが削除された場合でも、別のハードリンクが存在している限り、固有のiノードを持つファイルの実体は削除されずに残る。参照するハードリンクがなくなった時点でファイルが削除される。

なお、ハードリンクはその性質上ファイルシステムの機能に強く依存しているため、異なったボリューム間をまたがったリンクを作成するのは原理的に不可能である。

ファイルに別名をつける機能としてのハードリンクは、主にソフトリンクが実装されていなかった時代のUNIXで用いられた。最近ではNTFSやHFS+にも実装されており、今日利用されている多くのオペレーティングシステムに備わっているが、ファイルに別名をつける目的には、ボリューム間でもリンクを作ることができ、管理も簡単なソフトリンクを用いることが多い。

UNIXにおいては、各ディレクトリが3種類のハードリンクで参照されているのが特徴的である。tmpディレクトリに対して
 親ディレクトリからそのディレクトリを参照するためにつけられた「tmp」という名前
 そのディレクトリから自身を参照するためにつけられた「.」という名前
 子ディレクトリからそのディレクトリを参照するためにつけられた「..」という名前
なお、ハードリンク「..」はそのディレクトリが持つ子ディレクトリと同数が存在する。

Windowsにおいては、Windows NT 3.1からファイルに対するハードリンクをサポートした。その方法はWindows XP以降ではコマンドプロントにて

 fsutil hardlink create "新しく作られるファイルのパス" "元データとなるファイルのパス"

と入力する。

また、複数のハードリンクを持つファイルを何らかのプログラムで開いている時、ハードリンクに対するファイル操作はロックされる。すなわち、ディレクトリA及びディレクトリBという二つのハードリンクを持つファイルXを開いている間は、たとえディレクトリAから参照して開いていたとしても、ディレクトリBに存在するファイルXの削除や名前の変更などのファイル操作はできない。

OSのファイルシステム
UNIX
Microsoft Windows
Mac OS