Linuxで、長いパスに短い名前でアクセスしたいときや、同じファイルを別の場所から利用したいときに役立つのがlnコマンドです。
lnコマンドでは、次の2種類のリンクを作成できます。
- ハードリンク:同じファイルの実体に、別の名前を付ける
- シンボリックリンク:ファイルやディレクトリのパスを参照する特殊なファイルを作る
見た目は似ていますが、仕組みや制限は異なります。特に、lnだけで作成するとハードリンクになり、ln -sで作成するとシンボリックリンクになる点が重要です。
この記事では、初心者でも実際に試せるように、練習用ファイルの準備からリンクの作成、確認、変更、削除、よくあるエラーの対処まで順番に解説します。
lnコマンドとは
lnコマンドは、ファイルやディレクトリへのリンクを作成するLinuxコマンドです。「ln」は「link」に由来します。
基本書式は次のとおりです。
ln [オプション] リンク元 リンク名
ここでいう「リンク元」は参照したいファイルやディレクトリ、「リンク名」は新しく作成するリンクの名前です。
たとえば、original.txtのハードリンクをhardlink.txtという名前で作る場合は、次のように実行します。
ln original.txt hardlink.txt
シンボリックリンクを作る場合は、-sオプションを付けます。
ln -s original.txt symlink.txt
引数は「リンク元、リンク名」の順番です。逆に書くと、意図しない場所を参照したり、エラーになったりするため注意してください。
ハードリンクとシンボリックリンクの違い
どちらを使うべきか迷ったときは、まず次の違いを確認しましょう。
| 比較項目 | ハードリンク | シンボリックリンク |
|---|---|---|
| 作成コマンド | ln リンク元 リンク名 |
ln -s リンク元 リンク名 |
| 仕組み | 元の名前と同じinodeを参照する | リンク元のパスを記録する |
| 元の名前を削除した場合 | ほかのハードリンクから利用できる | リンク切れになる |
| ディレクトリへの作成 | 通常は作成できない | 作成できる |
| 別ファイルシステムへの作成 | 作成できない | 作成できる |
| リンク先の確認 | ls -liなどでinodeを比較する |
ls -lやreadlinkで確認する |
| 主な用途 | 同じファイルの実体に別名を付ける | 設定ファイルやディレクトリへの入口を作る |
普段のサーバー管理で「別の場所にショートカットのようなものを作りたい」という場合は、ディレクトリにも使えて参照先も確認しやすいシンボリックリンクがよく利用されます。
一方、同一ファイルシステム内で、元のファイル名を削除しても残る別名が必要な場合は、ハードリンクが選択肢になります。ただし、ハードリンクは独立したコピーではないため、バックアップの代わりにはなりません。
練習用のファイルとディレクトリを準備する
ここからは、実際にlnコマンドを操作してみましょう。ホームディレクトリに練習用の環境を作成します。
cd ~
mkdir -p ln-practice/data ln-practice/links
echo "Hello Linux" > ln-practice/data/original.txt
cd ln-practice
次のコマンドで、ファイルが作成されたことを確認します。
cat data/original.txt
次のように表示されれば準備完了です。
Hello Linux
ハードリンクを作成する方法
ハードリンクを作成するときは、-sを付けずにlnコマンドを実行します。
ln data/original.txt data/hardlink.txt
作成した2つの名前を確認します。
ls -li data/original.txt data/hardlink.txt
実行結果の例は次のとおりです。
123456 -rw-r--r-- 2 user user 12 Jul 14 10:00 data/hardlink.txt
123456 -rw-r--r-- 2 user user 12 Jul 14 10:00 data/original.txt
先頭に表示される数値がinode番号です。両方のinode番号が同じであれば、同じファイルの実体を参照しています。
パーミッションの後ろにある2はハードリンク数です。現在はoriginal.txtとhardlink.txtという2つの名前が同じinodeにつながっているため、リンク数が2になっています。
ハードリンクから内容を変更する
hardlink.txtへ文字列を追記してみましょう。
echo "Added from hard link" >> data/hardlink.txt
cat data/original.txt
実行結果は次のようになります。
Hello Linux
Added from hard link
ハードリンクは同じファイルの実体を参照するため、どちらの名前から内容を変更しても、もう一方から同じ内容を確認できます。
元のファイル名を削除しても内容は残る
ハードリンクでは、どれか1つの名前だけが特別な「本体」なのではありません。試しに、最初に作ったoriginal.txtを削除します。
rm data/original.txt
cat data/hardlink.txt
hardlink.txtが残っているため、ファイルの内容は引き続き利用できます。データが解放されるのは、原則として最後のハードリンクが削除され、どのプロセスからも使用されなくなったときです。
このあとのシンボリックリンクの練習でも使用するため、ファイル名を元に戻しておきます。
mv data/hardlink.txt data/original.txt
シンボリックリンクを作成する方法
シンボリックリンクを作成するときは、-sオプションを付けます。
ln -s ../data/original.txt links/original-link.txt
作成したリンクをls -lで確認します。
ls -l links/original-link.txt
実行結果の例は次のとおりです。
lrwxrwxrwx 1 user user 20 Jul 14 10:10 links/original-link.txt -> ../data/original.txt
行の先頭がlになっているため、シンボリックリンクだと判断できます。また、->の右側にはリンクに記録されている参照先が表示されます。
リンク経由でファイルを表示してみましょう。
cat links/original-link.txt
元のファイルと同じ内容が表示されれば、シンボリックリンクは正常に機能しています。
ディレクトリのシンボリックリンクを作成する方法
ハードリンクは通常、ディレクトリに対して作成できません。一方、シンボリックリンクならディレクトリも参照できます。
現在のdataディレクトリを指す、data-linkというリンクを作成します。
ln -s "$(pwd)/data" data-link
リンクを確認します。
ls -ld data-link
ls data-link/
data-linkからdataディレクトリの中身を確認できれば成功です。
ディレクトリのシンボリックリンクは、Webサイトの公開ディレクトリ、現在使用中のバージョンを示すcurrentディレクトリ、共有データへの入口などに利用できます。
相対パスと絶対パスのどちらを使うべきか
シンボリックリンクには、相対パスと絶対パスのどちらも指定できます。ただし、参照方法が異なります。
相対パスで作成する
先ほど作成したリンクでは、次の相対パスを指定しました。
ln -s ../data/original.txt links/original-link.txt
相対パスは、コマンドを実行した場所ではなく、作成したシンボリックリンクが置かれているディレクトリを基準に解決されます。
この例では、リンクがlinksディレクトリ内にあるため、links/../data/original.txtが実際の参照先になります。
リンクと参照先の相対的な位置関係を保ったままディレクトリ全体を移動する場合は、相対パスのリンクが壊れにくいという利点があります。
絶対パスで作成する
絶対パスを使う場合は、ルートディレクトリから始まる完全なパスを指定します。
ln -s "$(pwd)/data/original.txt" links/original-absolute.txt
絶対パスは参照先が明確で、リンクを別の場所へ移動しても同じパスを参照します。ただし、参照先のファイルやディレクトリを移動した場合や、別のサーバーでディレクトリ構成が変わった場合はリンク切れになります。
| 指定方法 | 向いている場面 | 注意点 |
|---|---|---|
| 相対パス | プロジェクト一式を移動・配布する場合 | リンクを置く場所を基準にパスを考える |
| 絶対パス | サーバー内の固定された場所を参照する場合 | 参照先の絶対パスが変わるとリンク切れになる |
リンク先とinodeを確認する方法
作成したリンクは、種類に応じて確認方法を使い分けます。
ls -lでシンボリックリンクを確認する
ls -l links/original-link.txt
リンク名 -> 参照先の形式で表示されます。
readlinkで記録されているパスを確認する
readlink links/original-link.txt
この例では次のように表示されます。
../data/original.txt
参照先を可能な範囲で絶対パスに展開して確認したい場合は、GNU/Linux環境で次のように実行できます。
readlink -f links/original-link.txt
リンク切れの場合、readlink -fでは何も表示されず、終了ステータスが0以外になることがあります。単に表示がないだけで正常だと判断せず、元のパスも確認してください。
ls -liまたはstatでinodeを確認する
ハードリンクを調べる場合は、inode番号とリンク数を確認します。
ls -li data/original.txt
stat data/original.txt
複数のファイル名でinode番号が一致していれば、それらは同じinodeへのハードリンクです。
lnコマンドの主なオプション
| オプション | 意味 | 使用例 |
|---|---|---|
-s--symbolic |
シンボリックリンクを作成する | ln -s target link |
-f--force |
既存のリンク名を削除して置き換える | ln -sf new-target link |
-i--interactive |
既存のリンク名を置き換える前に確認する | ln -si target link |
-n--no-dereference |
リンク名がディレクトリへのシンボリックリンクでも、そのリンク自体を扱う | ln -sfn new-dir current |
-T--no-target-directory |
最後の引数をリンク名として扱い、ディレクトリとして扱わない | ln -sfnT new-dir current |
-v--verbose |
作成したリンク名を表示する | ln -sv target link |
-b--backup |
置き換える既存ファイルをバックアップする | ln -sb target link |
-r--relative |
-sと組み合わせ、リンク位置からの相対パスを自動生成する |
ln -srv /path/to/file link-dir/ |
-Tや-rはGNU Coreutilsで利用できるオプションです。Linux以外のUnix系OSでは対応状況が異なる場合があるため、環境に応じてln --helpやman lnで確認してください。
シンボリックリンクの参照先を変更する方法
既存のシンボリックリンクを新しい参照先へ変更するときは、先に現在の状態を確認します。
ls -ld data-link
readlink data-link
確認後、GNU/Linuxでは次のように置き換えられます。
mkdir -p data-new
ln -sfnT "$(pwd)/data-new" data-link
各オプションの意味は次のとおりです。
-s:シンボリックリンクを作成する-f:既存のリンク名を置き換える-n:ディレクトリへのシンボリックリンクをたどらない-T:最後の引数をリンク名として扱う
-fは既存の宛先を置き換えるため、リンク名の指定を間違えると必要なファイルを失うおそれがあります。必ずls -ldとreadlinkで対象を確認してから実行してください。
操作に慣れていない場合は、既存リンクを削除してから作り直す方法のほうが動作を理解しやすくなります。
rm data-link
ln -s "$(pwd)/data-new" data-link
リンクを削除する方法
作成したリンクは、rmまたはunlinkで削除できます。
シンボリックリンクを削除する
rm links/original-link.txt
または、次のように実行します。
unlink links/original-absolute.txt
シンボリックリンクの名前を指定して削除すれば、通常は参照先のファイルまで削除されません。
ディレクトリへのシンボリックリンクを削除するときも、リンク名だけを指定します。
rm data-link
末尾に/を付けたり、リンク先と取り違えたりしないようにしてください。削除前にls -ld リンク名で、対象がシンボリックリンクであることを確認すると安全です。
ハードリンクを削除する
ハードリンクも通常のファイル名と同じように削除します。
rm data/hardlink.txt
ほかのハードリンクが残っていれば、同じファイルの実体は引き続き利用できます。最後のリンク名を削除すると、そのファイルへ通常の方法ではアクセスできなくなります。
lnコマンドでよくあるエラーと対処法
File existsと表示される
作成しようとしたリンク名と同じ名前のファイルやリンクが、すでに存在しています。
ln: failed to create symbolic link 'data-link': File exists
まず既存の対象を確認します。
ls -ld data-link
readlink data-link
不要だと確認できた場合は削除して作り直します。内容を確認せずに-fで上書きするのは避けましょう。
Invalid cross-device linkと表示される
異なるファイルシステムをまたいでハードリンクを作ろうとすると、次のようなエラーが発生します。
ln: failed to create hard link 'link': Invalid cross-device link
ハードリンクは同じファイルシステム内にしか作成できません。別のファイルシステムを参照したい場合は、-sを付けてシンボリックリンクを作成します。
hard link not allowed for directoryと表示される
多くのLinux環境では、ディレクトリへのハードリンク作成が禁止されています。
ln: directory/: hard link not allowed for directory
ディレクトリを参照したい場合は、シンボリックリンクを使用してください。
ln -s /path/to/directory directory-link
No such file or directoryと表示される
指定したパスが間違っているか、親ディレクトリが存在していない可能性があります。
ls -ld リンク元
ls -ld リンクを作成する親ディレクトリ
なお、シンボリックリンクは、現時点で存在しないパスを参照する状態でも作成できます。その場合、作成自体は成功しても、アクセス時にはリンク切れになります。
Too many levels of symbolic linksと表示される
シンボリックリンク同士が循環している可能性があります。たとえば、link-aがlink-bを参照し、link-bがlink-aを参照している状態です。
それぞれに記録されたパスを確認します。
readlink link-a
readlink link-b
循環しているリンクを削除し、正しい参照先で作り直してください。
lnコマンドを使うときの注意点
- リンク元とリンク名の順番を間違えない
- 相対パスはリンクを置いたディレクトリ基準で考える
- ハードリンクをバックアップとして扱わない
-fを使う前に既存のファイルやリンクを確認する- リンクを削除するときは参照先ではなくリンク名を指定する
- シンボリックリンクの表示上のパーミッションだけでアクセス可否を判断しない
シンボリックリンクがlrwxrwxrwxと表示されても、リンク経由でファイルを読み書きできるかどうかは、基本的に参照先ファイルや親ディレクトリの権限に左右されます。
また、ハードリンクは同じinodeを共有しますが、アプリケーションによっては保存時に元のファイルを直接更新せず、新しいファイルへ置き換えることがあります。その場合、置き換えた名前だけが新しいinodeを参照し、以前のハードリンクと内容が分かれることがあります。
lnコマンドの実用例
長い設定ファイルのパスに短い入口を作る
ln -s /etc/nginx/sites-available/example.conf ~/example-nginx.conf
長いパスを毎回入力せず、ホームディレクトリから設定ファイルへアクセスできます。
現在使用中のバージョンをcurrentで示す
ln -sfnT /var/www/releases/20260714 /var/www/current
アプリケーションの公開先をcurrentという共通名にしておけば、参照先の切り替えが分かりやすくなります。ただし、本番環境で実行する前に、所有者、権限、サービス設定を必ず確認してください。
共有ディレクトリへの入口をホームディレクトリに作る
ln -s /srv/shared ~/shared
~/sharedから共有ディレクトリへアクセスできるようになります。
よくある質問
lnとln -sの違いは何ですか?
lnは既定でハードリンクを作成し、ln -sはシンボリックリンクを作成します。ハードリンクは同じinodeを共有し、シンボリックリンクは参照先のパスを記録します。
初心者はどちらを使えばよいですか?
ファイルやディレクトリへのショートカットのような入口が必要なら、まずはシンボリックリンクを検討するとよいでしょう。ディレクトリにも作成でき、ls -lで参照先を確認しやすいためです。ハードリンクは、仕組みと制限を理解したうえで必要な場面に使用します。
シンボリックリンクはディレクトリにも作成できますか?
はい、作成できます。次の形式で実行します。
ln -s /path/to/directory link-name
リンク元を削除するとどうなりますか?
シンボリックリンクは参照先のパスが存在しなくなるため、リンク切れになります。ハードリンクは別の名前も同じinodeを参照しているため、ほかのハードリンクが残っていれば内容を利用できます。
シンボリックリンクがリンク切れしているか確認する方法はありますか?
1つのリンクを確認する場合は、次のようにtestコマンドを利用できます。
if [ -L links/sample ] && [ ! -e links/sample ]; then
echo "リンク切れです"
fi
-Lはシンボリックリンクかどうか、-eは参照先が存在するかどうかを確認します。
シンボリックリンクを作るとファイルがコピーされますか?
いいえ、コピーされません。シンボリックリンクには参照先のパスが記録されます。ファイルの独立した複製が必要な場合は、cpコマンドを使用します。
シンボリックリンクの名前は自由に決められますか?
はい、既存のファイル名やディレクトリ名と重複しない範囲で決められます。用途が分かる名前を付けると管理しやすくなります。
作成したリンクはどのコマンドで削除できますか?
rm リンク名またはunlink リンク名で削除できます。ディレクトリへのシンボリックリンクでも、参照先ではなくリンク自体の名前を指定してください。
まとめ
lnコマンドを使うと、Linux上でハードリンクとシンボリックリンクを作成できます。
ln リンク元 リンク名でハードリンクを作成するln -s リンク元 リンク名でシンボリックリンクを作成する- ハードリンクは同じinodeを共有する
- シンボリックリンクはリンク元のパスを記録する
- ディレクトリや別ファイルシステムを参照する場合はシンボリックリンクを使う
- 相対パスはリンクを置いたディレクトリを基準に解決される
ls -l、readlink、ls -liで状態を確認できる- 削除時は参照先ではなくリンク名を指定する
初めて使う場合は、まず練習用ディレクトリでln -sを試し、ls -lとreadlinkで参照先を確認してみましょう。リンクの仕組みを理解しておくと、設定ファイルの管理やアプリケーションの切り替え、サーバー上のディレクトリ整理が行いやすくなります。




コメント