
スポンサーリンク
LinuxやUnix系OSを扱っていると頻繁に登場する「シンボリックリンク
」と「ハードリンク
」という概念。どちらもファイルやディレクトリへのリンク(参照)を作成するための仕組みですが、その構造や用途には根本的な違いがあります。初心者が混乱しやすいポイントの一つですが、システムの運用やプログラムの設計においてリンクの使い分けは非常に重要です。
本記事では、システムエンジニアやプログラマーを対象に、シンボリックリンクとハードリンクの仕組み、実際の使いどころ、注意点までを含めて、具体例や比較表を交えながら詳しく解説していきます。
シンボリックリンクはファイルのショートカット
シンボリックリンク(symbolic link、略してシンボリックリンクまたはソフトリンク)は、別のファイルやディレクトリへのパス名を参照する特殊なファイルです。Windowsの「ショートカット」に近いイメージで、元ファイルの場所をパスとして記録し、それをたどってアクセスします。
シンボリックリンクの特徴
- シンボリックリンクはリンク元とは別のファイル(パス)として存在
- 実体を参照せず、文字列のパス情報を保持する
- 元のファイルが削除または移動された場合、リンクが壊れる(broken link)
- 異なるファイルシステム間でも作成可能
- ディレクトリにもリンク可能(たとえば設定ファイル用ディレクトリのショートカット)
- リンク自身にパーミッションやタイムスタンプが存在する
シンボリックリンクの使用例
$ ln -s original.txt symlink.txt$ ls -l-rw-r--r-- 2 test-user test-user 14 Jun 1 06:28 original.txtlrwxrwxrwx 1 test-user test-user 12 Jun 1 06:35 symlink.txt -> original.txt
この出力から、symlink.txt
がoriginal.txt
を参照するシンボリックリンクであることがわかります。l
から始まるファイル種別がシンボリックリンクの印です。
ハードリンクは同一iノードのファイル参照
ハードリンクとは、あるファイルに対して、別の名前で参照できるエントリを作成する仕組みです。Linuxなどのファイルシステムでは、ファイルの実体は「iノード(inode)」と呼ばれるデータ構造で管理されており、ハードリンクはこのiノードを複数のファイル名から参照できるようにするものです。
ハードリンクの特徴
- 元ファイルとハードリンクは完全に同じiノードを参照しており、内容や属性も共通
- どちらか一方のファイル名を削除しても、もう一方は生きており、ファイル内容は維持される
- iノードの参照カウントがゼロになるまで、ファイルの中身は削除されない
- 同一のファイルシステム内でしか作成できない(異なるマウントポイント間では不可)
- 通常、ディレクトリへのハードリンクは制限されている(特権ユーザーでも原則禁止)
ハードリンクの使用例
$ echo "Hello, World!" > original.txt$ ln original.txt hardlink.txt$ ls -li131722 -rw-r--r-- 2 test-user test-user 14 Jun 1 06:28 hardlink.txt131722 -rw-r--r-- 2 test-user test-user 14 Jun 1 06:28 original.txt
この例では、original.txt
とhardlink.txt
の両方が同じiノード番号(131722)を持っており、同じファイル実体を指しています。
シンボリックリンク・ハードリンクの比較表
特徴 | ハードリンク | シンボリックリンク |
---|---|---|
参照対象 | iノード(実体) | パス名(文字列) |
ファイルシステムを越える | 不可 | 可能 |
ディレクトリへのリンク | 通常不可 | 可能 |
元ファイル削除時の挙動 | 実体は保持される | リンク切れ |
パーミッション | 実ファイルに依存 | リンクファイル自身に付与 |
サイズ | ファイルサイズと同じ | パスの長さ(バイト数) |
作成コマンド | ln | ln -s |
リンクの選定は用途や環境に応じて適切に行う必要があります。以下に代表的なシナリオを紹介します。
ハードリンクが向いているケース
- ログファイルや一時ファイルのバックアップ:同じ内容を複数の名前で保持したいとき
- ファイルを誤って削除してしまうことへの保険:iノードが残っていれば内容は復元可能
- 容量効率を重視したい場合:複製ではないため、ディスク使用量を増やさずに済む
シンボリックリンクが適しているケース
- 設定ファイルや共通スクリプトへのアクセスを統一したいとき:
/etc/myapp/config
などにリンクを貼る - 開発環境と本番環境で同じスクリプトを使い回す:リンク先を切り替えるだけで動作環境を変更できる
- 異なるパーティションにあるファイルを一元管理:マウントポイントをまたぐ構成に対応可能
lnコマンドの基本構文
リンクを作成する際に使用するのがln
コマンドです。構文は以下のとおりです。
ln [元ファイル] [リンク名]
ln file.txt file_hardlink.txt
ln -s [元ファイルまたはディレクトリ] [リンク名]
ln -s /path/to/config.conf config_link.conf
ln -s
の-s
オプションは「symbolic(象徴的な)」の意味で、これが付いていないとハードリンクが作成されます。
unlinkでリンクを削除する
リンクを削除するには、通常のrm
コマンドのほかに、unlink
コマンドも使用できます。unlink
は、リンク(ファイル名)を1つだけ削除するための単機能コマンドです。
unlink [リンク名]
unlink symlink.txt
unlink
はシンプルな動作をするため、スクリプト内などで意図しないファイル削除を避けたいときにも利用されます。
なお、リンク元がハードリンクである場合、削除しても実体がまだ他の名前から参照されていれば、ファイル自体は保持されます。iノードの参照数が0になった時点で、実体が削除されます。
シンボリックリンク・ハードリンク違いまとめ
-
参照対象の違い:
- ハードリンクは「iノード(実体)」を直接参照
- シンボリックリンクは「ファイルパス(文字列)」を参照
-
リンク先のファイルシステムに関する制限:
- ハードリンクは同一ファイルシステム内でのみ作成可能
- シンボリックリンクは異なるファイルシステムでも作成可能
-
ディレクトリへのリンク:
- ハードリンクは通常ディレクトリに対して作成不可(制限あり)
- シンボリックリンクはディレクトリにもリンク可能
-
元ファイル削除時の挙動:
- ハードリンク:他のリンクが存在すれば実体は削除されない
- シンボリックリンク:リンク切れ(broken link)となる
-
パーミッションの適用先:
- ハードリンク:実体ファイルに依存
- シンボリックリンク:リンクファイル自体にパーミッションが存在
-
リンクファイルのサイズ:
- ハードリンク:実体ファイルと同じ
- シンボリックリンク:リンク先パスの文字数(バイト数)分
-
作成方法:
- ハードリンク:
ln [元ファイル] [リンク名]
- シンボリックリンク:
ln -s [元ファイルまたはディレクトリ] [リンク名]
- ハードリンク:
シンボリックリンクとハードリンクは、いずれもファイルシステムにおける柔軟な参照方法を提供します。しかし、それぞれの動作原理や挙動は大きく異なるため、誤って使うと予期しない動作やトラブルの原因になりかねません。
適切なリンク種別を選ぶには、ファイルシステムの構成、対象のライフサイクル、更新頻度、参照関係の明瞭さなどを考慮する必要があります。
日々の業務やスクリプト開発、サーバー運用などにおいて、リンクの仕組みを正しく理解し、賢く使いこなすことで、より安全で効率的なシステム運用が実現できるでしょう。
Linuxユーザにお勧めの本
![]() |
新品価格
|

![]() |
ゼロからわかる
新品価格
|

![]() |
エンジニア1年生のための
新品価格
|

以上で本記事の解説を終わります。
よいITライフを!