Linuxコマンドln: シンボリックリンクとハードリンク(オプション4つ)

Linuxコマンドlnは、ファイルシステムの重要な機能の一つであるリンク(link)を作成するために使用されます。リンクはファイルシステム内で一つのファイルを指す別の名前を提供し、2種類あります:ハードリンク(hard link)とシンボリックリンク(symbolic link)。この記事では、lnコマンドの基本的な使い方とさまざまなオプションを見ていき、リンクを効率的に活用する方法を紹介します。

リンクとは何か?

ハードリンク(Hard Link)

ハードリンクは、一つのファイルを複数の名前でアクセスできる方式です。すべてのハードリンクは同じinode番号を共有し、ファイルのデータブロックを直接指します。ファイルの内容は一つですが、複数の場所で同じファイルのように見えます。

ハードリンクの特徴は次の通りです。

  • 同じファイルシステム内でのみ生成できます。
  • 元のファイルを削除しても、他のハードリンクを通じてファイルにアクセスできます。
  • ディレクトリにはハードリンクを使用できません。

シンボリックリンク(Symbolic Link)

シンボリックリンクは、ファイルの位置を指す特殊なファイルで、ショートカットに似ています。シンボリックリンクは元のファイルのパスを保存し、元のファイルが変更または削除されるとシンボリックリンクも影響を受けます。

シンボリックリンクの特徴は次の通りです。

  • 他のファイルシステムにも生成できます。
  • 元のファイルが削除されるとリンクは壊れたリンク(broken link)になります。
  • ディレクトリにもシンボリックリンクを使用できます。

Linuxコマンドlnの使い方

Linuxコマンドlnはリンクを作成するために使用されます。基本形式は次の通りです:

ln [options] original_file link_name
ShellScript

ハードリンクの生成

ハードリンクを生成するには、単にlnコマンドを使用します。このコマンドはoriginal_fileのハードリンクをhard_linkという名前で生成します。

ln original_file hard_link
ShellScript

ハードリンクを生成した後、ls -lコマンドを使用して該当リンクを確認すると、以下のように単純にファイルのように見えます。

図 1. Linuxコマンドln: ハードリンクの生成
図 1. Linuxコマンドln: ハードリンクの生成

次に、statコマンドを使ってhard_linkとoriginal_fileを確認してみましょう。両方のファイルのInode値がすべて同じ1311921であり、Links値が2なので、同じinode値を持つファイルが2つあることがわかります。つまり、同じinodeを指すファイルがもう一つ増えたことになります。

図 2. Linuxコマンドstatを利用してハードリンク確認
図 2. Linuxコマンドstatを利用してハードリンク確認

次にhard_linkを修正し、original_fileの内容を確認してみます。当然、両方のファイルは同じinode値を持っているので、同じ内容に変更されていることが確認できます。

図 3. ハードリンクファイルを更新時、元のファイルも同様に変更
図 3. ハードリンクファイルを更新時、元のファイルも同様に変更

original_fileを削除すると、hard_linkファイルはもうハードリンクの概念を持つオブジェクトではなく、完全な一つのファイルとして存在することになります。以下の図を見ると、inodeは上で確認したものと同じですが、Links値は1でハードリンクがないことがわかります。

図 4. Linuxコマンドstatを利用して残されたファイル確認
図 4. Linuxコマンドstatを利用して残されたファイル確認

シンボリックリンクの生成

シンボリックリンクを生成するには、-sオプションを使用します。このコマンドはoriginal_fileのシンボリックリンクをsymbolic_linkという名前で生成します。

ln -s original_file symbolic_link
ShellScript

シンボリックリンクを生成すると、lsコマンドを使用した際にシンボリックリンクの一番前にあるファイル属性はリンク(link)を意味するlで表示されます。そして、ターミナルの種類に応じてシンボリックリンクに異なる色を表示することもあります。また、”シンボリックリンク -> 元のファイル”の形式でどのシンボリックリンクがどのファイルを指しているかを明確に示します。

図 5. Linuxコマンドln: シンボリックリンクの生成
図 5. Linuxコマンドln: シンボリックリンクの生成

statコマンドを使って確認してみると、最初の行で該当シンボリックリンクがどのファイルを指しているかが示され、右上にはシンボリックリンクであることが明確に表示されます。

図 6. Linuxコマンドstatでシンボリックリンク確認
図 6. Linuxコマンドstatでシンボリックリンク確認

主要なオプション

-f (force)

-fオプションを利用すると、既存のファイルやリンクを強制的に上書きします。

ln -f original_file link_name
ShellScript

既にファイルが存在する場合、リンクを作成しようとすると「ln: failed to create hard/symbolic link ‘filename’: File exists」というメッセージが表示され、既存のファイルと同じ名前でハードリンクまたはシンボリックリンクを作成できないことがわかります。

図 7. Linuxコマンドln -fオプションで強制上書き
図 7. Linuxコマンドln -fオプションで強制上書き

-i (interactive)

-iオプションを使用すると、ファイルを上書きする際にユーザーに確認を求めます。

ln -i original_file link_name
ShellScript

既にファイルが存在する場合、-iオプションを使用すると「ln: replace ‘link_name’?」というメッセージが表示され、上書きしてリンクを作成するかどうかを尋ねます。

図 8. Linuxコマンドln -iオプションで上書き前に確認
図 8. Linuxコマンドln -iオプションで上書き前に確認

-v (verbose)

-vオプションはコマンド実行結果を詳細に出力します。

ln -sv original_file link_name
ShellScript

ハードリンクを生成する際には「=>」記号を使用してハードリンクが生成されたことを知らせ、シンボリックリンクを生成する際には「->」記号を使用してシンボリックリンクが生成されたことを確認できます。

図 9. Linuxコマンドln -vオプションでシンボリックリンクの種類確認可能
図 9. Linuxコマンドln -vオプションでシンボリックリンクの種類確認可能

有用な活用方法

ディレクトリリンク

シンボリックリンクはディレクトリにも使用できます。例えば、よく使用する設定ファイルやディレクトリをリンクで接続して簡単にアクセスできるようにします。

ln -s /path/to/original_directory /path/to/link_directory
ShellScript

バージョン管理

複数バージョンのファイルを管理する際にシンボリックリンクを使用すると便利です。例えば、ソフトウェア開発で特定バージョンのファイルをcurrentというシンボリックリンクで接続し、常に最新バージョンにアクセスできるようにします。

ln -s version1.8 current
ShellScript

システム設定ファイル

複数のシステム設定ファイルを管理する際にシンボリックリンクを活用すると便利です。例えば、~/.bashrcファイルを複数の環境で同じように保ちたい場合、シンボリックリンクを使用できます。

ln -s /path/to/shared_bashrc ~/.bashrc
ShellScript

注意事項

Linuxコマンドlnを使用する際に注意すべき点がいくつかあります。必ず理解しておいてください。

ハードリンクは同じファイルシステム内でのみ作動

ハードリンクは同じファイルシステム内でのみ生成できます。異なるファイルシステムのファイルにハードリンクを使用しようとすると、「ln: failed to create hard link ‘link_filename’ => ‘original_filename’: Invalid cross-device link」というメッセージが表示されます。したがって、異なるファイルシステムにリンクを生成するには、必ず-sオプションを使用してシンボリックリンクを作成する必要があります。

図 10. Linuxコマンドln: 異なるファイルシステムにハードリンク使用不可
図 10. Linuxコマンドln: 異なるファイルシステムにハードリンク使用不可

シンボリックリンクは元のファイルに依存

シンボリックリンクは元のファイルのパスを保存するため、元のファイルが移動または削除されるとリンクが壊れる場合があります。したがって、元のファイルを移動または削除した場合には、該当シンボリックリンクを適切に設定または削除する必要があります。

元のファイルoriginal_fileを削除してシンボリックリンクだけが残った場合、ls -lコマンドを使用すると以下のように赤い文字でリンクが壊れたことを強調して表示されます。

図 11. 壊れたシンボリックリンク: 元のファイルを削除した場合
図 11. 壊れたシンボリックリンク: 元のファイルを削除した場合

リンク使用時のパスに注意

シンボリックリンクを生成する際に相対パスと絶対パスを適切に使用する必要があります。相対パスを使用する場合、シンボリックリンクファイルの位置が変更されるとリンクが壊れることがあります。なぜなら、相対パスを使用する場合、シンボリックリンクの位置を基準に元のファイルにアクセスするためです。

したがって、シンボリックリンクを相対パスで設定した場合、シンボリックリンクのパスを変更すると元のファイルのパスも同時に変更する必要があります。逆に、シンボリックリンクが指している元のファイルを移動する場合にもシンボリックリンクを同時に変更する必要があります。あるいは、既存のシンボリックリンクを削除して新しいシンボリックリンクを生成するのも良い方法です。

以下の場合は、~/linux/lnディレクトリを基準にaディレクトリにsym_linkを使って相対パスでb/original_fileへのシンボリックリンクが存在する状態です。sym_linkファイルを~/linux/lnに移動した結果、相対パスの基準が変わるためシンボリックリンクが壊れたことが確認できます。

아래의 경우에는 ~/linux/ln 디렉터리 기준으로 a 디렉터리에 sym_link를 통해서 상대 경로를 이용해서 b/original_file에 대한 심볼릭 링크가 존재하는 상태입니다. sym_link 파일을 ~/linux/ln으로 이동한 결과 상대 경로의 기준이 달라짐으로 심볼릭 링크가 깨진 것을 확인할 수 있습니다.

図 12. 壊れたシンボリックリンク: 相対パスを使用してシンボリックリンクを移動した場合
図 12. 壊れたシンボリックリンク: 相対パスを使用してシンボリックリンクを移動した場合

パーミッション(権限)問題

リンクを生成する際にファイルシステムのパーミッションの問題でリンク生成が失敗することがあります。以下の場合はoriginal_fileのファイル所有者がrootである場合に発生する「ln: failed to create hard link ‘link_name’ => ‘original_file’: Operation not permitted」メッセージです。この場合、sudoを使用して管理者権限でリンクを生成できます。そして、sudoコマンドを使用してハードリンクを生成する場合、既存ファイルと同等の所有権を持つようになります。

図 13. パーミッション問題がある場合、sudoコマンドと一緒にlnコマンドを使用
図 13. パーミッション問題がある場合、sudoコマンドと一緒にlnコマンドを使用

まとめ

Linuxコマンドlnを活用すれば、ファイルとディレクトリを効率的に管理できます。ハードリンクとシンボリックリンクの違いを理解し、状況に応じて適切なリンクを使用すれば、システム管理がはるかに便利になります。

リンクを活用したファイル管理、バージョン管理、設定ファイル管理などを通じてLinux環境をさらに柔軟で効率的に使用できます。Linuxコマンドlnのさまざまなオプションを把握し、注意事項を心に留めてミスを防ぎましょう。

ハードリンクとシンボリックリンクを使用して、よりスマートなLinuxユーザーになりましょう。

リファレンス

関連ポスト

コメントする