Linuxのファイルシステムを学ぶ際に「シンボリックリンクとハードリンクの違いがよくわからない」と感じる方は多いのではないでしょうか。
この2つはどちらも「ファイルに別名でアクセスする仕組み」ですが、内部の動作原理が根本的に異なります。
この記事では、シンボリックリンクとハードリンクの違いを具体例を交えながら詳しく解説し、適切な使い分けのポイントもお伝えしていきます。
シンボリックリンクは参照先パスを持つ別ファイルでありハードリンクは同じinodeを共有する別名である
それではまず、2つのリンクの最も根本的な違いについて解説していきます。
ハードリンクとは、ファイルの実体(inode)に対して複数のファイル名(ディレクトリエントリ)を対応させる仕組みです。
つまり同じデータを指す名前が複数存在する状態であり、どのハードリンクからアクセスしても全く同じinodeを通じてデータにアクセスします。
シンボリックリンクとハードリンクの最大の違いは「inodeの共有」にあります。
ハードリンクは元ファイルと同じinodeを共有するため「同じファイルの別名」に相当します。一方シンボリックリンクは独自のinodeを持つ「参照先パスを格納した別のファイル」であり、元ファイルが削除されると参照が壊れます。
この根本的な仕組みの違いが、削除時の動作・ファイルシステムをまたいだ参照・ディレクトリへの対応可否など、さまざまな動作の違いに繋がっています。
削除時の動作の違い
続いては、元ファイルが削除されたときのシンボリックリンクとハードリンクそれぞれの動作の違いについて確認していきます。
ハードリンクの場合:データは保持される
ハードリンクでは、元ファイルを削除してもデータは即座に消えません。
Linuxのファイルシステムでは「参照カウント」という仕組みがあり、そのinodeを参照しているハードリンクが1つでも残っている限りデータは保持されます。
全てのハードリンクが削除されて参照カウントがゼロになった時点で、初めて実際のデータが削除されます。
シンボリックリンクの場合:ダングリングリンクになる
シンボリックリンクは参照先のパスを保持するだけであるため、参照先のファイルが削除されるとリンク先が存在しない「ダングリングリンク」になります。
この状態でシンボリックリンクを通じてアクセスしようとすると「No such file or directory」エラーが発生します。
シンボリックリンクは元ファイルの存在に依存しているため、参照先ファイルの管理に注意が必要です。
ファイルシステムをまたいだ参照の可否
続いては、ファイルシステムをまたいだ参照が可能かどうかの違いについて確認していきます。
ハードリンクの制限
ハードリンクは同じファイルシステム・同じパーティション内でのみ作成できます。
これはハードリンクが同じinodeを共有する仕組みであるためであり、inodeはファイルシステムごとに独立して管理されるため、別ファイルシステムのinodeを参照することができないのです。
シンボリックリンクの優位性
シンボリックリンクはパス文字列を格納するだけであるため、別のファイルシステム・別のパーティション・さらにはネットワークドライブ上のファイルを参照することも可能です。
この柔軟性がシンボリックリンクがより広く活用される理由のひとつです。
ディレクトリへの対応とls表示の違い
続いては、ディレクトリへの適用可否とコマンドラインでの表示の違いについて確認していきます。
ディレクトリへの対応
ハードリンクはほとんどのLinux/Unix環境でディレクトリに対して作成することができません。
これはディレクトリのハードリンクを許可するとファイルシステムの木構造に循環が生じ、管理が複雑化するためです。
シンボリックリンクはディレクトリに対しても作成可能であり、ディレクトリシンボリックリンクはシステム管理やソフトウェア構成管理において非常に便利に活用されます。
ls -lコマンドでの表示の違い
ls -lコマンドでの表示例
ハードリンク:-rw-r–r– 2 user group 1024 Apr 1 hardlink_file
(リンクカウントが「2」と表示される。元ファイルと同一のinodeを共有)
シンボリックリンク:lrwxrwxrwx 1 user group 15 Apr 1 symlink_file -> /path/to/original
(パーミッションの先頭が「l」となり、参照先パスが「->」で表示される)
シンボリックリンクとハードリンクの使い分け
続いては、どちらのリンクをどのような場面で使うべきかの使い分け基準について確認していきます。
シンボリックリンクを使うべき場面
シンボリックリンクが適している場面は以下のとおりです。
異なるファイルシステムや別パーティションのファイルを参照したい場合・ディレクトリへのリンクが必要な場合・バージョン切り替えや設定ファイルの管理など参照先を動的に変更する可能性がある場合にシンボリックリンクが最適です。
ハードリンクを使うべき場面
ハードリンクが適している場面はよりシンプルです。
同一ファイルシステム内で参照先が削除されてもデータを保持したい場合や、バックアップシステムでのデータ重複排除(同一データを複数の場所に見せかけて実体は1つにしたい場合)などがハードリンクの典型的な用途です。
| 比較項目 | シンボリックリンク | ハードリンク |
|---|---|---|
| inode | 独自(別ファイル) | 共有(同じinode) |
| 参照先削除時 | ダングリングリンク | データ保持 |
| 別ファイルシステム参照 | 可能 | 不可 |
| ディレクトリへの対応 | 可能 | 通常不可 |
| ls表示 | 先頭「l」・参照先表示 | リンクカウントが増加 |
まとめ
シンボリックリンクは参照先パスを格納した独立したファイルであり、ハードリンクは同じinodeを共有する別名です。
参照先が削除された場合の動作・別ファイルシステムへの対応・ディレクトリへの適用可否など、根本的な仕組みの違いがさまざまな動作の違いに繋がっています。
柔軟なファイル参照が必要な場面ではシンボリックリンクを、データの保全を重視する場面ではハードリンクを使い分けることが重要でしょう。
それぞれの特性を正しく理解して、ファイルシステムの管理をより効率的に行っていただければと思います。