Linux でファイルを扱っていると、「同じファイルを複数の場所から参照したい」「設定ファイルを共有したい」といった場面が出てきます。そんなときに使うのが ln コマンドです。ln は「リンク」を作成するコマンドで、ファイルの実体を無駄に増やすことなく、別名や別の場所からアクセスできるようにします。
この記事では、ln コマンドの基本的な使い方から、シンボリックリンクとハードリンクの違い、実践的なデプロイでの使い方、そしてつまずきやすいポイントまでを丁寧に解説します。
目次
リンクとは何か、なぜ使うのか
「リンク」とは、あるファイルに対して別の名前や別の場所からアクセスできるようにする仕組みです。Windows でいう「ショートカット」に近い考え方ですが、Linux のリンクにはより低レベルな仕組みが関わっています。
リンクを使うと、ファイルの実体(データ本体)を増やすことなく、複数の名前・複数のパスから同じファイルにアクセスできます。たとえば、共通の設定ファイルを複数のディレクトリから参照させたい場合や、アプリケーションのバージョンを current という名前のリンクで切り替えたい場合などに便利です。実体をコピーして増やすとファイルが分裂して管理が煩雑になりますが、リンクなら「実体は1つ、入り口は複数」という状態を保てます。
リンクには大きく分けて「シンボリックリンク」と「ハードリンク」の2種類があり、ln コマンドはどちらも作成できます。それぞれ性質が異なるので、順番に見ていきましょう。
ln コマンドの基本書式
ln コマンドの基本的な書式は次のとおりです。
ln [オプション] リンク元(ターゲット) リンク名
ここでもっとも大切なのが引数の順序です。先に書くのが「リンク元(ターゲット)」つまり実体のあるファイル、後に書くのが「これから作るリンクの名前」です。この順序は cp や mv といった「コピー元 → コピー先」の並びと同じ感覚で覚えると混乱しにくいでしょう。実体が先、新しく作る名前が後、と押さえておいてください。
なお、リンク名を省略してディレクトリだけを指定した場合は、そのディレクトリの中に、ターゲットと同じ名前でリンクが作られます。
シンボリックリンクを作る(ln -s)
シンボリックリンク(symbolic link、シムリンクとも呼ばれます)は、-s オプションを付けて作成します。シンボリックリンクは「別のパスを指し示す小さなファイル」で、Windows のショートカットに近いイメージです。アクセスするとリンクが指しているパスへとたどり着きます。
ln -s /var/www/app/config.yml config.yml
この例では、カレントディレクトリに config.yml という名前のシンボリックリンクが作られ、それが /var/www/app/config.yml という実体を指し示します。作成したリンクを ls -l で確認すると、次のように「リンク名 -> ターゲット」という形で表示されます。
$ ls -l
lrwxrwxrwx 1 user user 26 Jul 8 12:00 config.yml -> /var/www/app/config.yml
行頭の l がシンボリックリンクであることを示しています。シンボリックリンクはファイルだけでなくディレクトリにも張ることができ、この点はハードリンクにはない大きな利点です。
リンク切れと絶対パスの推奨
シンボリックリンクはあくまで「パスを指し示しているだけ」なので、リンク先の実体を削除したり移動したりすると、リンクは行き先を失って「リンク切れ(dangling link)」になります。リンク自体は残りますが、アクセスしようとするとエラーになります。
また、リンク作成時にターゲットを相対パスで指定すると、そのパスは「リンクが置かれている場所を基準」として解釈されます。そのため、リンクを別のディレクトリへ移動すると相対パスの基準がずれてリンク切れを起こすことがあります。こうした事故を避けるため、特に別ディレクトリから参照させる用途ではターゲットを絶対パスで指定するのが無難です。意図的に相対パスを使う場合は、リンクの位置とターゲットの位置関係が変わらないことを確認しておきましょう。
ハードリンクを作る(オプションなしの ln)
オプションを付けずに ln を実行すると、ハードリンクが作られます。ハードリンクは、シンボリックリンクとは仕組みがまったく異なります。
ln data.txt data-alias.txt
ハードリンクは、ファイルの実体(inode と呼ばれる、データ本体を管理する識別子)を直接指す「もう一つの名前」です。上の例では data.txt と data-alias.txt は同じ inode を共有しており、どちらも対等な「本物の名前」です。片方を編集すればもう片方にも反映されますし、どちらか一方を rm で削除しても、もう一方の名前が残っている限りデータは消えません。すべての名前が消えて初めて実体が解放されます。
一方で、ハードリンクにはいくつかの制約があります。まず、同じファイルシステム内でしか作れません。inode という仕組みはファイルシステムごとに独立しているため、別のディスクやパーティションをまたいでハードリンクを張ることはできません。また、ディレクトリに対してハードリンクを張ることは通常できません(これはファイルシステムの構造が壊れるのを防ぐための制限です)。
シンボリックリンクとハードリンクの違い
ここまでの内容を、両者の違いとして表に整理しておきます。
| 観点 | シンボリックリンク(ln -s) | ハードリンク(ln) |
|---|---|---|
| 指し示すもの | ターゲットのパス(文字列) | 実体(inode)そのもの |
| 別ファイルシステムをまたげるか | またげる | またげない |
| リンク切れ | ターゲットを消すと起きる | 起きない(実体を共有) |
| ディレクトリに張れるか | 張れる | 通常は張れない |
ざっくり言えば、「パスを指すのがシンボリックリンク」「実体を指すのがハードリンク」です。日常的に使う場面が多く、ディレクトリにも張れて柔軟なのはシンボリックリンクのほうなので、まずはこちらを覚えておくとよいでしょう。
実践例:デプロイでのリンク切り替え
シンボリックリンクが実際に役立つ典型例が、アプリケーションのデプロイです。リリースごとに releases/20260708 のような日付付きディレクトリを用意し、current というシンボリックリンクを最新リリースへ向けておくことで、リンクの張り替えだけで公開バージョンを瞬時に切り替えられます。
ここで問題になるのが、すでに current というリンクが存在する場合です。単に ln -s しようとすると「同名のファイルが存在する」というエラーになります。そこで -f(force、強制上書き)オプションを使い、既存のリンクを置き換えます。ディレクトリを指すシンボリックリンクを上書きする場合は、リンク先の中に入り込んでしまう挙動を避けるために -n(--no-dereference、リンクをたどらない)も併用するのが安全です。
ln -sfn /var/www/app/releases/20260708 /var/www/app/current
ここで使ったオプションの意味を整理しておきます。
| オプション | 意味 |
|---|---|
-s | シンボリックリンクを作成する |
-f | 同名のリンク先が既にあれば削除して上書きする |
-n | リンク名が既存のディレクトリへのシンボリックリンクのとき、それをたどらずに置き換える |
-sfn のようにオプションはまとめて書くことができます。この一行を実行するだけで current の向き先が新しいリリースに切り替わり、アプリケーションの参照先を安全に更新できます。
よくあるつまずきと対処
相対パスで指定したらリンクが切れた
前述のとおり、シンボリックリンクのターゲットを相対パスで指定すると、そのパスは「リンクが置かれている場所」を基準に解釈されます。リンクを別ディレクトリへ移動したり、そもそもカレントディレクトリと違う場所にリンクを作ったりすると、基準がずれてリンク切れになります。別の場所から参照させたいときは、ターゲットを絶対パスで指定しておくと安心です。
同名のファイルがあって作れない
作ろうとしているリンク名と同じ名前のファイルやリンクがすでに存在すると、ln はエラーで止まります。意図的に置き換えたい場合は -f オプションを付けて上書きします。ただし -f は既存のものを消してしまうので、消して困るファイルを指定していないか、実行前に名前をよく確認してください。
ディレクトリにハードリンクを張れない
ディレクトリに対してオプションなしの ln を実行すると、通常はエラーになります。ハードリンクはディレクトリには張れないためです。ディレクトリへのリンクが欲しい場合は、-s を付けてシンボリックリンクとして作成してください。同様に、別のディスクやパーティションをまたいでリンクを張りたいときも、ハードリンクではなくシンボリックリンクを使う必要があります。
まとめ
ln コマンドは、ファイルの実体を増やさずに別名や別の場所からアクセスできるリンクを作成するコマンドです。基本書式は ln [オプション] リンク元(ターゲット) リンク名 で、実体が先・作る名前が後という順序を押さえておくのが第一歩です。
-s を付ければパスを指し示すシンボリックリンク、付けなければ実体(inode)を共有するハードリンクになります。ディレクトリにも張れて別ファイルシステムもまたげる柔軟なシンボリックリンクが日常的には主役ですが、両者の違いを理解しておくと、デプロイでのバージョン切り替えやリンク切れのトラブル対応で確実に役立ちます。-f や -n といったオプションも組み合わせて、安全にリンクを活用してみてください。