コンピューティングにおいて、ハードリンクとは、(ディレクトリベースのファイルシステムにおける)名前をファイルと関連付けるディレクトリエントリのことです。したがって、各ファイルは少なくとも 1 つのハードリンクを持つ必要があります。ファイルに追加のハードリンクを作成すると、そのファイルの内容に追加のパス(異なる名前または異なるディレクトリ)でアクセスできるようになります。[ 1 ]これによりエイリアス効果が発生します。つまり、プロセスは任意のパスでファイルを開き、その内容を変更することができます。対照的に、ファイルへのソフトリンクまたは「ショートカット」は、データ自体への直接リンクではなく、ハードリンクまたは別のソフトリンクへの参照です。
多くのシステムでは、ディレクトリ自体が特別なファイルであり、他のデータではなくファイル名のリストを保持しています。そのため、ディレクトリへのハードリンクが複数存在する可能性があり、ツリー構造のような分岐構造ではなく、循環的なディレクトリ構造が形成される可能性があります。そのため、一部のファイルシステムでは、ディレクトリへの追加のハードリンクの作成を禁止しています。
POSIX準拠のオペレーティングシステム(Linux、Android、macOS、およびPOSIX非準拠のWindows NTファミリーなど) [ 2 ]は、ファイルシステムに応じて、同一ファイルへの複数のハードリンクをサポートしています。例えば、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ずつ減少します。カウンタがゼロになると、オペレーティングシステムは論理データセクションを解放します。(OSは、パフォーマンス上の理由やundeleteコマンドを有効にするために、未処理のファイルハンドルが開いている場合など、すぐには解放しない場合があります。)
これは、ファイルシステムが特定のストレージ領域の使用状況を追跡するためのシンプルな方法です。ゼロ値は空き領域を示し、非ゼロ値は使用済み領域を示します。この値を維持することで、どこにも参照されていないハードリンクが存在しないことが保証されます。データセクションとそれに関連する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ファイルシステムでのみサポートされており、ディレクトリではなくファイルに対してのみサポートされています。
場所がファイルシステムドライブ内にある場合、次の値が許可されます。場所がファイルシステムドライブ内にある場合、次の値が許可されます。File[,] Directory[,] Junction[,] HardLink
このオプションは--copy-destと同様に動作しますが、変更されていないファイルはDIRからコピー先ディレクトリにハードリンクされます。ファイルをリンクするには、保存されるすべての属性(権限、所有権など)が同一である必要があります。
link-dest引数を使用すると、変更されていないファイルを別の宛先からハードリンクすることができ、転送時間とディスク容量の両方を節約できます。
内のファイルがリモートサーバー上のファイルと同じ場合、rsyncはそれをコピーする代わりに、/backup/server1Old内のファイルから/backup/server1Newへのハードリンクを作成します。
変更を新しいディレクトリにコピーし、変更されていないファイルに可能な限りハードリンクを作成します。