シンボリックリンクについて
皆さんは、シンボリックリンクついてはご存じですか。
私はインフラエンジニア歴2年ですが、今年の3月の案件を迎えるまで名前しか聞いたことがありませんでした。
最初の印象
最初シンボリックリンクと聞くと、何かWindowsでいうショートカットをLinuxのディレクトリに構成するものだと想像しておりました。
他のエンジニアの方から聞いたり、実際の実用例を見てみると似て非なるものだと認識しました。
まずは以下表にて、違いについて記載いたします。
項目 | シンボリックリンク(Linux) | ショートカット(Windows) |
---|---|---|
中身 | リンク先のパスだけを保持する | 特殊なファイル形式(.lnkファイル)で、リンク先情報やアイコン情報を持つ |
動き | 本当にリンク先ファイル/ディレクトリの代わりのように動作する | あくまで「ショートカットを開く」という動作になる(元ファイルとは別物) |
コマンドライン操作 | そのまま本体扱いできる(例えばcd シンボリックリンク ) |
ショートカットファイルとして見えるだけで、本体にはならない |
ファイル消失時の挙動 | 元ファイルが消えると「壊れたリンク」になる(エラー) | 元ファイルが消えると、ショートカットエラーになる(ダブルクリックでエラー) |
表だけではいまいちわかりが悪いので、例を用いて説明してみます。
例:コマンドラインでの使用
-
Linuxでは、たとえば /home/user/file.txt のシンボリックリンクを作ったら、
cat link_to_file.txt みたいにリンクを本体と同じように操作できる。 -
Windowsでは、file.txtのショートカットを作っても、コマンドラインでそのショートカットを開こうとすると単なる.lnkファイルとして扱われる。
感覚的に一度まとめてみる
ざっくりまとめてみると・・・
- Linuxのシンボリックリンクは「本当に本体のように動作するリンク」である。
- Windowsのショートカットは「本体にジャンプするためのファイル」である。
というイメージにするとよいかもしれない。
appendix
さらに深掘りしてみる
さらに深掘り:「ハードリンク」との違い
Linuxには「ハードリンク」という仕組みも存在する。
シンボリックリンクとハードリンクは以下のような違いがある。
項目 | シンボリックリンク | ハードリンク |
---|---|---|
指しているもの | ファイルへのパス(間接的に指す) | ファイルそのもの(データ領域そのもの) |
元ファイル削除時の挙動 | リンク切れになる(エラー) | ハードリンクは生きている(内容は残る) |
作成対象 | ファイル・ディレクトリどちらも作成可能(※ディレクトリは制限あり) | 基本的にファイルのみ(ディレクトリへのハードリンクは通常禁止) |
跨げる範囲 | ファイルシステムをまたげる(例:別パーティションでも可能) | 同一ファイルシステム内のみ |
イメージ図
[シンボリックリンク]
リンクファイル → 本体ファイルパス
[ハードリンク]
別名のファイル = 本体ファイル(データそのものを共有)
削除時の違い
操作 | シンボリックリンク | ハードリンク |
---|---|---|
リンクだけ削除 | リンクだけが消え、本体は無事である | リンクだけが消え、他にリンクがあればデータは無事である |
本体だけ削除 | リンクが壊れる(エラーになる) | 他にハードリンクが存在すればデータは残る |
まとめ
- Linuxのシンボリックリンクは「本体のように扱える柔軟なリンク」である。
- Windowsのショートカットは「ジャンプ用のファイル」である。
- Linuxにはさらに「ハードリンク」という、データ自体を共有する強力なリンクも存在する。
- 削除時やファイルシステムをまたぐときの挙動に明確な違いがある。
おまけ:シンボリックリンクを作るコマンド
Linuxでシンボリックリンクを作成するには、以下のコマンドを使用する。
ln -s [ターゲット] [リンク名]
例:
ln -s /home/user/file.txt link_to_file.txt
これで、link_to_file.txt
を操作すれば、まるで /home/user/file.txt
を操作しているかのように動作する。