ファイル操作 初級

シンボリックリンクとハードリンクの使い方

lnコマンドを使ったシンボリックリンクとハードリンクの仕組みと使い分けを学ぶ

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.txtreport_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