ハードリンクとは何ですか? — The Linux Information Project (LINFO) による定義

ハードリンクとは、Linux や他の Unix 系 OS 上の既存のファイルに対する追加の名前に過ぎない

任意の数のハードリンク、したがって任意の数の名前を、任意のファイルに対して作成することができる。 ハード リンクは、他のハード リンクに作成することもできます。 しかし、ディレクトリに対して作成することはできませんし、ファイルシステムの境界を越えたり、パーティションにまたがることはできません。

オペレーティング システムは、最初に作成されたときにファイルに割り当てられた名前と、その後に作成されたそのファイルへのハード リンクを、同じファイルに対する複数の名前であるということ以外には区別しない。 これは、元の名前とハードリンクがすべて同じinodeを指しているためです。 inodeは、ファイル名と実際のデータを除く、ファイルに関するすべての情報(サイズ、アクセス許可、作成日、システム上の場所など)を格納するデータ構造(情報を格納する最適化された方法)である。 inode 番号がファイルシステム内で一意であることが、ファイルシステムやパーティション間で動作しない理由です。

ハードリンクは ln コマンドで作成します。 たとえば、次のようにすると、カレントディレクトリ (すなわち、ユーザーが現在作業しているディレクトリ) にある file1 という名前のファイルへの hlink1 という名前のハードリンクが作成される:

ln file1 hlink1

ハードリンクを作成しても、他のファイルと異なるという明らかな兆候はない。 つまり、ハード リンクは、ls (すなわち、リスト) や file (指定されたファイルのタイプを決定するために使用) などのコマンドを使用して表示すると、ターゲット ファイル (すなわち、リンク先のファイル) と同じタイプのファイルのように見えます。 同様に、GUI (グラフィカル ユーザー インターフェイス) で見た場合、ハードリンクのアイコンはターゲット ファイルのアイコンと同じです。

あるファイルの最初の名前とそのファイルへのすべてのハードリンクが同じ inode を共有していることは、ls コマンドで -i (= inode) オプションを使用すれば明確に分かります。 たとえば、次のようにすると、上記の例の file1 と hlink1 の inode 番号が同じであることがわかる。

ls -i file1 hlink1

任意のファイルへのハードリンク数は、ls に -l(つまり長い)オプションを付けて使用すると、2列目に出力される。 この数は、ターゲットファイルとそれへのハードリンクの合計であることがわかる (つまり、, の合計であり、ターゲットとそのようなリンクのそれぞれについて同じであることがわかる。

ハードリンクされたファイルは、次のように find コマンドの -type f オプション (通常のファイルのみを選択) と -links +1 オプション (複数のハードリンクを持つ通常のファイルすべてを表示) を使用して見つけることもできます:

find -type f -links +1

ファイルの内容に変更があった場合、すべてのハードリンクへのリンクは保存される。 しかし、テキストエディタによっては、変更された内容に対して新しい inode を作成することでリンクを壊すことがあるため1、ファイルを変更した後に重要なリンクをチェックすることが賢明である。

rmコマンドは表面的にはファイルを削除しているように見える。 しかし、実際に行うのは、ファイルのハードリンク数 (すなわち、ファイルが持つ名前の数) を 1 つ減らすことであり、inode やファイルのデータには直接影響を与えない。 カウントがゼロになると、そのファイルを参照する簡単な方法がなくなるため、ファイルが消滅したように見えます。 しかし、ファイルのデータが本当に削除されるのは、そのファイルを含むハードディスクドライブ(HDD)またはその他のストレージメディア上の場所が新しいファイルで上書きされたときだけです。

したがって、たとえば、次のようにすると、上記の例で作成されたハード リンク hlink1 を削除できます:

rm hlink1

その後、次のように残った 1 つの名前で再度 rm を使用すると、ファイルのデータに実質アクセス不能にすることができます。

rm file1

おそらくハードリンクの最も有用なアプリケーションは、ファイル、プログラム、およびスクリプト (すなわち、…) を許可することです。短いプログラム)を、元のファイルや実行ファイルとは異なるディレクトリで簡単にアクセスできるようにすることです (例, とは別のディレクトリにあるファイルや実行ファイル(すぐに実行できるバージョンのプログラム)に簡単にアクセスできるようにすることです。 ハードリンクの名前を入力すると、元の名前を使用した場合と同じように、プログラムやスクリプトが実行されます。

ソフトリンクとも呼ばれるシンボリックリンクは、ディレクトリだけでなく、異なるファイルシステムや異なるパーティション上のファイルにも作成できるため、ハードリンクよりも有用である。 また、GUIを使用する場合、シンボリックリンクは特別なアイコンを持っているので、普通のファイルではなく、リンクであることがすぐに分かります。 しかし、ターゲットファイルが削除されると使用できなくなるという欠点があります。

エイリアスは、任意のファイルに対して複数の名前を提供する別の方法であるという点で表面的にはハードリンクと似ています。 しかし、エイリアスコマンドは別個のプログラムではなく、シェル (すなわち、テキストのみのユーザーインターフェイスを提供するプログラム) に組み込まれており、そのメカニズムはハードリンクのものとは非常に異なっています。 エイリアスもシンボリックリンクと同様に、ファイルだけでなくディレクトリにも使用でき、ファイルシステムやパーティションの境界を越えることができる。 さらに、エイリアスは任意のシェル テキスト (すなわち、オプションや引数を含むコマンドまたは一連のリンクされたコマンド) の短い名前として使用することができます。 しかし、同じバージョンの Linux 上で vi や Abiword テキストエディタ、および KHexEdit ヘックスエディタを使用した場合は、リンクが壊れることはありませんでした。 geditがハードリンクを保持できなかったのは、元のファイルに変更を加えるのではなく、変更したファイルのコピーを作成して保存する(したがって新しいinode番号が与えられる)ためですが、このコピーには元のファイルの名前が与えられます。 しかし、Fedora Core 5 上で新しいバージョンの gedit (2.14.0) を使って同様のテストを行ったところ、この問題は修正され、リンクの破損は見られませんでした