このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Linux】シンボリックリンクの作成と削除

シンボリックリンクとは

シンボリックリンクは、別のファイルやディレクトリへの参照を持つ特別なタイプのファイルです。

 簡単に例えると、シンボリックリンクはWindowsのショートカットのようなものです。シンボリックリンク自体には実データはなく、参照先のパス情報だけを格納しています。そのため、リンクを開くと、自動的に参照先のファイルやディレクトリにアクセスします。

 シンボリックリンク自体は、実体として存在しますが、中身は参照先のパスを格納しているだけです。言い換えると、シンボリックリンクは指定された場所へのポインタのようなもので、実際のデータは持っていません。

 例えば、ファイル「original.txt」に対してシンボリックリンク「link.txt」を作成すると、「link.txt」を開くと自動的に「original.txt」の内容が表示されます。

ls -li コマンドの出力内容について

 「ls -li」コマンドは、ディレクトリ内のファイルやディレクトリの詳細情報をリスト表示するLinuxのコマンドです。このコマンドは各ファイルの iノード番号と共に詳細を表示します。シンボリックリンクに関する情報も表示され、そのリンク先を確認することができます。

ls -li

ls -li コマンドの出力例

以下は、ls -li コマンドの出力例です。

1234567 lrwxrwxrwx 1 user group 12 May 14 12:34 link.txt -> original.txt

この出力の各部分は次のように解釈されます。

項目説明出力例
iノード番号ファイルシステム内でのファイルの一意の識別子。1234567
ファイルのパーミッションファイルのアクセス権。シンボリックリンクの場合、先頭が l になる。lrwxrwxrwx
リンクの数シンボリックリンクの場合は常に1。1
所有者ファイルの所有者の名前。user
所有グループファイルの所有グループの名前。group
サイズリンクファイルのサイズ(バイト単位)。ここではシンボリックリンクのパスの長さ。12
最終更新日時ファイルの最終更新日時。May 14 12:34
シンボリックリンクの名前シンボリックリンクのファイル名。link.txt
シンボリックリンクの参照先パスシンボリックリンクが指している参照先のパス。->で示される。-> original.txt
ls -li コマンドの出力例

link.txt -> original.txt

 この例では、「link.txt」というシンボリックリンクが「original.txt」を指していることがわかります。

シンボリックリンクファイルの実体

 シンボリックリンクファイルの実体は、ファイル名の横に「->」で示されたパスです。この例では、「link.txt」というシンボリックリンクが 「original.txt」を指しています。

ファイルサイズとリンク先パスの文字数

シンボリックリンクのサイズは、リンク先のパスの文字数と一致します。

 シンボリックリンクのファイルサイズは、リンク先パスの文字数と一致します。「original.txt」 の文字数は12文字であり、「link.txt」 のファイルサイズも12バイトです。これは、シンボリックリンクが実際のデータを保持せず、参照先のパスのみを保持しているためです。

シンボリックリンクを確認するコマンド

【構文】
ls -li

 シンボリックリンクは、他のファイルやディレクトリへの参照を持つ特別なファイルであり、「ls -li」コマンドを使用するとそのリンク先と iノード番号を含む詳細情報を確認できます。シンボリックリンクを活用することで、システム内のファイルやディレクトリをより柔軟に管理することが可能です。

シンボリックリンクを作成するコマンド

 シンボリックリンクを作成するには、「ln」コマンドを使用し、「-s」オプションを指定します。シンボリックリンクを作成するためのコマンドの形式は以下の通りです。

【構文】
ln -s [参照先のファイルパス] [作成するリンクファイル名]

ln -s [参照先のファイルパス] [作成するリンクファイル名]

 例えば、「/home/user/original.txt」に対してシンボリックリンク「/home/user/link.txt」を作成する場合は次のようにします。

ln -s /home/user/original.txt /home/user/link.txt

 このコマンドを実行すると、「/home/user/link.txt」が「/home/user/original.txt」を指すシンボリックリンクとして作成されます。

シンボリックリンクを削除するコマンド

 シンボリックリンクを削除するには、通常のファイル削除コマンド「rm」を使用します。シンボリックリンクを削除するためのコマンドの形式は以下の通りです。

rm [シンボリックリンクの名前]

例えば、「/home/user/link.txt」というシンボリックリンクを削除する場合は次のようにします。

rm /home/user/link.txt

 このコマンドを実行すると、シンボリックリンク「/home/user/link.txt」が削除されます。削除されるのはリンクファイルのみであり、参照先のファイルやディレクトリには影響を与えません。

ハードリンク数について

 リンクカウントであるハードリンク数は、iノードが参照されている回数を示します。iノードはファイルシステム内のファイルの情報を保持しているデータ構造で、ハードリンクを作成することで複数のファイル名が同じ iノードを参照するようになります。

 シンボリックリンクを作成した場合、リンクカウントは増加しません。あくまで、ハードリンク数は、ハードリンクの数を示すものです。これは、シンボリックリンク自体が新しい iノードを持つため、リンク数が増加しないためです。

シンボリックリンクの参照先ファイルを削除した場合

 シンボリックリンクの参照先ファイルが削除された場合、シンボリックリンク自体は残りますが、そのリンクは「壊れたリンク」になります。「壊れたリンク」を開こうとすると、参照先のファイルが存在しないためエラーが発生します。

【削除例】
# シンボリックリンク作成
ln -s /home/user/original.txt /home/user/link.txt

# 参照先ファイル削除
rm /home/user/original.txt

 この場合、「/home/user/link.txt」は壊れたリンクになります。「ls -l」コマンドで確認すると、リンク先が存在しないことがわかります。

ls -l /home/user/link.txt
【出力例】
lrwxrwxrwx 1 user group 17 May 14 12:34 /home/user/link.txt -> /home/user/original.txt

 壊れたリンクを削除するには、通常のファイルを削除するコマンドである「rm」コマンドを使用します。

rm /home/user/link.txt

これにより、壊れたシンボリックリンクが削除されます。

シンボリックリンクの作成と削除コマンドの使用例

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

まず、「file」という名前のテキストファイルを作成します。

・「echo "Hello World" > file」コマンドを実行します。

user01@ubuntu-vm:~$ echo "Hello World" > file

fileファイルをもとに、symlinkという名前のハードリンクを作成します。

シンボリックリンクを作成するには、「-s」オプションをつけて「ln」コマンドを実行します。

・「ln -s file symlink」コマンドを実行します。

user01@ubuntu-vm:~$ ln -s file symlin

fileファイルとsymlinkファイルの属性情報と iノード番号を確認します。

・「ls -li」コマンドを実行します。

user01@ubuntu-vm:~$ ls -li
合計 40
1311210 -rw-rw-r-- 1 user01 user01   12  5月 15 22:48 file
1310731 drwx------ 4 user01 user01 4096  5月  5 14:52 snap
1311339 lrwxrwxrwx 1 user01 user01    4  5月 15 22:55 symlink -> file
1310781 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ダウンロード
1310782 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 テンプレート
1310780 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 デスクトップ
1310784 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ドキュメント
1310787 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ビデオ
1310786 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ピクチャ
1310785 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 ミュージック
1310783 drwxr-xr-x 2 user01 user01 4096  1月  1 10:51 公開

下図は、fileファイルとsymlinkファイルの関係を図にまとめたものです。

5行目の出力に注目します。

1311339 lrwxrwxrwx 1 user01 user01 4 5月 15 22:55 symlink -> file

 iノートの番号が「1311339」となっており、参照先(リンク先)の iノード番号「1311210」とは異なります。

シンボリックリンクファイルの実体

 シンボリックリンクファイルの実体は、ファイル名の横に「->」で示されたパスです。この例では、「symlink」というシンボリックリンクが 「file」を指しています。

ファイルサイズとリンク先パスの文字数

シンボリックリンクのサイズは、リンク先のパスの文字数と一致します。

 シンボリックリンクのファイルサイズは、リンク先パスの文字数と一致します。「file」 の文字数は4文字であり、「symlink」 のファイルサイズも4バイトです。これは、シンボリックリンクが実際のデータを保持せず、参照先のパスのみを保持しているためです。

ハードリンク数(リンクカウント数)

5行目、7行目の出力に注目します。

1311210 -rw-rw-r-- 1 user01 user01 12 5月 15 22:48 file
1311339 lrwxrwxrwx 1 user01 user01 4 5月 15 22:55 symlink -> file


 リンク元のファイル「file」とシンボリックリンク「symlink」のハードリンク数(リンクカウント)が1となっています。ハードリンクを作成した場合は、ハードリンクを作成する度に、ハードリンク数が増えていきましたが、シンボリックリンクの場合は、ファイル名、iノード、実態が各々あり、1つのファイルとして独立していることが分ります。

参照先(リンク先)ファイルの削除

参照先(リンク先)ファイルを削除します。

・「rm file」コマンドを実行します。

user01@ubuntu-vm:~$ rm file

 シンボリックリンクの参照先ファイルが削除された場合、シンボリックリンク自体は残りますが、そのリンクは「壊れたリンク」になります。「壊れたリンク」を開こうとすると、参照先のファイルが存在しないためエラーが発生します。

参照先のファイルを削除するとパスをたどれなくなり、実体にアクセスできなくなる。

・「cat symlink」コマンドを実行します。

user01@ubuntu-vm:~$ cat symlink 
cat: symlink: そのようなファイルやディレクトリはありません

この状況を図にまとめたものが下図となります。

シンボリックリンクの削除

作成したシンボリックリンクを削除します。

・「rm symlink」コマンドを実行します。

user01@ubuntu-vm:~$ rm symlink
user01@ubuntu-vm:~$ ls
snap          テンプレート  ドキュメント  ピクチャ      公開
ダウンロード  デスクトップ  ビデオ        ミュージック

まとめ

 異なるファイルシステムへシンボリックリンクを作成できるため、ハードリンクのような制限がありません。ディレクトリのシンボリックリンクも作成することができます。

 シンボリックリンクは、ハードリンクと比べて柔軟性が高く、異なるファイルシステム間やディレクトリに対してもリンクを作成することができます。これにより、システムの管理や構成が容易になり、ユーザーやアプリケーションにとって便利なアクセス手段を提供します。