ファイル操作の基本:シンボリックリンクとハードリンクの違いを理解する
リンクの基本:なぜファイルに「リンク」を作るのか?

Linuxシステムでは、1つのファイルに複数の名前を付けたり、別の場所から参照できるようにしたりする仕組みがあります。これがリンクです。たとえば「複数の場所から同じ設定ファイルを使いたい」「USBメモリ上のファイルを、ホームディレクトリから直接操作したい」など、リンクの使い道は意外と身近なところにあります。

リンクには主にシンボリックリンク(symlink)とハードリンクの2種類があり、それぞれ異なる特徴と用途を持ちます。これらのリンクを理解することは、ファイル管理を効率化し、ディスクスペースを節約し、時にはトラブルシューティングを行う上で非常に重要です。

この記事でわかること
  • シンボリックリンクとハードリンクの基本的な違い
  • それぞれのリンクを作成するコマンドと確認方法
  • どのような状況でどちらのリンクを使うべきか

シンボリックリンクとハードリンクの主な違い

まずは、それぞれのリンクの特性を以下の表で比較してみましょう。

項目 シンボリックリンク(ソフトリンク) ハードリンク
実体 元ファイルへのパスを示すファイル 元ファイルと同じiノード(実データ)を指す別のエントリ
ファイルの種類 L(lrwxrwxrwx)として表示される 通常のファイルと同じ(-rw-r--r--など)として表示される
ファイルシステムをまたがるリンク 可能 不可能(同じファイルシステム内でのみ作成可能)
ディレクトリへのリンク 可能 不可能(通常のユーザーは作成できない)
元ファイル削除時の挙動 リンクは残るが、参照先がないため壊れたリンクとなる リンク元のファイルが削除されても、他のハードリンクが存在すればデータは残る
ディスク使用量 リンクファイル自体はわずかなディスク容量を消費する(パス情報を保存するため) データの実体は1つだけなので、ハードリンクが増えてもディスク消費量は変わらない

シンボリックリンクとハードリンク:どちらを選ぶ?

一言でまとめるなら、シンボリックリンクは「柔軟な参照」向き、ハードリンクは「データの冗長性」や「消し忘れ対策」に有効です。


主要コマンドと操作手順
シンボリックリンクの作成と確認

シンボリックリンクは、Windowsのショートカットに似ています。元のファイルへの「参照」を作成します。

コマンド: ln -s [元ファイルまたはディレクトリ] [作成するリンク名]

例: /var/log/nginx/access.logへのシンボリックリンクをホームディレクトリに作成する場合

ln -s /var/log/nginx/access.log ~/nginx_access.log
ls -l ~/nginx_access.log

ls -lの出力例: lrwxrwxrwx 1 user user 28 Jul 17 02:00 /home/user/nginx_access.log -> /var/log/nginx/access.log ここで、先頭のlはシンボリックリンクを示し、->の後にリンク先が表示されます。

注意ポイント: シンボリックリンクを作成する際、[元ファイルまたはディレクトリ]相対パスで指定すると、リンク先のパスも相対的に解決されるため、リンクファイルを移動すると壊れる場合があります。特に指定がなければ絶対パスで指定するのが安全です。

ハードリンクの作成と確認

ハードリンクは、元のファイルと完全に同じファイルデータを指す、別名のファイルを作成します。データの実体は1つですが、複数の名前でアクセスできます。

コマンド: ln [元ファイル] [作成するリンク名]

例: document.txtへのハードリンクを同じディレクトリに作成する場合

echo "This is a document." > document.txt
ln document.txt hardlink_document.txt
ls -l document.txt hardlink_document.txt

ls -lの出力例: -rw-r--r-- 2 user user 20 Jul 17 02:00 document.txt -rw-r--r-- 2 user user 20 Jul 17 02:00 hardlink_document.txt 注目すべきは、ファイル名の右にある数字が「2」になっている点です。これは、このiノードを参照しているリンクの数(リンクカウント)を示しています。

注意ポイント: ハードリンクは、ディレクトリには作成できません(通常のユーザー権限では)。また、異なるファイルシステム(パーティション)をまたいで作成することもできません

iノード番号でリンクを確認する (statコマンド)

ls -lでもリンクカウントは確認できますが、より詳細なファイル情報、特にiノード番号を確認するにはstatコマンドが便利です。

stat document.txt hardlink_document.txt

上記コマンドを実行すると、以下のように出力されます(一部抜粋)。

  File: document.txt
  Size: 20              Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 1234567     Links: 2
Access: (0644/-rw-r--r--)  Uid: ( 1000/    user)   Gid: ( 1000/    user)

  File: hardlink_document.txt
  Size: 20              Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 1234567     Links: 2
Access: (0644/-rw-r--r--)  Uid: ( 1000/    user)   Gid: ( 1000/    user)

この例では、document.txthardlink_document.txtInode(iノード番号)が1234567と同じであることが分かります。これにより、これらが同じファイルの実体を指すハードリンクであることが明確に確認できます。


この状況で困ったらコレ!
  • 「ファイルシステムをまたいでショートカットを作りたい!」シンボリックリンクを使いましょう。例えば、データ保存用の別のパーティションにある大きなファイルを、ホームディレクトリから簡単に参照したい場合などに便利です。

  • 「オリジナルのファイルを誤って消してもデータを残したい!」ハードリンクが有効な場合があります。複数の場所から同じデータにアクセスしつつ、どれか一つの名前を消してもデータが失われないようにしたい場合に検討できます。ただし、あくまで「同じファイルの実体」を指しているため、片方を編集するともう片方も編集されます。

  • 「古い設定ファイルをバックアップとして残したいけど、新しいファイルも同じ名前で使いたい」 → これはリンクの用途とは異なりますが、元のファイルをリネームし、新しいファイルを作成するのが一般的です。例えば、mv original_file original_file.bak のようにします。


よくある疑問
Q.
シンボリックリンクの参照先がなくなったら、どうやって探せばいいの?
A.
ls -lfind -Lコマンドで壊れたリンクを検出できます。例えば、ls -lで出力されたリンクのパスが赤色などで表示されたり、find . -xtype l で「壊れたシンボリックリンク」を一覧表示できます。
※ターミナルによっては壊れたリンクの表示色が変わらないこともあります。その場合はls -l->の先が実際に存在するかls [リンク名]file [リンク名]コマンドで個別に確認しましょう。

まとめ

シンボリックリンクとハードリンクは、一見似ていますが、その実体と挙動には大きな違いがあります。シンボリックリンクは柔軟な参照を提供し、ハードリンクはデータの耐久性と共有を実現します。これらの特性を理解することで、より堅牢で効率的なファイル管理が可能になります。

この記事がシンボリックリンクとハードリンクについて理解を深める一助となれば幸いです。
ご覧いただきありがとうございました。

私たちは、お客さまが私たちのウェブサイトをどのように使用するのかを理解し、お客さまの体験を改善するために Cookie を使用しています。 閲覧を続けると Cookie の使用に同意したことになります。
拒否した場合、このウェブサイトにアクセスしてもお客さまの情報は追跡されません。 情報を追跡しない設定を記憶するために、ウェブブラウザで 1 つだけ Cookie が使用されます。