$ 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 목록의 두 번째 필드에는 둘 다 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
최대디렉토리에는 최소한 두 개의 하드 링크가 있습니다. 일반적으로 세 개 이상입니다. 다음 두 명령을 실행하면 세 개의 하드 링크가 있고 foo
물론 모두 동일한 inode를 가지고 있음을 알 수 있습니다(동일한 디렉터리에 대한 링크이므로).
$ mkdir -p foo/bar
$ ls -ldi foo foo/. foo/bar/..
디렉토리는 일반적으로적어도다음 하드 링크:
- 자체(예
foo
: ) - 자체 링크(예
foo/.
: ) foo/bar/..
예를 들어 상위 디렉터리인 각 하위 디렉터리(있는 경우)에서 자신에 대한 링크입니다.
디렉토리 자체에 대한 하드 링크는 해당 내용과 완전히 독립적이며 각 디렉토리의 각 파일에 대한 하드 링크 수와 완전히 별도로 계산됩니다.
답변2
ls
inode 번호와 디렉터리 트리를 표시하는 더 많은 옵션을 사용하면 시각화하기가 더 쉬울 수 있습니다.
$ 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와 해당 데이터 블록을 참조합니다. 하나의 수정 시간과 다른 내용의 수정 시간을 변경하면 네 가지 내용이 모두 변경됩니다. 이러한 내용의 복사본은 하나만 있습니다. 특히, 어느 것이 '오리지널'인지에 대한 개념은 없습니다.모두예.
inode는 하드 링크 수를 보유하므로 파일 관리자는 링크 수가 0에 도달하는 시점을 알 수 있으며, 이 시점에서 데이터에 액세스할 수 없게 되고 다시 여유 공간으로 해제될 수 있습니다. 그러나 인덱스 노드는 이러한 링크의 출처를 기록하지 않습니다. 반면에 디렉터리에는 직계 상위 항목에 대한 링크가 있습니다.