Linuxでは「リンク」という仕組みを使って、1つのファイルに複数の名前を付けたり、別の場所から参照したりできます。 リンクにはハードリンクと**シンボリックリンク(ソフトリンク)**の2種類があり、それぞれ挙動が異なります。
ハードリンクとは
ハードリンクは、既存のファイルと同じ「inode(実体)」を指す別名です。 どちらの名前からアクセスしても全く同じデータを読み書きできます。
# ハードリンクを作成する(-s オプションなし)
ln original.txt hardlink.txt
# どちらも同じ内容が表示される
cat original.txt
cat hardlink.txt
ls -li でinode番号を確認すると、ハードリンクでは同じ番号が表示されます。
ls -li original.txt hardlink.txt
1234567 -rw-r--r-- 2 user user 42 Jul 6 10:00 hardlink.txt
1234567 -rw-r--r-- 2 user user 42 Jul 6 10:00 original.txt
2 の部分はリンク数(ハードリンクの数)を示しています。
ハードリンクの注意点
- 同じファイルシステム内でしか作成できない
- ディレクトリに対しては作成できない
- 元ファイルを削除しても、リンクが残っていればデータは消えない
# original.txt を削除してもデータは残る
rm original.txt
cat hardlink.txt # → 問題なく読める
シンボリックリンク(ソフトリンク)とは
シンボリックリンクは、別のファイルやディレクトリへのパスを記録したショートカットです。 Windowsの「ショートカット」に近いイメージです。
# シンボリックリンクを作成する(-s オプションを付ける)
ln -s /path/to/original.txt symlink.txt
# ディレクトリへのシンボリックリンクも作れる
ln -s /var/log/nginx nginx-logs
ls nginx-logs/
ls -l でシンボリックリンクを確認すると -> でリンク先が表示されます。
ls -l symlink.txt
lrwxrwxrwx 1 user user 20 Jul 6 10:00 symlink.txt -> /path/to/original.txt
先頭の l がシンボリックリンクであることを示しています。
シンボリックリンクの注意点
- リンク先が削除されると「壊れたリンク(dangling symlink)」になる
- 異なるファイルシステム間でも作成できる
- ディレクトリへのリンクも作れる
# 壊れたシンボリックリンクを確認する
ls -l broken-link.txt
# lrwxrwxrwx 1 user user 15 Jul 6 10:00 broken-link.txt -> /gone/file.txt
よく使うオプション
# すでに同名のリンクが存在する場合は上書き(-f)
ln -sf /new/target.txt existing-link.txt
# 相対パスでシンボリックリンクを作成する
cd /usr/local/bin
ln -s ../../opt/myapp/bin/myapp myapp
実践的な使用例
バージョン管理への応用
# 最新バージョンへのリンクを管理する
ln -s /opt/python-3.12/bin/python3 /usr/local/bin/python3
# バージョンアップ時はリンク先だけ変えればよい
ln -sf /opt/python-3.13/bin/python3 /usr/local/bin/python3
設定ファイルの共有
# ホームディレクトリの設定ファイルをバージョン管理リポジトリからリンク
ln -s ~/dotfiles/.bashrc ~/.bashrc
ln -s ~/dotfiles/.vimrc ~/.vimrc
リンクの実体を調べる
# シンボリックリンクのリンク先を表示する
readlink symlink.txt
# 絶対パスで表示する(-f)
readlink -f symlink.txt
ハードリンクとシンボリックリンクの比較
| 特徴 | ハードリンク | シンボリックリンク |
|---|---|---|
| 別ファイルシステム | ✗ 不可 | ✓ 可能 |
| ディレクトリへのリンク | ✗ 不可 | ✓ 可能 |
| 元ファイル削除後も有効 | ✓ 有効 | ✗ 壊れる |
ls -l の表示 | 通常ファイルと同じ | l で始まる |
練習問題
問題1
/tmp/practice/ ディレクトリを作成し、その中に data.txt(内容は任意)を作成してください。
次に data.txt へのシンボリックリンク link_to_data.txt を同じディレクトリに作成し、リンク経由でファイルの内容を表示してください。
問題2
問題1で作成した data.txt を削除した後、link_to_data.txt を参照しようとするとどうなりますか?
また、そのシンボリックリンクが壊れていることを ls コマンドで確認してください。
問題3
/tmp/practice/ に report_v1.txt を作成し、latest_report.txt というシンボリックリンクを作成してください。
次に report_v2.txt を作成し、latest_report.txt が report_v2.txt を指すように更新してください。
解答
問題1の解答
mkdir -p /tmp/practice
echo "Hello, Linux!" > /tmp/practice/data.txt
ln -s /tmp/practice/data.txt /tmp/practice/link_to_data.txt
cat /tmp/practice/link_to_data.txt
# → Hello, Linux!
問題2の解答
data.txt を削除すると、link_to_data.txt は壊れたシンボリックリンク(dangling symlink)になります。
cat しようとするとエラーが出ます。
rm /tmp/practice/data.txt
cat /tmp/practice/link_to_data.txt
# cat: /tmp/practice/link_to_data.txt: No such file or directory
# ls -l で確認すると赤く表示される(ターミナルによって異なる)
ls -l /tmp/practice/link_to_data.txt
# lrwxrwxrwx 1 user user 26 Jul 6 10:00 link_to_data.txt -> /tmp/practice/data.txt
問題3の解答
echo "Version 1" > /tmp/practice/report_v1.txt
ln -s /tmp/practice/report_v1.txt /tmp/practice/latest_report.txt
cat /tmp/practice/latest_report.txt
# → Version 1
echo "Version 2" > /tmp/practice/report_v2.txt
# -f で既存のリンクを上書き
ln -sf /tmp/practice/report_v2.txt /tmp/practice/latest_report.txt
cat /tmp/practice/latest_report.txt
# → Version 2