iノードとは?
ファイルやディレクトリのメタデータがファイルごとに格納されている領域のことである。メタデータは以下の内容のことである。
- メタデータの内容
- ファイルの所有者
- パーミッション
- ファイルサイズ
各ファイル、ディレクトリは固有のiノードが割り当てられる。システム上はこのiノード番号でファイルやディレクトリを識別している。
ハードリンク
ハードリンクは、1つのiノード番号に複数のファイル名を結びつける仕組みである。
仕組み
- ハードリンクを作成すると、新しいファイル名が作られるが、それは既存のファイルと全く同じiノード番号を指す。そのため、ハードリンクの作成元とハードリンクしたファイルを区別することはできない。
図1を見ると、file1.txtとfile2.txtは同じiノード番号であり、どちらもデータの中身が”Hello”である。
$ ls -li file1.txt
33714422 -rw-r--r-- 1 user group 6 6月 21 11:00 file1.txt
$ cat file1.txt
Hello!
# ハードリンク作成
$ ln file1.txt file2.txt
# iノードとリンクカウントを確認 (-li)
$ ls -li
33714422 -rw-r--r-- 2 user group 6 6月 21 11:00 file1.txt
33714422 -rw-r--r-- 2 user group 6 6月 21 11:00 file2.txt
- iノード番号が一致している
- リンクカウントが1から2に増えている。
シンボリックリンク
シンボリックリンクは、特定のファイルやディレクトリのパスを内容として持つファイルである。
仕組み
シンボリックリンクを作成すると、作成したそのファイルは新しい固有のiノードを持つ。そのファイルの実データ部分に、リンク先のファイルパスが文字列として記録される。そのため、シンボリックリンクにアクセスすると、そのパスをたどって、目的のファイルにアクセスする
図2を見ると、link.txtとfile1.txtはそれぞれ固有のiノード番号を持っている。link.txtの実データは「path/to/file1.txt」というパス情報であり、file1.txtの実データが「Hello」である。link.txtを読み込むと、システムがパス情報をたどってfile1.txtの内容を表示する。
# シンボリックリンクの作成
$ ln -s file1.txt link.txt
$ ls -li
33714422 -rw-r--r-- 1 user group 6 6月 21 11:00 file1.txt
44556677 lrwxrwxrwx 1 user group 8 6月 21 11:05 link.txt -> file1.txt
- iノード番号が file1.txt (33714422) とは別 (44556677)になっている
- リンクカウントが1
- link.txt -> file1.txt でリンク先パスが表示されている。
リンク元を削除したとき
上記で作成したfile2.txtとlink.txtを使い、リンク元であるfile1.txtを削除した場合について
ハードリンク
file1.txtという名前が消えるだけで、iノード 33714422 は file2.txt によってまだ参照されている。リンクカウントが 2 ⇒ 1 に減るだけである。最後のリンクが削除され、リンクカウントが 0 になった時点で実データが削除される。
# まず、リンク元の file1.txt を削除
$ rm file1.txt
# file2.txt の中身を確認
$ cat file2.txt
Hello!
# file2.txt の iノードとリンクカウントを確認
$ ls -li file2.txt
33714422 -rw-r--r-- 1 user group 6 6月 21 11:00 file2.txt
シンボリックリンク
link.txt に記録されたパス "file1.txt" が指す先がなくなるため参照できなくなる。また、リンク先が名前変更された場合も参照できなくなる。
$ ls -li link.txt
44556677 lrwxrwxrwx 1 user group 8 6月 21 11:50 link.txt -> file1.txt
$ cat link.txt
cat: link.txt: No such file or directory
- catコマンドがエラーを返している。これはfile1.txtが削除されたため、リンク切れの状態になっている