コンピューティングにおいて、ハードリンクとは、(ディレクトリベースのファイルシステムにおける)ディレクトリエントリであり、ファイル名とファイル名を関連付けるものです。したがって、各ファイルには少なくとも1つのハードリンクが必要です。ファイルに対して追加のハードリンクを作成すると、そのファイルの内容に別のパス(つまり、異なる名前または異なるディレクトリ)からアクセスできるようになります。[ 1 ]これによりエイリアス効果が生じます。プロセスは、いずれかのパスでファイルを開き、その内容を変更できます。対照的に、ソフトリンクまたは「ショートカット」は、ファイル自体への直接リンクではなく、ハードリンクまたは別のソフトリンクへの参照です。
多くのシステムでは、ディレクトリ自体が特殊なファイルであり、他のデータではなくファイル名のリストが含まれています。そのため、ディレクトリへのハードリンクを複数作成することが可能となり、ツリーのような分岐構造ではなく、循環的なディレクトリ構造が形成される可能性があります。こうした理由から、一部のファイルシステムでは、ディレクトリへの追加のハードリンクの作成を禁止しています。
Linux、Android、macOS、およびPOSIXに準拠していないWindows NTファミリー[ 2 ]などのPOSIX準拠のオペレーティングシステムは、ファイルシステムに応じて、同じファイルへの複数のハードリンクをサポートしています。たとえば、NTFSとReFSはハードリンクをサポートしていますが[ 3 ] 、 FATはサポートしていません。

「LINK A.TXT」と「LINK B.TXT」という2つのハードリンクが、同じ物理データを参照しているとします。テキストエディタで「LINK A.TXT」を開き、編集して保存します。エディタ(または他のアプリケーション)が「LINK B.TXT」を開くと、両方のファイル名が同じデータを参照しているため、「LINK A.TXT」に加えられた変更を確認できます。つまり、ユーザーの視点から見ると、これは複数のファイル名を持つ1つのファイルのように見えます。いずれかのファイル名を編集すると「すべて」のファイルが変更されますが、最後のファイル名以外の「いずれかの」ファイル名を削除しても、ファイルは残ります。
しかし、 GNU Emacsなどの一部のエディタは、ハードリンクの概念を破ります。たとえば「LINK B.TXT」というファイルを開いて編集する場合、Emacsは「LINK B.TXT」を「LINK B.TXT~」に名前変更し、「LINK B.TXT~」をエディタに読み込み、変更内容を新しく作成された「LINK B.TXT」に保存します。このため、「LINK A.TXT」と「LINK B.TXT」は同じデータを共有しなくなります。(この動作は、Emacsの変数を使用して変更できますbackup-by-copying。)
物理データへのハードリンクはいくつでも作成できます。データにアクセスするには、ユーザーは既存のリンクの名前を指定するだけでよく、オペレーティングシステムが実際のデータの場所を特定します。ユーザーがハードリンクを1つ削除しても、残りのリンクからデータにアクセスできます。ユーザーがすべてのリンクを削除した後、どのプロセスもそのファイルを開いていなければ、オペレーティングシステムはファイルが以前占有していたディスク領域を解放します。

ハードリンクをサポートするほとんどのファイルシステムは、参照カウント方式を採用しています。ファイルシステムは、各論理データセクションに、そのデータを指すために作成されたハードリンクの総数を表す整数値を格納します。新しいリンクが作成されると、この値は1増加します。リンクが削除されると、値は1減少します。カウンタがゼロになると、オペレーティングシステムは論理データセクションを解放します。(ただし、パフォーマンス上の理由、未処理のファイルハンドルが残っている場合、またはundeleteコマンドを有効にする場合など、OSがすぐに解放しない場合もあります。)
これは、ファイルシステムが特定のストレージ領域の使用状況を追跡するためのシンプルな方法です。ゼロ値は空き領域を、ゼロ以外の値は使用済み領域を示します。この値を維持することで、どこにもリンクされていない無効なハードリンクが存在しないことが保証されます。データセクションとそれに関連付けられたinodeは、単一のハードリンク(ディレクトリ参照)がそれを指しているか、または何らかのプロセスが関連付けられたファイルを開いている限り保持されます。
POSIX準拠のオペレーティングシステムでは、ファイルまたはディレクトリの参照カウントは、stat()または fstat() システムコールによって のst_nlinkフィールドに返されますstruct stat。
ファイルシステムのループを防ぎ、「..」ファイル(親ディレクトリ)の解釈を一貫して維持するために、オペレーティングシステムは一般的にディレクトリへのハードリンクを許可しません。UNIX System Vでは許可されていましたが、そのようなリンクを作成する権限はスーパーユーザーのみにありました。 [ 4 ] Mac OS X v10.5 (Leopard)以降では、Time Machineバックアップメカニズムのためだけにディレクトリへのハードリンクを使用します。[ 5 ]
ハードリンクは、同一ボリューム上、つまり同一ファイルシステム内のファイルにのみ作成できます。(これは、ハードリンクが「名前 → inode」の関連付けであり、inodeはその番号で識別され、inode番号はパーティション内でのみ一意であるためです。また、異なるボリュームは異なるファイルシステムを持つ可能性があります。ターゲットボリュームのファイルシステムがハードリンクと互換性があるという保証はありません。)
特定の種類のファイルシステム上の単一ファイルへのハードリンクの最大数は、ファイルシステムの参照カウンタのサイズと、オペレーティングシステムのメモリ内のファイルごとのデータ構造にある参照カウンタのコピーのサイズによって制限されます。また、オペレーティングシステムのコード内のポリシーの選択によって制限される場合もあります。許可されたリンク数を超えるとエラーになります。1975 年にリリースされた AT&T Unix System 6では、許可されたハードリンクの数は 127 でした。[ 6 ] [ 7 ] Unix ライクなシステムでは、メモリ内のカウンタは 4,294,967,295 (32 ビット マシン) または 18,446,744,073,709,551,615 (64 ビット マシン) です。一部のファイルシステムでは、ハードリンクの数は、ディスク上のフォーマットによってより厳密に制限されます。例えば、Linux 3.11 以降では、ext4ファイルシステムはファイル上のハードリンクの数を 65,000 に制限しています。[ 8 ] Windows はNTFSボリューム上のファイルへのハードリンクを 1024 に制限しています。[ 9 ]
Linux Weekly Newsで、ニール・ブラウンはハードリンクはメンテナンスが大変だと批判した。ハードリンクは、アーカイブツールやディスク使用量ツールなど、ディレクトリツリーを扱うプログラムの設計を複雑にするからである。これらのアプリケーションは、階層内で複数回リンクされているファイルの重複排除に注意を払わなければならない。ブラウンは、Unix の後継としてベル研究所が開発した Plan 9 にはハードリンクの概念が含まれていないと指摘している。 [ 10 ]
Windows NT 3.1以降は、NTFSファイルシステム上のハードリンクをサポートしています。[ 11 ] Windows 2000ではCreateHardLink()ハードリンクを作成する機能が導入されましたが、ディレクトリではなくファイルのみを対象としています。[ 12 ]このDeleteFile()機能はハードリンクを削除することもできます。
Windowsでハードリンクを作成するには、エンドユーザーは以下の方法を使用できます。
fsutilで導入)[ 13 ]mklinkの内部コマンド( Windows VistaおよびWindows Server 2008で導入) [ 14 ]New-Itemのコマンドレット[ 15 ]ファイル内のハードリンクを調べるには、エンドユーザーは以下の方法を使用できます。
fsutilGet-ItemコマンドGet-ChildItemレット。これらのコマンドレットは、各ファイルをオブジェクトで表します。PowerShell は、それぞれに読み取り専用の LinkType プロパティを追加します。このプロパティには、関連付けられたファイルに複数のハードリンクがある場合、 「HardLink」という文字列が含まれます。[ 16 ]Windowsコンポーネントストアは、ハードリンクを使用して、ハードディスクドライブに保存されているコンポーネントのさまざまなバージョンを追跡します。
Unix系システムでは、link()システムコールによって既存のファイルへのハードリンクを追加作成できます。ハードリンクを作成するには、エンドユーザーは以下を使用できます。
ファイル内のハードリンクを調べるには、エンドユーザーは以下の方法を使用できます。
CygwinやSubsystem for UNIX-based Applicationsなど、Microsoft Windows上で動作するUnixライクなエミュレーションまたは互換性ソフトウェアは、POSIXインターフェースの使用を可能にする。
OpenVMSはODS-5ファイルシステム上のハードリンクをサポートしています。[ 17 ] Unixとは異なり、VMSはディレクトリへのハードリンクを作成できます。
freedupコマンドは、重複したデータストアを自動生成されたハードリンクに置き換えることで、ディスク容量を解放します。--link-dest=DIR新しいバックアップフォルダが変更されていない場合は、以前のバックアップのハードリンクを使用するようにサポートしています[ 18 ]スペースと時間を節約する機能 (増分バックアップ) [ 19 ] [ 20 ] [ 21 ]既存のファイルと新しいファイルの間にハード リンクを確立します。この関数は NTFS ファイルシステムでのみサポートされ、ディレクトリではなくファイルのみに使用できます。
場所が FileSystem ドライブにある場合、次の値が許可されます。場所が FileSystem ドライブにある場合、次の値が許可されます: File[,] Directory[,] Junction[,] HardLink
このオプションは --copy-dest と同様に動作しますが、変更されていないファイルは DIR から宛先ディレクトリにハードリンクされます。ファイルがリンクされるためには、すべての保持属性 (パーミッション、場合によっては所有権など) が同一である必要があります。
link-dest引数を使用すると、変更されていないファイルを別の宛先からハードリンクできるため、転送時間とディスク容量の両方を節約できます。
内のファイルがリモートサーバー上のファイルと同じ場合、rsyncはファイルをコピーする代わりに、/backup/server1Old内のファイルから/backup/server1Newへのハードリンクを作成します。
変更内容を新しいディレクトリにコピーし、変更されていないファイルについては可能な限りハードリンクを作成する。