Linuxの設定ファイルを管理したり、コマンドのバージョンを切り替えたりする場面で、必ず登場するのがlnコマンドです。
この記事では、lnコマンドによるシンボリックリンク(ソフトリンク)の作成方法を中心に、ハードリンクとの違い、ls -lでの確認方法、リンク切れの対処法まで、実務で使う知識をまとめて解説します。
・ハードリンクは同じ inode を参照する実体の別名で、異なるファイルシステムやディレクトリには作れない
・ls -l でシンボリックリンクは l と -> で確認できる
・リンク切れ(参照先が消えた状態)は ls -la や find -L で検出できる
・PythonやNode.jsのバージョン切り替えなどコマンドの向き先変更にシンボリックリンクが活用される
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
シンボリックリンクとは何か?なぜ使うのか
シンボリックリンク(symlink)とは、別のファイルやディレクトリへの「ショートカット」のようなものです。Windows のショートカットに近い概念ですが、OSレベルで透過的に動作するため、アプリケーションからは通常のファイルと同じように扱えます。シンボリックリンクが活躍する場面は、主に以下の3つです。
・設定ファイルの一元管理:/etc 配下の設定ファイルを別の場所で管理し、シンボリックリンクで参照させる
・バージョンの切り替え:/usr/local/bin/python を python3.11 や python3.12 に向け替える
・共有ライブラリの管理:libssl.so → libssl.so.3.0.1 のように、バージョン番号付きファイルへリンクする
実際のサーバー運用では、シンボリックリンクを使わない日はないと言っても過言ではありません。
lnコマンドでシンボリックリンクを作成する
シンボリックリンクの作成には、lnコマンドに -s オプションを付けて実行します。1. 基本の書式
書式は以下のとおりです。# シンボリックリンクの作成 ln -s リンク先(実体ファイル) リンク名(作成するリンク)
2. ファイルへのシンボリックリンクを作成する
たとえば、/etc/nginx/sites-available/mysite.conf へのシンボリックリンクを sites-enabled ディレクトリに作成する場合は、次のように実行します。# Nginx のサイト設定を有効化する例 ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf
3. ディレクトリへのシンボリックリンクを作成する
ディレクトリに対しても、同じ -s オプションで作成できます。# /var/log/app を /home/admin/logs としてアクセスできるようにする ln -s /var/log/app /home/admin/logs
4. 既存のリンクを上書きする(-sfオプション)
すでにリンクが存在する場合、そのままlnを実行するとエラーになります。-f(force)オプションを付けると、既存のリンクを削除してから新しいリンクを作成してくれます。# 既存のシンボリックリンクを上書き ln -sf /usr/local/python3.12/bin/python3 /usr/local/bin/python3
ハードリンクを作成する(-sなし)
lnコマンドを -s オプションなしで実行すると、ハードリンクが作成されます。1. ハードリンクの基本
# ハードリンクの作成 ln original.txt hardlink.txt
2. ハードリンクの制約
ハードリンクには、シンボリックリンクにはない制約があります。・ディレクトリには作成できない:ファイルシステムの循環参照を防ぐため、一般ユーザーはディレクトリのハードリンクを作成できません
・パーティションをまたげない:ハードリンクは同一ファイルシステム内でしか作成できません。異なるパーティション間ではシンボリックリンクを使ってください
・リンクが切れない代わりに追跡しにくい:どのファイルがハードリンクの関係にあるかを確認するには、inode番号を調べる必要があります
シンボリックリンクとハードリンクの違い
2つのリンクの違いを表で整理しましょう。| 比較項目 | シンボリックリンク | ハードリンク |
|---|---|---|
| 作成コマンド | ln -s | ln |
| 仕組み | パス名を参照する | inode(実体)を共有する |
| 元ファイルを削除した場合 | リンク切れになる | データにアクセスできる |
| ディレクトリへのリンク | 可能 | 不可 |
| パーティションをまたぐリンク | 可能 | 不可 |
| ls -lでの表示 | l で始まり → で先を表示 | 通常のファイルと同じ |
ls -lでシンボリックリンクを確認する
シンボリックリンクの確認には ls -l コマンドを使います。# シンボリックリンクの確認 ls -l /usr/local/bin/python3 # 出力例 lrwxrwxrwx 1 root root 38 Jan 15 10:30 /usr/local/bin/python3 -> /usr/local/python3.12/bin/python3
・先頭の「l」:ファイルタイプがシンボリックリンクであることを示します。通常のファイルは「-」、ディレクトリは「d」です
・「->」の表示:リンク名の後ろに「->」とリンク先のパスが表示されます
・パーミッション「rwxrwxrwx」:シンボリックリンク自体のパーミッションは常に777です。アクセス制御はリンク先のファイルのパーミッションで行われます
ハードリンクの確認方法
ハードリンクは ls -l だけでは判別できません。ls -li でinode番号を表示して、同じ番号のファイルを探します。# inode番号を表示してハードリンクを確認 ls -li original.txt hardlink.txt # 出力例(inode番号が同じならハードリンク) 1234567 -rw-r--r-- 2 user user 100 Jan 15 10:30 original.txt 1234567 -rw-r--r-- 2 user user 100 Jan 15 10:30 hardlink.txt
実務で使えるシンボリックリンク活用Tips
1. コマンドのバージョン切り替え
複数バージョンのPythonやNode.jsをインストールしている場合、シンボリックリンクで使用するバージョンを切り替えられます。# Python 3.12 を python3 として使う ln -sf /usr/local/python3.12/bin/python3 /usr/local/bin/python3 # バージョンを確認 python3 --version
2. 設定ファイルの管理
Git で設定ファイルをバージョン管理し、実際の配置先にはシンボリックリンクを張る運用は、サーバー管理の定番パターンです。# Git管理下の設定ファイルをリンクで配置 ln -sf /home/admin/config-repo/nginx.conf /etc/nginx/nginx.conf ln -sf /home/admin/config-repo/my.cnf /etc/my.cnf
3. ログディレクトリへのショートカット
深い階層にあるログディレクトリへのアクセスを楽にするのも、よくある使い方です。# ログディレクトリへのショートカット ln -s /var/log/httpd /root/httpd-logs
トラブルシュート:リンク切れとエラー対処
「No such file or directory」- リンク切れの対処
シンボリックリンクのリンク先が削除されると、リンク切れ(dangling symlink)になります。ls -l で確認すると、リンク先のパスが表示されたままですが、アクセスしようとするとエラーになります。# リンク切れの確認 ls -l /path/to/broken-link # リンク切れを検出する(カレントディレクトリ以下) find . -type l ! -exec test -e {} \; -print
「Too many levels of symbolic links」の対処
このエラーは、シンボリックリンクが循環参照(AがBを指し、BがAを指す)を起こしている場合に発生します。# 循環参照の例(これをやってはいけない) ln -s /tmp/link_b /tmp/link_a ln -s /tmp/link_a /tmp/link_b # リンク先をたどって確認 readlink -f /tmp/link_a
シンボリックリンクの削除方法
シンボリックリンクの削除には rm または unlink を使います。どちらもリンクだけを削除し、リンク先の実体ファイルには影響しません。# rmで削除 rm /path/to/symlink # unlinkで削除 unlink /path/to/symlink
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| シンボリックリンクを作成する | ln -s リンク先 リンク名 |
| ハードリンクを作成する | ln リンク先 リンク名 |
| 既存リンクを上書きして作成する | ln -sf リンク先 リンク名 |
| シンボリックリンクを確認する | ls -l ファイル名 |
| inode番号でハードリンクを確認する | ls -li ファイル名 |
| リンクの最終的な実体を確認する | readlink -f リンク名 |
| リンク切れを検出する | find パス -type l ! -exec test -e {} \; -print |
| シンボリックリンクを削除する | rm リンク名 |
シンボリックリンクとハードリンクの違いを正確に説明できますか?
コマンドの使い方を一つひとつ覚えていくのは時間がかかります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:mkdirコマンドでディレクトリを作成する方法|-pの階層一括作成やパーミッション指定も
- 前のページへ:rmコマンドでファイルやディレクトリを削除する方法|-rfの危険性と安全な使い方
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドK-O・ファイル・ディレクトリ管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます