🙄

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

に公開

はじめに

LinuxやUnix系のオペレーティングシステムを使用していると、「リンク」という概念に出会います。リンクとは、一言で言えば「ファイルやディレクトリへの参照(別名)」を作成する機能です。このリンクには「ハードリンク」と「シンボリックリンク」の2種類が存在し、それぞれ異なる特性と用途を持っています。
本記事では、初心者の方でも理解できるよう、両者の違いを具体的な例を交えながら解説していきます。

ハードリンクの仕組みと特徴

ハードリンクは、ファイルシステム上で1つの実体(データ)に対して複数の名前(エントリ)を付ける機能です。
元のファイルとハードリンクはファイルシステム上で完全に対等な関係にあり、どちらが「原本」でどちらが「コピー」といった区別はありません。


https://tech.pjin.jp/2022/08/31/hardlink より引用

技術的には、すべてのファイルは「inode」と呼ばれるデータ構造で管理されています。
ハードリンクを作成すると、このinodeに対して新しい名前(ファイル名)が追加登録されるのです。
つまり、1つのinodeを複数の名前で参照できるようになります。


https://tech.iimon.co.jp/entry/2024/03/18/153645 より引用

ハードリンクの重要な特徴として、元のファイルを削除してもハードリンクの方には影響がないという点が挙げられます。これは、ファイルの実体(データ)はinodeが保持しており、ファイル名は単なる「参照」に過ぎないからです。すべてのハードリンクが削除されると、初めてファイルの実体が削除されます。

シンボリックリンクの仕組みと特徴

シンボリックリンクは、別のファイルやディレクトリを指し示す「ショートカット」のようなものです。
WindowsのショートカットやmacOSのエイリアスに似た概念で、これ自体は実体を持たず、参照先のパス情報だけを保持しています。

シンボリックリンクの特徴は、元のファイルが移動または削除されると「リンク切れ」になる点です。
これは、シンボリックリンクが単にパス名を保持しているだけだからです。また、シンボリックリンクはディレクトリに対しても作成可能で、異なるファイルシステム間でもリンクを作成できます。


https://tech.iimon.co.jp/entry/2024/03/18/153645 より画像引用

シンボリックリンクは「ln -s」コマンドで作成され、lsコマンドで表示すると「l」というファイルタイプで表示され、参照先のパスも一緒に表示されます。
例えば、デスクトップアプリケーションの多くは実際には/usr/binや/usr/local/binにある実行ファイルへのソフトリンクとして配置されています。

ハードリンクとソフトリンクの比較

両者の根本的な違いは「参照の仕方」にあります。ハードリンクがinodeを直接参照するのに対し、ソフトリンクはファイル名(パス)を参照します。
この違いが、以下のような様々な特性の違いを生み出しています。

まず、ファイルシステムの境界について、ハードリンクは同一ファイルシステム内でしか作成できませんが、ソフトリンクは異なるファイルシステム間でも作成可能です。また、ディレクトリへのリンクについては、ハードリンクは通常作成できません(スーパーユーザー権限では可能ですが推奨されません)が、ソフトリンクはディレクトリに対しても問題なく作成できます。

元ファイルの削除に対する挙動も異なります。ハードリンクの場合、元ファイルを削除してもデータは残りますが、ソフトリンクの場合、元ファイルを削除するとリンクが壊れてしまいます。さらに、ハードリンクは元ファイルと完全に対等なので、どちらが先に作成されたか区別できませんが、ソフトリンクは明示的に作成されたことが分かります。

実際の使用例と選択基準

ハードリンクは、例えばバックアップシステムで使用されることがあります。複数の場所から同じデータを参照したいが、ディスクスペースを節約したい場合に有効です。また、重要な設定ファイルのバックアップとしてハードリンクを作成しておくことで、誤って元ファイルを削除してもデータが保持されるという利点があります。

一方、シンボリックリンクは、アプリケーションの複数バージョン管理によく利用されます。
例えば、/usr/bin/pythonが実際には/usr/bin/python3.8へのソフトリンクになっているなど、デフォルトのバージョンを切り替えるのに便利です。また、長いパスを短い名前で参照したい場合や、ディレクトリ構造を整理する際にも活用されます。

どちらを使用するかは、目的によって異なります。ディスクスペースを節約したい、元ファイル削除後の存続性が重要な場合はハードリンクを、柔軟な参照(特にディレクトリや異なるファイルシステム間)が必要な場合はソフトリンクを選択すると良いでしょう。

注意点とトラブルシューティング

ハードリンクを使用する際の注意点として、リンク元とリンク先が同じファイルシステム上にある必要があります。また、ハードリンクが多いと、どの名前が原本なのか分からなくなる可能性があるため、管理には注意が必要です。

シンボリックリンクの一般的な問題は「リンク切れ」です。lsコマンドでリンクを確認すると、リンク切れの場合は赤色で表示されたり、参照先が存在しないことが明示されます。リンク切れを防ぐには、相対パスではなく絶対パスでリンクを作成するか、またはリンクと対象ファイルの相対的位置関係を維持する必要があります。

まとめ

ハードリンクとソフトリンクは、一見似ているようで全く異なる概念です。ハードリンクは「1つの実体に複数の名前を付ける」機能であり、ソフトリンクは「別の場所を指し示すショートカット」と考えると理解しやすいでしょう。

ファイルシステムの理解を深めるためには、実際に両方のリンクを作成し、挙動を確認してみるのが最も効果的です。lnコマンドを使った簡単な実験から始めて、徐々に実践的な場面での活用方法を身につけていくと良いでしょう。適切な場面で適切なリンクを使い分けることで、より効率的なファイル管理が可能になります。

最後までお読みいただき、ありがとうございました。

参考・画像引用元URL

https://www.infra-linux.com/menu-linux3/hard-symlink-link/
https://tech.iimon.co.jp/entry/2024/03/18/153645
https://freelance-life.jp/hdlink_snlink/
『新しいLinuxの教科書 第2版』

Discussion