ハードリンクとシンボリックリンクの違い

定義
  • ハードリンク:ファイルシステム上の同じiノードを複数のファイル名で参照する方法。
  • シンボリックリンク:実際のデータを含まずに別の場所を参照する、ポインタのようなファイル。
ファイルの関連性
  • ハードリンク:同じiノードを共有するファイル。オリジナルのファイルとハードリンクはデータを共有している。
  • シンボリックリンク:実際のデータを含まず、別のファイルやディレクトリへのパスを保持する。シンボリックリンクとリンク先は別々のエンティティ。
扱いやすさ
  • ハードリンク:ファイルの内容が変更されると、ハードリンク先の内容も同じになる。リンクの存在を気にせずに利用できる。
  • シンボリックリンク:リンク先のファイルが移動または削除されると、リンクは無効になる。リンクが参照する場所の維持が必要。
ファイルシステム内/外での利用
  • ハードリンク:同じファイルシステム内でのみ作成可能。
  • シンボリックリンク:同じファイルシステム内外を問わず、作成可能。

ハードリンクとシンボリックリンクの違いの例

ハードリンクとシンボリックリンクの違いを確認していきます。

・「note」ファイルを作成します。

$ echo "This is note." > note

・ハードリンクファイル「note.hard」を作成します。

$ ln note note.hard

・シンボリックリンクファイル「note.sym」を作成します。

$ ln -s note note.sym

・iノードを確認します。

$ ls -i note note.hard note.sym
35718196 note  35718196 note.hard  35718202 note.sym

 ハードリンクファイルは元の「note」と同じ iノード番号を持っています。※この iノード番号は、実行環境により変わります。

シンボリックリンクは元の「note」の iノード番号と異なります。

この状況を図にまとめます。

元のファイルである「note」ファイル、ハードリンクファイル、シンボリックリンクファイルの内容を表示します。

$ cat note
This is note.
$ cat note.hard
This is note.
$ cat note.sym
This is note.

・元のファイルである「note」を削除します。

元のファイルである「note」ファイル、ハードリンクファイル、シンボリックリンクファイルの内容を表示します。

$ rm note
$ cat note
cat: note: そのようなファイルやディレクトリはありません
$ cat note.hard
This is note.
$ cat note.sym
cat: note.sym: そのようなファイルやディレクトリはありません

 「note」ファイルは削除したため、もちろん、ありません。ハードリンクファイルは、同じように表示されます。それは、「note」と同じ iノード番号で同じ場所を指示しているからです。

 シンボリックリンクファイルでは「そのようなファイルやディレクトリはありません」と表示されます。シンボリックリンクは、あくまで、ファイルへの参照先(ポインタ)を格納しているにすぎなく、参照先のファイルがなくなれば、当然ながら、アクセスすることができません。


 ファイルの内容である「This is note.」は、まだ、ディスク上に残っています。それでは、ハードリンクファイルる「note.hard」を削除した場合は、どうなるでしょうか?

Linuxにおいて、

ファイルを削除するということは、ファイル名と iノードへのリンクを切断する。

と、いうことを意味します。

リンクが切断されるだけでファイルの内容は、まだ、残っています。新しいファイルで上書きされるまで残ることになります。