【Linux】lnコマンドでハードリンク・シンボリックリンクを作成する

目次

概要

Linuxファイルシステムにおいて、ファイルやディレクトリへの「リンク」を作成するコマンドです。

Windowsの「ショートカット」に相当する「シンボリックリンク」と、1つのファイル実体に複数の名前(アクセス経路)を持たせる「ハードリンク」の2種類を作成できます。

ログファイルの参照場所を集約したり、アプリケーションのバージョン管理で「最新版(current)」へのパスを切り替えたりする際に頻繁に使用されます。

仕様(引数・オプション)

構文

ln [オプション] 対象ファイル リンク名
ln [オプション] 対象ファイル ディレクトリ名

主な引数・オプション

オプション説明
-sシンボリックリンクを作成します(symbolic)。通常はこれを最もよく使います。
-f同名のリンクが存在する場合、強制的に上書きして作成します(force)。
-i同名のリンクが存在する場合、上書きするかどうかを確認します(interactive)。
-L対象がシンボリックリンクの場合、その参照先の実体へのハードリンクを作成します。
--backupリンク作成時に同名ファイルがある場合、既存ファイルをバックアップして退避させます。
-S <接尾辞>バックアップファイルに付ける接尾辞を指定します(デフォルトは ~)。

基本の使い方

オプションを何も指定しない場合、「ハードリンク」が作成されます。

ハードリンクは元のファイルと全く同じ「inode(データの実体)」を指すため、どちらか一方を変更するともう一方も変更され、一方を削除してもデータ自体は残ります。

コマンド

# target_data.csv のハードリンク hardlink_data.csv を作成
ln target_data.csv hardlink_data.csv

実行結果(確認)

ls -li コマンドで確認すると、inode番号(行頭の数字)が一致していることがわかります。通常のコピー(cp)とは異なります。

# -i オプションでinode番号を表示して比較
ls -li
1234567 -rw-r--r-- 2 user user 1024 Jan 18 10:00 hardlink_data.csv
1234567 -rw-r--r-- 2 user user 1024 Jan 18 10:00 target_data.csv
9876543 -rw-r--r-- 1 user user 1024 Jan 18 10:05 copied_data.csv

hardlink_data.csvtarget_data.csv は同じinode 1234567 を指しています。

実践コマンド

シンボリックリンクを作成する

最も一般的な使い方です。別の場所にあるファイルやディレクトリへの参照(ショートカット)を作成します。ディレクトリに対してリンクを貼る場合は必ずこのオプションが必要です。

# /var/log/nginx/access.log へのシンボリックリンクをカレントディレクトリに作成
ln -s /var/log/nginx/access.log ./access_log_symlink

# 確認(lオプションで矢印が表示されます)
ls -l access_log_symlink
lrwxrwxrwx 1 user user 25 Jan 18 10:10 access_log_symlink -> /var/log/nginx/access.log

既存のファイルを上書きする前に確認する

リンクを作成しようとした場所にすでに同名のファイルがある場合、誤って上書きしないように確認メッセージを表示させます。

# 既存の config.conf に対して上書き確認を行う
ln -i new_config.conf config.conf
ln: replace 'config.conf'? y

バックアップを取りながらリンクを更新する

新しい設定ファイルなどを配置する際、既存のファイルを削除せずに、自動的に名前を変えてバックアップとして残します。

# 既存の app_settings.json を app_settings.json.bak にリネームして、新しいリンクを作成
ln -s --backup -S .bak new_settings.json app_settings.json
(出力なし。lsコマンドで確認すると app_settings.json.bak が生成されています)

カスタムポイント

  • ディレクトリへのリンク: ディレクトリへのハードリンク作成はシステム整合性の観点から通常禁止されているため、ディレクトリのリンクを作る際は必ず -s を使用します。
  • リンク名省略: ln -s /path/to/file のようにリンク名を省略すると、カレントディレクトリに同名のリンクが作成されます。
  • 強制更新: デプロイメントスクリプトなどで、既存のリンクを強制的に張り替えたい場合は ln -sf (強制上書き)が多用されます。

注意点

  1. シンボリックリンクの相対パス:ln -s ../target.txt link.txt のように相対パスでリンクを作る際、「リンクファイルが置かれる場所」を起点とした相対パスを指定する必要があります。コマンドを実行しているカレントディレクトリ起点ではないため、混乱を防ぐために絶対パス(/var/www/…)を使用する方が安全です。
  2. ハードリンクの制限:ハードリンクは「異なるパーティション(ファイルシステム)」を跨いで作成することはできません。この場合もシンボリックリンクを使用してください。
  3. 元ファイルの削除:シンボリックリンクは元ファイルが削除されると「リンク切れ(壊れたリンク)」になります。ハードリンクは元ファイル(という名前)を削除しても、データの実体はハードリンクが残っている限り消えません。

応用

アプリケーションのバージョン切り替え(デプロイ)

Webアプリケーションのデプロイ運用でよく使われる手法です。実体としてバージョンごとのディレクトリを用意し、current というシンボリックリンクを貼り替えることで、瞬時に公開バージョンを切り替えます。

# バージョン2.0のディレクトリへ current リンクを強制的に張り替える
# -n (no-dereference) はリンク先がディレクトリの場合に重要です
ln -sfn /opt/app/v2.0 /opt/app/current
(出力なし。/opt/app/current へのアクセスは v2.0 に繋がるようになる)

まとめ

lnコマンドは、Linuxサーバー管理において「パスの利便性」を向上させるための重要なツールです。特にシンボリックリンク(-s)は、深い階層にあるログファイルを手元で確認できるようにしたり、ディスク容量が足りないディレクトリを別のパーティションに逃がしてリンクで繋いだりといった場面で日常的に活用されます。ハードリンクとシンボリックリンクの特性の違い(実体の参照か、場所の参照か)を正しく理解して使い分けることが重要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次