2013-07-28

【Linux】ハードリンクとシンボリックリンク

リンク機能についておさらいをしたのでまとめておく

リンク機能とは

ファイルやディレクトリをコピーせずに、別のファイルまたはディレクトリのように扱うことができる機能のこと

2種類のリンク

リンクにはハードリンクとシンボリックリンクの2つがある。

1.ハードリンク

オリジナルファイルと新規ファイルは、同じファイル実体を指す。 オリジナルファイルも新規ファイルもファイル格納情報を各々で管理する。

2013-07-28-01.png
2013-07-28-01.png

2.シンボリックリンク

新規ファイルは、オリジナルファイル名を参照したファイル実体を指す。 オリジナルファイル名に依存した別名という関係になる。

2013-07-28-02.png
2013-07-28-02.png

リンクの貼り方

1.ハードリンクの場合

ln [既存のパス名] [別名となるパス名]

(ex) hoge.txtに対してfuga.txtというファイル名でハードリンクを張る
ln hoge.txt fuga.txt

2.シンボリックリンクの場合

ln -s [既存のパス名] [別名となるパス名]

(ex) hoge.txtに対してfuga.txtというファイル名でシンボリックリンクを張る
ln -s hoge.txt fuga.txt

オリジナルファイル削除時の動作

1.ハードリンクの場合

オリジナルファイルを削除しても、新規ファイルは有効。

2013-07-28-03.png
2013-07-28-03.png

2.シンボリックリンクの場合

オリジナルファイルを削除すると、新規ファイルは開けなくなる。 この状態のファイルにアクセスすると「No such file or directory」とエラーが返される。

2013-07-28-04.png
2013-07-28-04.png

※ ここで重要なのはUNIX, Linuxにおけるファイル削除の仕組み。ファイルの実体ごと削除するイメージだとここが理解できない。ファイルやディレクトリへの登録情報を削除するイメージを持つことができればここの動作が理解できる。

オリジナルファイル削除後に、同名のファイルを復活させた時の動作

1.ハードリンクの場合

新規ファイルは、オリジナルファイルの変化に影響を受けない。

$ echo "file1" > file1.txt
$ ln file1.txt file1_h.txt  // ハードリンクを貼ったfile_h.txtを作成
$ cat file1.txt  // file1.txtの中身
file1
$ cat file1_h.txt  // file1_h.txtの中身(file1.txtと同じ)
file1
$ rm file1.txt // file1.txtの削除
$ cat file1_h.txt
file1
$ echo "file1 revive" > file1.txt  // file1.txtの新規作成
$ cat file1.txt  // file1.txtの中身
file1 revive
$ cat file1_h.txt  // file1_h.txtの中身(新しく作られたfile1.txtとは異なる。影響を受けない)
file1

2.シンボリックリンクの場合

ファイル名に依存しているため、オリジナルファイルと同名の新しいファイルの変更に追従する。

$ echo "file1" > file1.txt
$ ln -s file1.txt file1_s.txt
$ cat file1.txt // file1.txtの中身
file1
$ cat file1_s.txt // file1_s.txtの中身(file1.txtと同じ)
file1
$ rm file1.txt // file1.txtの削除
$ cat file1_s.txt // file1_s.txtには実体が無くなる
cat: file1_s.txt: No such file or directory
$ echo "file1 revive" > file1.txt // file1.txtの新規作成
$ cat file1.txt  // file1.txtの中身
file1 revive
$ cat file1_s.txt // file1_s.txtの中身(新しく作られたfile1.txtと同じ。file1.txtというファイル名を持つ実体に依存している)
file1 revive

参考