読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】ln と ln -s、どっちも「別名」ちゃうの?ハードリンクとシンボリックリンク【LPICレベル1】

23レスカテゴリ:Linux
1: 名無しさん

ln a.txt b.txt と ln -s a.txt b.txt、どっちでも b.txt から a.txt の中身が読めた
何が違うんや

2: 名無しさん

>>1
先に inode の話から。Linux のファイルは、中身の場所や権限、所有者などを inode という管理データで持ってて、inode には番号がついてる
ファイル名は「この番号の inode を指す名前」にすぎない

3: 名無しさん

>>2
で、2つのリンクはどう違うん

4: 名無しさん

>>3
ハードリンクは、同じ inode にもう1つ名前をつけるだけ。どっちが元ということはなく、2つとも対等な名前
シンボリックリンクは、「a.txt を見て」というパスを中身に持つ、別の小さいファイル

5: 名無しさん

>>4
ls -li で確かめた(日付は省略)
132611 -rw-r--r-- 2 user user 6 a.txt
132611 -rw-r--r-- 2 user user 6 hard.txt
132612 lrwxrwxrwx 1 user user 5 sym.txt -> a.txt
ハードリンクは先頭の inode 番号が同じで、3列目の数が になってる

6: 名無しさん

>>5
その はリンク数。この inode を指してる名前の数
シンボリックリンクのサイズ は、中身の a.txt が5文字やから

7: 名無しさん

じゃあ a.txt を消したらどうなるん

8: 名無しさん

>>7
rm a.txt のあとも、hard.txt はふつうに読める。名前が1つ減って、リンク数が になるだけ
sym.txt は cat: sym.txt: No such file or directory になる。書いてあるパスの先がもうないから
ls -l では sym.txt -> a.txt のまま残ってて、壊れたリンクになる

9: 名無しさん

>>8
ほな中身はいつ消えるん

10: 名無しさん

>>9
リンク数が になって、そのファイルを開いてるプロセスもなくなったとき
rm は名前を消すコマンドで、中身を直接消してるわけではない

11: 名無しさん

それならハードリンクのほうが壊れんし便利やん
シンボリックリンクいらんやろ

12: 名無しさん

>>11
ハードリンクには制限がある。ディレクトリには作れない(ln d d2 は hard link not allowed for directory になる)
それと、別のファイルシステム(別のパーティションやディスク)にはまたげない。inode 番号はファイルシステムごとの番号やから
シンボリックリンクはパスを書いてるだけやから、どっちもできる

13: 名無しさん

>>12
ディレクトリといえば、mkdir d しただけでリンク数が になってた。何も入れてないのに

14: 名無しさん

>>13
d という名前と、d の中の .(自分自身)で2つ
中にサブディレクトリを作ると、その中の .. も d を指すから1つ増える

15: 名無しさん

シンボリックリンクの権限が lrwxrwxrwx で全部許可になってる
誰でも書き換えられるってこと?

16: 名無しさん

>>15
リンク自体の権限は使われない。読み書きのときは、リンク先のファイルの権限で判断される
リンク先が なら、他人はリンク経由でも読めない

17: 名無しさん

ln -s file.txt sub/link でサブディレクトリにリンクを作ったら壊れてた

18: 名無しさん

>>17
相対パスは、リンクを置いた場所から見たパスとして解釈される。今いる場所からではない
sub/link は sub の中の file.txt を探すから見つからん。ln -s ../file.txt sub/link にするか、絶対パスで書く

19: 名無しさん

>>18
リンク先を確認する方法は?

20: 名無しさん

>>19
ls -l で -> の先を見るか、readlink sub/link。たどった先の実体の絶対パスは readlink -f sub/link
シンボリックリンクだけを探すなら find . -type l、同じ inode の名前を探すなら find . -samefile file.txt

21: 名無しさん

ハードリンクとコピーは何が違うん

22: 名無しさん

>>21
cp は新しい inode を作って中身を複製する。片方を書き換えても、もう片方は変わらない
ハードリンクは同じ inode やから、echo more >> h2 で追記すると h1 を読んでも more が出てくる

23: 名無しさん

ハードリンクは同じ中身への2つ目の名前、シンボリックリンクはパスを書いた道しるべ
元を消すと、ハードリンクは残って、シンボリックリンクは壊れる

管理人のひとこと