はうすてんぼぶ

コードかいてて疑問に思ったことや、興味あることをつらつらと暇なときに書く場所、ここはそんな場所

iノードとリンク

はじめに

前回に引き続いて、ファイルシステムの勉強。

前回は、ファイルシステムの基礎となるiノードについて触れた。

iノードのところで、ファイル名とiナンバは対になっていて、ファイル名→iナンバ→iノード→データブロック(ファイル実体)、みたいな流れで、ファイルの中身を持ってきていた。

しかし、1つのファイル名からiナンバは一意に定まるが、どうも1つのiナンバからファイル名は一意に定まらないらしい。
これは、iノードとリンク処理の関係の話になる。

てなわけで、今回はハードリンク、シンボリックリンクについてやるよー。

参考書はいつもどおり、『Amazon.co.jp: 改訂 新Linux/UNIX入門: 林 晴比古: 本』を使います。

リンク処理

ハードリンク

同じiナンバのファイルが複数できる、ということをハードリンクという。

ファイル名 iナンバ
file1 10
fileA 10

このように、ファイル名は異なっても、同一のiナンバを持つため、はじめににも書いた流れ的に同一のファイル実体を指すことになる。

そして、あるファイル実体に対応しているファイル名数を、リンク数(リンクカウント)と呼ぶ。
このリンクカウントの大事なところは、「値が0になったらファイルを削除する」ということ。
上の表だと、2。

もし、fileAを削除した場合は-1されて、リンクカウントは1になり、file1も削除すると0になってファイルが削除される。

これは「ファイルの削除≠ファイル実体の削除」ということで、
今までずっとそこが=だと思ってた俺は、Unixすげーなーって思うのです。

リンクの貼り方はlnコマンドを用いる。
ハードリンクの場合は、

ln [to] [from]

で、[to]と同一のiナンバを持つ[from]ファイルが作られる。

シンボリックリンク

シンボリックリンクは、「ファイルは作られるけど、そのファイル実体は別のファイル実体を指す」みたいな感じで頭を痛ませる。

シンボリックリンクファイルAの実体にリンクを張ろうとすると新しいファイルBができる。
で、このファイルBファイルAとは別のiナンバを持っているのがハードリンクとは大きく異なる点。

そして、ファイルBの実体を辿るまでの過程でiノードに「これシンボリックリンクだから」みたなことが書いてあって、
さらにファイルBの実体を見ると、「ファイルAを見てね」的なことが書かれている。

そしてそして、それに従ってファイルAでディレクトリにiナンバを問い合わせて、ファイルAのiナンバからファイルAの実体まで参照しにいく感じ。

遠い、やたらファイルAの実体に行くまで遠い。
でも、このシンボリックリンクは以外と役立つこともあるようである。

ちなみにシンボリックリンクの貼り方は、ハードリンクと同じくlnコマンドを用いて、

ln -s [to] [from]

のように、-sオプションを付けて実行すれば良い。

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

ハードリンクは、同一ディレクトリ内でしか張れない、ファイルシステムをまたいだリンクを作成できないことが特徴、というか短所。
これは、別のディレクトリやファイルシステムが同じiナンバを既に使用していた場合、同じiナンバにも関わらず別のファイルを指している、といったことが起きてしまうから。

シンボリックリンクは、そのハードリンクの持つ欠点が無いため、広く使われている。
iナンバに依存せずにファイルへのリンクを張っているため、ファイルシステムが違ってもちゃんと動く。
シンボリックリンクは、WIndowsでいうショートカットとほぼ同様で、ショートカットと同じようにリンク先の実体が削除されるとエラーが起こる点に注意。

じゃあハードリンクってなんのために存在してるんだよ、ってなるけども。
どうもファイル名の呼ばれ方で処理を変えるものがあるらしい。
Linuxのシンボリックリンクとハードリンクはどう使い分けますか.. - 人力検索はてなのNo.2の回答に書かれているが、gzipはその呼ばれ方(gcat、gunziip)で処理を変える、とのこと。

おわりに

とまぁこんな感じでUnixファイルシステムのiノードに関する箇所はひとまず終了。

iノードの考え方は、初めてだったけどもシンプルでありながら良くできてるなぁ、といった感想を持った。
それを踏まえたリンクの貼り方も、ハードリンクは結局あまりなんのために存在しているか分からなかったけど、シンボリックリンクは便利!といった感じ。

次はファイルシステムと関連のあるFHSに触れて、Unixファイルシステムに関しては終わりにする。

参考資料

Amazon.co.jp: 改訂 新Linux/UNIX入門: 林 晴比古: 本, p106-p107.
MISTY-NET UNIXコマンド講座, http://cmd.misty.ne.jp/environment/03.html.
UNIXの部屋 コマンド検索: ln, http://x68000.q-e-d.net/~68user/unix/pickup?ln.
Linuxシンボリックリンクとハードリンクはどう使い分けますか.. - 人力検索はてな, http://q.hatena.ne.jp/1265361495, 回答 No.2.