[Linux] ln シンボリックリンクとハードリンクの違いと作り方

[Linux] ln シンボリックリンクとハードリンクの違いと作り方

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

Linux(Unix)ではファイルシステム上のファイルやディレクトリのデータとその名前を結びつけるリンクがあり、ハードリンクとシンボリックリンクの2種類があります。

Linux では ln コマンド使用するとリンクを作成できます。ここではシンボリックリンクとハードリンクの違いをまとめたのち、ln コマンドの簡単な使い方をまとめます。

シンボリックリンク(ソフトリンク)

シンボリックリンク は Windows だとショートカット、Mac だとエイリアスのことです。本体であるファイルやディレクトリが位置する場所とは別に、その本体に対する別名のリンクを別の場所に作成するためにシンボリックリンクを使います。

コピーを作成するのではなく、あくまで本体ファイルやディレクトリへのショートカット、エイリアスを作成します。例えばある場所に配置されたファイルを、あたかも別の場所に存在するかのように扱うことができます。

シンボリックリンクを削除したとしても、本体のデータは削除されず、シンボリックリンクのみが削除されます。

ハードリンク

Linux では ln コマンドでハードリンクを作成できます。ハードリンクはファイルに対してのみ作成可能です。

Linux(Unix) だとすべてのファイルは、inode と呼ばれるファイルシステム上で一意のデータを参照します。ディスク上の実体のデータに対して一意な inode が存在し、それをファイル名でリンクされているイメージです。inode に対して必ず1つ以上の ハードリンク が存在します。

つまり作成されたファイルやディレクトリは1つの inode とハードリンクでつながります。

ハードリンクを別途作成する場合、1つの inode に対して複数のハードリンクで参照するファイルやディレクトリが存在するようになります。以下Wikipediaからの引用画像です。

inode は自身がリンクしているハードリンクの数を保持しており、これが0になると削除されます。

つまりハードリンクについては「どちらが本体のファイルか」というのはなく、異なるファイルが同じデータ実体を参照することになります。

ソフトリンクとハードリンク

シンボリックリンク(ソフトリンク)はその名前の通り、緩やかなリンクです。シンボリックリンクは別のファイルやディレクトリのパス、アクセス方法が複製されます。したがって元ファイルが移動したり削除されたりすればシンボリックリンクは無効になります。

逆にハードリンクはソフトリンクに比べより強力なリンクです。同じデータ実体への参照を複製します。したがってハードリンク作成元のファイルと同じような位置づけのものを複製します。元データが移動や削除されても、inode を参照しているためハードリンクへの影響はありません。

以下の画像のようなイメージです。

a.txta.hardlink は同じような立ち位置になります。

シンボリックリンク(a.softlink)は、あくまでファイルパスへのリンクであり、データ実体(inode)とは直接つながりません。ハードリンクは直接データ実体へのリンクとなります。

ln コマンド

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

ln -s [元パス] [シンボリック名] でシンボリックリンクを作成します。例えば /etc/ ディレクトリに対してのシンボリックリンクをカレントディレクトリに etc-softlink という名前で作成するには以下のようにします。

$ ln -s /etc/ etc-softlink
$ ls
etc-softlink

シンボリックリンクに cd コマンドで移動すると /etc/ の中身に移動したりいろいろできます。

もちろんファイルに対してシンボリックリンクも作成できます。

# 適当なファイルを作成する
$ echo hello > a.txt

# シンボリックリンクを作成
$ ln -s a.txt a.softlink

# inodeを確認する
$ ls -li
total 0
36873221949127343 lrwxrwxrwx 1 tm tm 5 Mar 19 14:04 a.softlink -> a.txt
48132221017532450 -rw-r--r-- 1 tm tm 6 Mar 19 14:04 a.txt

# 中身を見る
$ cat a.softlink
hello

ls コマンドで -i, --inode オプションを使用すると inode を確認できます。別の inode で作成されていることがわかります。

ファイルを削除したり削除すると

シンボリックリンクはあくまでリンク先のパスへのショートカットです。リンク先のパスが削除されたり、移動されるとシンボリックリンクが無効になります。

以下、ファイル名をリネームしてみるとどうなるか確認します。

# リネーム
$ mv a.txt b.txt

# inode 確認
$ ls -li
total 0
36873221949127343 lrwxrwxrwx 1 tm tm 5 Mar 19 14:04 a.softlink -> a.txt
48132221017532450 -rw-r--r-- 1 tm tm 6 Mar 19 14:04 b.txt

# シンボリックリンクの中身を見るとエラー
$ cat a.softlink
cat: a.softlink: No such file or directory

リネームしただけなので inode は変更されませんがファイル名が変更されているのでパスが異なります。したがってシンボリックリンクの参照するパスが存在しなくなりました。よってシンボリックリンクが不正になるため参照するとエラーになります。

ハードリンクを作成する

-s オプションを使用しないとハードリンクを作成できます。

# 適当なファイルを作成する
$ echo hello > a.txt

# ハードリンクを作成する
$ ln a.txt a.hardlink

# inode を確認する
$ ls -li
total 0
22517998136865209 -rw-r--r-- 2 tm tm 6 Mar 19 14:14 a.hardlink
22517998136865209 -rw-r--r-- 2 tm tm 6 Mar 19 14:14 a.txt

ハードリンクはリンクしたファイルと同じ inode を参照するリンクを作成します。同じ inode を参照するのでリンクする元にしたファイルを削除しても、データが生きたままになります。

# ファイルを削除
$ rm a.txt

# ハードリンクの内容を確認
$ cat a.hardlink
hello

以上。

参考URL

Linuxカテゴリの最新記事