ハードリンク
ハードリンクとはコンピュータのファイルシステム上のファイルやディレクトリ等の資源とその資源につけられた名前を結びつけること、もしくは、その結びつきのことをいう。よって、名前によってアクセスできるファイルは少なくともひとつのハードリンクを持っている。ファイルは複数のハードリンクを持つこともある。この場合、そのファイルは複数の異なった名前でアクセスできる。UNIXを例に言えば、すべてのファイル、ディレクトリにはiノードと呼ばれる固有のIDが割り当てられている。ハードリンクとは同じID(iノード)にアクセスするファイル(ディレクトリ)のことであり、新しくハードリンクを張れば、同じ実体(右図のActual Data on Disk)へアクセスする方法が複数あると言うことになる。そのどちらかに変更を加えると、ファイルシステムはiノードが同一であるすべてのファイルに変更を反映する。これにより、あたかもソフトリンクであるかのように機能する。ファイルの内容が全く同じであるため、ほかのディレクトリへ移動出来ないシンボリックリンクとは違い、リンク先のファイル(オリジナル)をどこに移動してもリンクが切れることはない。
ソフトリンクが名前とファイルへのアクセス方法を結びつけるのに対し、ハードリンクは名前をファイルに直接結びつけるものであるため、ファイルへのアクセスはどの名前からハードリンクをたどっても同じ処理方法となる。ファイルに複数のハードリンクを作ることができるファイルシステムでは、ファイルを削除するというのはハードリンクを削除するという意味で使われる。そのようなシステムではファイルはハードリンクによる参照カウントを記録しており、ハードリンクが削除された場合でも、別のハードリンクが存在している限り、ファイル自体は削除されずに残る。参照するハードリンクがなくなった時点でファイルが削除される。また、オリジナルを削除した場合はそのファイルのリンク元がオリジナルとして機能するようになる(ファイルの内容が削除したファイルと同じ内容であるため)。
ハードリンクはその性質上ファイルシステムそのものの機能に強く依存しており、異なったボリューム間をまたがったリンクを作成するのは原理的に不可能である。
ファイルに別名をつける機能としてのハードリンクは主にソフトリンク(UNIXではシンボリックリンク)が実装されていなかった時代のUNIXで用いられた。最近ではNTFSやHFS+にも実装されており、今日利用されている多くのオペレーティングシステムに備わっているが、ファイルに別名をつける目的には、ボリューム間でもリンクを作ることができ、管理も簡単なソフトリンクを用いることが多い。
UNIXにおいては、ディレクトリが3種類のハードリンクで参照されているのが特徴的である。例えば「tmp」と呼ばれるディレクトリに対して、その3つとは
- 親ディレクトリからそのディレクトリを参照するためにつけられた「tmp」という名前
- そのディレクトリから自分自身を参照するためにつけられた「.」という名前
- 子ディレクトリからそのディレクトリを参照するためにつけられた「..」という名前
である。最後のハードリンクは子ディレクトリの数だけ作られる。