
目次
Linuxにはリンクという機能があります。簡単に言うと異なる場所に格納した別々のファイル同士をリンクして、どちらのファイルも同じファイルであるように扱うことができる機能です。リンクには「シンボリックリンク」と「ハードリンク」があります。
シンボリックリンク
シンボリックリンクはリンク先のパス(ファイルやディレクトリに辿り着くための道順)が書かれたファイルを作成することで実現します。シンボリックリンクにアクセスすると、ファイルに書かれたパスにあるファイルやディレクトリにアクセスします。ちょうど、Windowsで使われるショートカットと同じような動作です。

シンボリックリンクはリンク先がファイルでもディレクトリでも作成できるのが特徴で、相手が異なるファイルシステムであってもリンクすることもできます。ただし、アクセス権は本体の設定に依存します。
そのため、シンボリックリンクにアクセスがあっても、リンク先のアクセスのアクセス権限が無ければ、アクセスすることは出来ません。

また、シンボリックリンク単なるアクセス先へのリンク情報ファイルなので、リンク先ファイル本体とは別ファイルです。ですから、シンボリックリンクを残したままリンク先ファイル本体を削除することができます。当然ですが、ファイル本体が削除されると、シンボリックリンクのリンク先が存在しなくなるため、アクセスするとエラーとなります。

ハードリンク
※※ハードリンクについて※※ ハードリンクは、シンボリックリンクと対になる機能です。 Linux Essentials 資格の範囲に含まれませんので覚える必要はありませんが、どのような機能かは知っておくとよいでしょう。一読して、知識として覚えておくことをお勧めします。
ハードリンクとは1つのファイルの実体を複数のファイル名で表すことができるリンクです。異なるファイル名で同じファイル本体を共有することができます。例えば、「file name A」と「file name B」をハードリンクでリンクすると、どちらにアクセスしても同じ本体を操作していることと同じことになります。
ファイルには実データの他に、作成者、グループ、作成日時、サイズ等の情報が含まれますが、Linuxはファイルにinodeと言う固有の番号を割り当ててこれらの情報を管理しています。

ハードリンクは名前の違う2つのファイルのinode番号を同じ番号に設定することで実現します。例えば、「ファイル名A」に、「ファイル名B」というハードリンクを作成すると、この2つのファイルのinode番号が同じになります。
つまり、ファイル名が違うだけで、両者の実体は同一です。そのため、「ファイル名A」を編集すると、ハードリンクされた「ファイル名B」も同じように編集され、逆に「file name B」を編集すると今度は「file name A」が同じように編集されます。ファイルとしては別々に存在しますが、「同じファイル」なのです。
ですから、ハードリンクしているファイルの片方を削除しても、もう片方の実態が残っていればデータが消えてしまうことはありません。ハードリンクは、よくバックアップの仕組みとして用いられます。

ハードリンクはinode番号をリンクすることで実現している機能です。そのため、inode番号が設定できるファイルシステムでなければならず、inodeで管理している他の情報も完全に一致している必要があります。
つまり、ハードリンクを利用するには同一のファイルシステムでなければならず、異なるファイルシステム間では実現できません。また、ハードリンクはファイルにしか設定できません。
リンクを作成するコマンド(ln)
ハードリンク、シンボリックリンクの作成はどちらの場合もlnコマンドを使います。
書式:
ln [オプション] リンク対象 リンク名 |
主なオプション:
-f | 既存のファイルのリンクを削除します |
-s | シンボリックリンクを作成する |
ハードリンク、シンボリックリンクのどちらを作成するかは、オプションの有無で決まります。シンボリックリンクを作成する場合は「-s」オプションを使います。「-s」オプションがなければハードリンクが作成されます。
<実習: lnコマンドの実行>
$ ln touch_file h-link
$ ls -il touch_file h-link
2703 -rw-rw-r--. 2 hoge hoge 0 5月 28 03:54 h-link
2703 -rw-rw-r--. 2 hoge hoge 0 5月 28 03:54 touch_file
「-i」オプションを使ってlsコマンドを実行するとinode番号(一番左の数字)を確認できます。3行目と4行目の行頭の数字に注目してください。この「2703」がinode番号です。どちらも同じであることがわかります。
ファイル名は「h-link」と「touch_file」で違いがあるものの、同じinode番号であるため、システム上は同じものとして認識されています。
今度はシンボリックリンクを作ってみましょう。
$ ln -s /var/log/dmesg s-link
$ ls -l s-link
lrwxrwxrwx. 1 lpic-user lpic-user 14 5月 31 04:14 s-link -> /var/log/dmesg
上記の例では「s-link」が「/var/log/dmesg」にリンクされていることがわかります。
これにより、「s-link」にアクセスするということは、「/var/log/dmesg」にアクセスすることと同意です。ただし、アクセスできるかどうかは、リンク先のパーミッションによります。つまり、「s-link」にアクセスできたとしても、「/var/log/dmesg」のアクセス権限がなければ、結果としてアクセスすることはできません。