シンボリックリンクとハードリンクの違い
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.txt
と a.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
以上。
コメントを書く