ハードリンク生成 [重複]

ハードリンク生成 [重複]
$ ln fun fun-hard
$ ln fun dir1/fun-hard
$ ln fun dir2/fun-hard
$ ls -1
total 16
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir1
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir2
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun-hard

したがって、ファイルfunにはfunの4つのインスタンスがあり、fun-hardリストの2番目のフィールドには両方とも4が含まれます。これは、現在のファイルに存在するハードリンクの数です。

drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir1
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir2

dir1とdir2に2つのファイルfun-hardインスタンスがあるのはなぜですか?単一のハードリンクがありませんか?楽しい - 難しい?

-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun-hard

この4つの面白くて難しい例を詳しく説明できますか?なぜ再発するのですか?

次の場合、dir1とdir2に2つのハードリンクがあります。

-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun-hard

...4つのハードリンクインスタンスがありますが、なぜdir1とdir2も4つのインスタンスではないのですか?

答え1

最大ディレクトリには少なくとも2つのハードリンクがあります。通常3つ以上です。次の2つのコマンドを実行すると、3つのハードリンクがあり、fooもちろんすべてが同じinodeを持っていることがわかります(同じディレクトリへのリンクなので)。

$ mkdir -p foo/bar
$ ls -ldi foo foo/. foo/bar/..

ディレクトリは通常少なくとも次のハードリンク:

  • 自体(例foo:)
  • 独自のリンク(例foo/.:)
  • foo/bar/..たとえば、親ディレクトリである各子ディレクトリ(存在する場合)から自分へのリンクです。

ディレクトリ自体へのハードリンクはその内容から完全に独立しており、各ディレクトリ内の各ファイルのハードリンクの数とは完全に別々にカウントされます。

答え2

lsinode番号とディレクトリツリーを表示するためのより多くのオプションを使用すると、視覚化が容易になります。

$ ls -l --inode --recursive
.:
total 16
6299664 drwxrwxr-x 2 paul paul 4096 Jan 24 10:42 dir1
6299832 drwxrwxr-x 2 paul paul 4096 Jan 24 10:42 dir2
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun-hard

./dir1:
total 4
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun-hard

./dir2:
total 4
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun-hard
$ 

表示されている4つの項目は6299812異なるディレクトリ項目で、すべて同じinodeとそのデータブロックを参照します。 1つの修正時間と他の内容の修正時間を変更すると、4つの内容が全て変更される。これらのコンテンツのコピーは1つだけです。特に、どちらが「オリジナル」なのかという概念はありません。みんなはい。

inodeはハードリンクの数を保持するため、ファイルマネージャはリンク数が0に達した時点を知ることができ、この時点でデータにアクセスできなくなり、空き領域に戻すことができます。ただし、インデックスノードはこれらのリンクのソースを記録しません。一方、ディレクトリには直系の親エントリへのリンクがあります。

関連情報