会社の同僚と話題になったハードリンクとシンボリックリンクについてです。linux上ではディレクトリ、ファイルはiノード番号として管理しています。このiノード番号は、重複しないようにカーネルが割り当てます。基本的にlinux内でファイルを扱う場合、ファイル名という概念ではなく、iノード番号でファイルを認識しています。
linuxには、ハードリンクとシンボリックリンクという二つのリンク機能があります。
ハードリンクの挙動をみる。下記のようにtest.txtファイルがあるとします。
lsコマンドの出力の左端にある10889210がiノード番号、ユーザ(hoge)の前に1と表示されているものがリンク数です。
$ ls -il
10889210 -rw-rw-r--. 1 hoge hoge 24 3月 12 20:51 test.txt
ハードリンクを作成する。
$ ln test.txt test1.txt
$ ls -il
10889210 -rw-rw-r--. 2 hoge hoge 24 3月 12 20:51 test.txt
10889210 -rw-rw-r--. 2 hoge hoge 24 3月 12 20:51 test1.txt
↑の出力を見ると、どちらのファイルも同じiノード番号を持っています。またリンク数も2に増えています。
test1.txtに適当に文字を追加して保存してdiffで二つのファイルの差分を見るが差分なし。また、同様にして、test.txtに対して同じことをやっても同じ結果となる。
$diff test.txt test1.txt
↑から分かることは、test.txtとtest1.txtは同じファイルであるということ。どちらか一方がマスターという感覚がないということ。
test1.txtを削除したらどうなるのか?
→test.txtは存在し、リンク数が1になった。
$ rm test1.txt
$ ll
10889210 -rw-rw-r--. 1 hoge hoge 30 3月 12 21:18 test.txt
シンボリックリンクの挙動ををみる。
$ln -s test.txt test1.txt
lsでファイルの詳細情報を見ると、iノード番号が異なることが分かる。また、test1.txtの横に→ test.txtと表示されていることが分かる。
$ ls -il
10889210 -rw-rw-r--. 1 hoge hoge 30 3月 12 21:18 test.txt
10889047 lrwxrwxrwx. 1 hoge hoge 8 3月 12 21:25 test1.txt -> test.txt
シンボリックリンクファイル(test1.txt)を編集して、diffで比較すると差分なし。
マスターファイル(test.txt)を編集して、diffで比較すると差分なし。
マスターファイルを削除した際のシンボリックリンクファイルは?
→アクセスに失敗(新しいファイルとして表示される)
以上より、シンボリックリンクは、マスターのファイル名を利用していることが分かる。
これだけを見るとシンボリックリンクよりハードリンクの方がよい感じがしますが、
ハードリンクがiノード番号を利用していることから、異なるデバイス上では動作しません。一方、シンボリックリンクは、ファイル名を利用しているため、異なるデバイス上でも関係なく動作します。結論としては、用途に合わせて使い分けましょうってことですかね。